Dockerネットワーク間のNATの設定

Dockerネットワーク間のNATの設定

私の目標は、異なるネットワーク上で2つのDockerコンテナを実行し、私のホストシステム(Ubuntu 22.04)がNATを実行して、最初のネットワークが2番目のネットワークに接続できるようにすることです。

私の設定:

docker network create network1
docker network create network2

docker run --rm -it --network network1 ubuntu:22.04 bash

# In other terminal
docker run --rm -it --network network2 ubuntu:22.04 bash

最初のコンテナのアドレスは 172.19.0.2 で、2 番目のコンテナのアドレスは 172.20.0.2 です。

私のホストで実行すると、ip addrインターフェイスbr-deadbeefはとですbr-feedbeef

だから私は走る

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i br-deadbeef -o br-feedbeef -j ACCEPT
iptables -A FORWARD -i br-feedbeef -o br-deadbeef -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o br-feedbeef -j MASQUERADE

ホストシステムのルートとして。

しかし、ping 172.20.0.2最初のコンテナから始めるのはうまくいきませんでした。ホストで Wireshark を実行すると、br-deadbeefネットワークに 172.19.0.2 から 172.20.0.2 までの ICMP パケットがありますが、応答がないことが表示されます。

私は何を見逃していますか?

答え1

問題は次のiptables規則にあります。

Chain FORWARD (policy DROP)
target     prot opt source          destination
DOCKER-USER  all  --  anywhere          anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere          anywhere
...

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source          destination
DOCKER-ISOLATION-STAGE2  all  --  anywhere          anywhere
...

Chain DOCKER-ISOLATION-STAGE-2 (3 references)
target     prot opt source          destination
DROP       all  --  anywhere        anywhere
...

Chain DOCKER-USER (1 references)
target     prot opt source          destination
RETURN     all  --  anywhere        anywhere

iptablesverboseオプション()を使用して実行すると、下にターゲット参照インターフェイスが-v表示されます(すぐ下にルールがあります)。DROPDOCKER-ISOLATION-STAGE-2br-deadbeefDROPbr-feedbeef

を使用してルールを追加したので、その-Aルールはチェーンの一番下に追加されます。DOCKER-ISOLATION-STAGE-1つまり、ジャンプしてDOCKER-ISOLATION-STAGE-2優先順位にジャンプすることを意味します。

簡単な修正はルールを追加することです-I。これによりチェーンの上部に挿入されます。

関連情報