Docker Network - Docker and iptables
iptables
Netfilter というパケット処理のフレームワークが Linux Kernel に組み込まれており、それを操作するツールが iptables である。
iptables では、フィルタリングする対象を選ぶ「テーブル」と、各テーブルにおいて、どのタイミングで処理するかを示す「チェイン」で構成されている。
テーブル
iptables には5つのテーブルがある。
- raw は接続追跡の対象から外れるようパケットを設定するのに使われる
- filter はデフォルトのテーブルで、主としてファイアウォールが備えるべきアクションは全てここで行われる
- nat はネットワークアドレス変換に使われる (例: ポートフォワーディング)
- mangle は特別なパケット変換に使われる
- security は強制アクセス制御のネットワークルールに使われる
チェイン
各テーブルにおいて、どのタイミングで処理を行うかを指定するもの。
インターフェースで受け取られたネットワークパケットは、以下のフローチャートで示された順番でチェインを通過していく。
(from https://www.frozentux.net/ )
上にもある通りだが、 filter テーブルには INPUT, OUTPUT, FORWARD の 3 つの組み込みチェインがあり、 nat テーブルには PREROUTING, POSTROUTING, OUTPUT チェインがある。
iptables | archlinux
https://wiki.archlinux.jp/index.php/Iptables
Docker の iptables 設定 | tiqwablog
https://blog.tiqwab.com/2018/02/12/learniing-iptables.html
Docker のルールより先に iptables ポリシーを追加する
Docker のすべての iptables ルールは、 DOCKER chain に追加される。このテーブルは手動で変更してはならない。
もし Docker のルールがロードされる前に追加する必要がある場合は、 DOCKER-USER chain に追加する。ここに追加されたルールは、 Docker が自動生成するどんなルールよりも先にロードされる。
Docker Daemon に対してコネクションを制限する
デフォルトでは、すべての外部の IP から Docker コンテナに接続できるような設定になっている。特定の IP からのみ受け入れるような設定にするには、 DOCKER filter chain の先頭に拒否ルールを追加する必要がある。
例えば、 192.168.1.1 を除く全ての IP からの受け入れを制限するようなルールを追加する場合は以下の通りとなる。
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP
また、サブネット単位での制限も可能。
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP
特定の IP レンジでの制限も可能。
$ iptables -I DOCKER-USER -m iprange -i ext_if ! --src-range 192.168.1.1-192.168.1.3 -j DROP
-s または --src-range と -d または --dst-range を組み合わせて設定することも可能。
手動で iptables が書き換えられることを防ぐ
手動変更を防ぐために、 /etc/docker/daemon.json にて iptables キーが false にセットされている。
