【LIVA Z】ルータにしてるサーバでのDockerネットワーク設定【Ubuntu18.04】
engetu21.hatenablog.com
で、docker runするときに pオプションでポート番号を指定してましたが、Dockerを入れたLIVA Zはiptablesでルータ(Firewall設定)にしてる代物なので、これでは困ることに気づきました。
というのも、pオプションで設定したポートに関しては、設定すれば勝手にiptabelsにChainを作り、そのポートが叩かれたら「どのネットワークからの通信でも」Dockerに流すようにセッティングを変えてしまうらしい(デフォルトの仕様)。
qiita.com
これがルータサーバで作用すると、インターネットからポートにアクセスされた場合もどうぞどうぞと招いてしまうので、悪い人に悪いことをされちゃうわけですね。
pオプションを使わない場合は、後からポート設定することは可能で、これは自力でiptablesを設定すればいい。
で、ルータサーバの現状は、iptablesの設定はシェルスクリプトを組んで起動時に実行しているので、そこにDocker用のルーティング設定とインターネットからの該当ポートアクセス規制を組み込めばOK。
しかし、もっと簡単にdocker runのオプションで「--net=host」を設定することで、ホストと同様のネットワーク設定で動くようになるとのこと。
--net=hostを付けなかった場合は、iptablesでFORWARD設定等が必要になりますが、--net=hostの場合はINPUT/OUTPUT設定で制御できるようになり、個人的にはこちらのほうが管理しやすいので、--net=hostでの設定を採用します。
Dockerのネットワークについては、こちらで詳しく記載されていました。
qiita.com
1.--net=hostオプションを付けてコンテナの再構築
元々あったコンテナを削除し、昨日のブログでも書いた、自作イメージからコンテナを再構築します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df8293948e68 ubuntu:18.04 "/bin/bash" 3 days ago Exited (0) 3 days ago ubuntu18.04-Asterisk
$ docker rm df8293948e68
df8293948e68
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
※コンテナ無し
$ docker run -it -d --name ubuntu18.04-Asterisk --net=host asterisk
ff7596c64b24...
$ docker exec -it ubuntu18.04-Asterisk /bin/bash
# whereis asterisk
asterisk: /usr/sbin/asterisk /usr/lib/asterisk /etc/asterisk /usr/include/asterisk /usr/include/asterisk.h /usr/share/man/man8/asterisk.8
あっという間に環境復元。これは楽・・・。
ネットワークがホストになっているかは「docker network inspect」コマンドで見られます。
$ docker network inspect host [ { "Name": "host", "Id": "8add9139014f(略)", "Created": "2019-06-01T23:45:58.08816873+09:00", "Scope": "local", "Driver": "host", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "<span style="color: #ff0000">ff7596c64b(略): { "Name": ubuntu18.04-Asterisk",</span> "EndpointID": "90b75801ed376a1(略)", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
Dockerで自動で作られるネットワークは以下のコマンドの通り。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
46758297af06 bridge bridge local
8add9139014f host host local
d11e638cdb4c none null local※赤文字部分はdocker network inspectで出力されたIDと同じになっている
あとはiptablesでINPUT/OUTPUTを設定するだけ。
とはいえ、時間が厳しいので設定はまた後日。