私の目標は、異なるネットワーク上で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
iptables
verboseオプション()を使用して実行すると、下にターゲット参照インターフェイスが-v
表示されます(すぐ下にルールがあります)。DROP
DOCKER-ISOLATION-STAGE-2
br-deadbeef
DROP
br-feedbeef
を使用してルールを追加したので、その-A
ルールはチェーンの一番下に追加されます。DOCKER-ISOLATION-STAGE-1
つまり、ジャンプしてDOCKER-ISOLATION-STAGE-2
優先順位にジャンプすることを意味します。
簡単な修正はルールを追加することです-I
。これによりチェーンの上部に挿入されます。