我为这个问题苦苦挣扎了两天。
假设:
- Docker 网络(和接口)命名码头网类型桥子网172.18.0.0/16
- 两个接口以太网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) ping 8.8.8.8 时,会发生以下情况:
- 172.18.0.2 被转换为 192.168.2.1
- 数据包经过 eth1
- 数据包返回到 eth1,源地址为 8.8.8.8,目标地址为 192.168.2.1
从这里应该会发生从 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
按预期工作