背景
私はdockerコンテナネットワーキングとiptablesとの関係を理解し、(コンテナ内の)eth0インターフェイスからデフォルトブリッジdocker0インターフェイスを介してホストのネットワークインターフェイスにパケットがどのように流れるかを大まかに知りたいと思います。現在、デフォルトのDockerコンテナネットワークのiptablesルールとチェーンフィルタリングを理解するのに問題があります。コンテナを実行せずに、コマンドは以下をsudo iptables -t filter -L -v -n
表示します。
$ sudo iptables -t filter -L -v -n
Chain INPUT (policy ACCEPT 108K packets, 12M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
183K 304M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
183K 304M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
107K 301M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
76705 3634K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 98618 packets, 14M bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
76705 3634K DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
183K 304M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
76705 3634K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
183K 304M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
~によると文書、Dockerは、DOCKER-USER
名前付きの2つのカスタムiptablesチェーンを追加し、DOCKER
受信パケットが常にこれら2つのチェーンで最初に確認されるようにします。しかし、それは決して言及されていませんDOCKER-ISOLATION-STAGE-1
。このように定義されたチェーンとルールを介したパケットの流れは理解できません。
これが今まで私の理解です。
- の
Chain FORWARD
最初の規則は、すべての送信元と宛先のすべてのトラフィックがチェーンに送信されることを示していますDOCKER-USER
。 - チェーンには
DOCKER-USER
1つのルールしかありません。つまり、すべての送信元から宛先へのすべてのトラフィックは、チェーンに戻る戻り先FORWARD
RETURN を持ちます。 - 次に、2番目のルールは、すべての送信元と宛先のすべてのトラフィックがチェーンに
Chain FORWARD
送信されることを示します。DOCKER-ISOLATION-STAGE-1
- この
DOCKER-ISOLATION-STAGE-1
チェーンには2つのルールがあります。- ルール1:docker0インターフェイスから独自のインターフェイス(!docker0)以外のインターフェイスへのすべてのトラフィックは、DOCKER-ISOLATION-STAGE-2チェーンに送信されます。
- ルール2:他のすべてのトラフィックは元のチェーン(FORWARDやINPUTなど)に戻ります。
- この
DOCKER-ISOLATION-STAGE-2
チェーンにも2つのルールがあります。- ルール1:すべてのインターフェイスからdocker0インターフェイスへのすべてのトラフィックが破棄されます。
- ルール2:他のすべてのトラフィックは元のチェーンに戻ります。
質問
チェーン接続の最初のルールを理解できませんDOCKER-ISOLATION-STAGE-1
。 「docker0インターフェイスから独自のインターフェイス(!docker0)を除くすべてのインターフェイスへのすべてのトラフィックがDOCKER-ISOLATION-STAGE-2チェーンに送信されます」とはどういう意味ですか?
もっと正確に知りたいです。
- 「docker0インターフェイス」は正確に何を意味しますか?
- 最初のルールによってパケットがドロップされるパケットフローのシナリオは何ですか
DOCKER-ISOLATION-STAGE-2
?
フォローアップ
iptablesの私の理解によると、docker0ネットワーク上のDockerコンテナからのトラフィックが同じネットワーク上の他のコンテナに適していないDOCKER-ISOLATION-STAGE-1
ルールは削除されます。DOCKER-ISOLATION-STAGE-2
これには、Docker ホストまたは外部ネットワークの他のインターフェイスへのトラフィックが含まれます。
DockerコンテナネットワークとIPテーブルの私の理解は正確ですか?
PS ただし、3000、3001に開いたポートを持つ2つのドッカーコンテナを実行した後、DOCKERチェーンが変更されました。
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:3000
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.3 tcp dpt:3001
両方のコンテナは互いにホストをpingできます。
編集するおそらくnat
iptableも役立ちます
sudo iptables -t nat -L -v -n
Chain PREROUTING (policy ACCEPT 2 packets, 168 bytes)
pkts bytes target prot opt in out source destination
5 340 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 47 packets, 3607 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 49 packets, 3775 bytes)
pkts bytes target prot opt in out source destination
110 6860 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:3000
0 0 MASQUERADE tcp -- * * 172.17.0.3 172.17.0.3 tcp dpt:3001
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
1 84 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3000 to:172.17.0.2:3000
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3001 to:172.17.0.3:3001
答え1
問題 DOCKER-ISOLATION-STAGE-1 チェーンの最初のルールを理解できません。 「docker0インターフェイスから独自のインターフェイス(!docker0)を除くすべてのインターフェイスへのすべてのトラフィックがDOCKER-ISOLATION-STAGE-2チェーンに送信されます」とはどういう意味ですか?
あなたは正しいことをしました。
DOCKER-ISOLATION-STAGE-2 リンクを通過する各パケットをルーティングします。コンテナからインターネットへのパケットを制限するための別の規則仕様がある可能性が高いです。
docker0 は、すべてのコンテナが接続されるデフォルトのイーサネットブリッジです。