iptablesルールを介してDockerコンテナブリッジネットワークのパケットフローを理解していますか?

iptablesルールを介してDockerコンテナブリッジネットワークのパケットフローを理解していますか?

背景 私は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。このように定義されたチェーンとルールを介したパケットの流れは理解できません。

これが今まで私の理解です。

  1. Chain FORWARD最初の規則は、すべての送信元と宛先のすべてのトラフィックがチェーンに送信されることを示していますDOCKER-USER
  2. チェーンにはDOCKER-USER1つのルールしかありません。つまり、すべての送信元から宛先へのすべてのトラフィックは、チェーンに戻る戻り先FORWARDRETURN を持ちます。
  3. 次に、2番目のルールは、すべての送信元と宛先のすべてのトラフィックがチェーンにChain FORWARD送信されることを示します。DOCKER-ISOLATION-STAGE-1
  4. このDOCKER-ISOLATION-STAGE-1チェーンには2つのルールがあります。
    1. ルール1:docker0インターフェイスから独自のインターフェイス(!docker0)以外のインターフェイスへのすべてのトラフィックは、DOCKER-ISOLATION-STAGE-2チェーンに送信されます。
    2. ルール2:他のすべてのトラフィックは元のチェーン(FORWARDやINPUTなど)に戻ります。
  5. このDOCKER-ISOLATION-STAGE-2チェーンにも2つのルールがあります。
    1. ルール1:すべてのインターフェイスからdocker0インターフェイスへのすべてのトラフィックが破棄されます。
    2. ルール2:他のすべてのトラフィックは元のチェーンに戻ります。

質問 チェーン接続の最初のルールを理解できませんDOCKER-ISOLATION-STAGE-1。 「docker0インターフェイスから独自のインターフェイス(!docker0)を除くすべてのインターフェイスへのすべてのトラフィックがDOCKER-ISOLATION-STAGE-2チェーンに送信されます」とはどういう意味ですか?

もっと正確に知りたいです。

  1. 「docker0インターフェイス」は正確に何を意味しますか?
  2. 最初のルールによってパケットがドロップされるパケットフローのシナリオは何ですか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できます。

編集するおそらくnatiptableも役立ちます

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 は、すべてのコンテナが接続されるデフォルトのイーサネットブリッジです。

おすすめ記事