私はこの問題で2日間苦労しました。
仮定:
- Dockerネットワーク(およびインタフェース)の命名端末ネットワークタイプ足サブネット172.18.0.0/16
- 2つのインターフェースイーサネット0(192.168.1.1)及びイーサネット1(192.168.2.1)
- デフォルトパスは次を通過します。イーサネット0
私が望むもの:
- リンクされたコンテナからのトラフィック端末ネットワーク行かなければならないイーサネット1
私が試したこと:
- dockerによって生成されたデフォルトのiptableルールは変更されません。
-A POSTROUTING -s 172.18.0.0/16 ! -o docknet -j MASQUERADE
- 私のルール:
iptables -t mangle -I PREROUTING -s 172.18.0.0/16 -j MARK --set-mark 1
ip rule add from all fwmark 1 table 2
表2は以下の通りである。
default via 192.168.2.1 dev eth1 proto static
この設定を使用してDockernetに接続されているコンテナ(172.18.0.2)で8.8.8.8をpingしようとすると、次のことが発生します。
- 172.18.0.2は192.168.2.1に変換されます。
- パケットはeth1を通過します。
- パケットは送信元アドレス 8.8.8.8 および宛先アドレス 192.168.2.1 を使用して eth1 に返されます。
ここでは、192.168.2.1から172.168.0.2への逆方向の移行が発生する必要がありますが、実行時にこのtcpdump -i any host 8.8.8.8
移行を追跡することはできません。
conntrack -Lも確認しましたが、結果は次のとおりです。
icmp 1 29 src=172.18.0.2 dst=8.8.8.8 タイプ=8 コード=0 id=9 src=8.8.8.8 dst=192.168.2.1 タイプ=0 コード=0 id=9 タグ=0 使用=1
有用な情報:
- eth1は実際に4G USBアダプタです。
- IP転送が有効になっています。
curl --interface eth1 ipinfo.io
期待どおりに動作