【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を設定するだけ。
とはいえ、時間が厳しいので設定はまた後日。