我被这个问题困扰了两天。
假设:
- Docker 网络(和接口)命名码头网络类型桥子网172.18.0.0/16
- 两个接口eth0(网关 IP:192.168.1.1,接口静态 IP:192.168.1.100)和eth1(网关IP:192.168.2.1,接口静态IP:192.168.2.100)
- 默认路由通过eth0
我想要的是:
- 来自附加到的容器的传出流量码头网络必须去eth1
我尝试过的:
- 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
使用此设置,当我尝试从连接到 docknet 的容器 (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
按预期工作
编辑:
输出ip -d link show eth1
eth1:mtu 1500 qdisc fq_codel 状态未知模式默认组默认 qlen 1000 链路/以太 00:b0:d6:00:00:00 brd ff:ff:ff:ff:ff:ff 混杂性 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535