私の開発環境では、内部に複数のマイクロサービスを備えたDockerSwarmノードを使用しています。マシンで実行されているマイクロサービスをDocker内で実行されているマイクロサービスと通信させる必要がありますが、パッケージを正しくルーティングするためにいくつかの問題があります。 Dockerサーバーを再起動するとコンテナーのIPアドレスが変わるため、ゲートウェイを使用してパッケージをルーティングしようとしています。これらのルールを使用して、必要なマイクロサービスにpingを実行できます。
sysctl net.ipv4.conf.all.forwarding=1
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 10.0.0.0/24 -j DNAT --to-destination 172.18.0.1
ご覧のとおり、マイクロサービスは10.0.0.0/24ネットワークで実行されており、ゲートウェイのIP172.18.0.1を使用しています。問題は、ルールにどのソースを入れるべきかわからないため、応答パッケージを処理する方法が見つからないことです。
Sudo iptables -t nat -A POSTROUTING -s 172.18.0.1 -j SNAT --to-source IP
パケットにマークを付け、このマークに基づいてソースIPを設定する方法はありますか?正しくルーティングするにはどうすればよいですか?
DNATルールを172.18.0.2を指すように変更しました。これは、Dockerがすべてのノードのポートをマップするために使用するIPであり、すべてのPOSTROUTINGルールを削除し、すべてのパケットにマスカレードのみを追加したためです。
sysctl net.ipv4.conf.all.forwarding=1
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 10.0.0.0/24 -j DNAT --to-destination 172.18.0.2
#delete existent POSTROUTING rule (only the rule at line one)
iptables -t nat -D POSTROUTING 1
#add masquerade rule for all
iptables -t nat -A POSTROUTING -j MASQUERADE
そして、結果のNATテーブルは次のようになりました:
Chain PREROUTING (policy ACCEPT 840 packets, 89942 bytes)
num pkts bytes target prot opt in out source destination
1 606 42480 DOCKER-INGRESS all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
2 353 27496 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
3 9 540 DNAT all -- * * 0.0.0.0/0 10.0.0.0/24 to:172.18.0.2
Chain INPUT (policy ACCEPT 402 packets, 61889 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 20 packets, 1200 bytes)
num pkts bytes target prot opt in out source destination
1 20 1200 DOCKER-INGRESS all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
2 1 60 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 710 44373 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
2 0 0 RETURN all -- ecommerce_br0 * 0.0.0.0/0 0.0.0.0/0
3 0 0 RETURN all -- docker_gwbridge * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-INGRESS (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8089 to:172.18.0.2:8089
2 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8084 to:172.18.0.2:8084
3 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8083 to:172.18.0.2:8083
4 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8082 to:172.18.0.2:8082
5 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8081 to:172.18.0.2:8081
6 8 480 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.18.0.2:8080
7 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8079 to:172.18.0.2:8079
8 3 180 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2181 to:172.18.0.2:2181
9 72 4320 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9092 to:172.18.0.2:9092
10 108 6480 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8761 to:172.18.0.2:8761
11 73 4380 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5432 to:172.18.0.2:5432
12 362 27840 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0