更改docker容器默认接口

更改docker容器默认接口

我被这个问题困扰了两天。

假设:

  • 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

相关内容