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