有一台 linux 机器, 配置了一个 bridge0 网卡,绑定一个物理网卡, ip 为 192.168.20.10. 在上面开了个 fakeip 类型的透明网关虚拟机, ip 为 192.168.20.5, 虚拟机网卡桥接到宿主机 bridge0 网卡.
宿主机上还启用了 docker, docker 使用自定义虚拟网卡 br-xxx.
现在发现个问题: 宿主机 docker 容器无法正常走梯子, 宿主机本身走梯子流量正常. 因为梯子流量走的都是 fakeip, 下面以 7.0.0.11 举例, 抓包发现如下现象:
- 宿主机 docker 容器 ping 7.0.0.11, icmp 流量先到 br-xxx 网卡, 再经过 src nat 从宿主机 bridge0 网卡发出到路由器网关 192.168.20.1. 网关因为配置了 7.0.0.0/8 的路由, 会将流量再转发给 192.168.20.5, 即又发给了 宿主机, 再转到宿主机的透明网关虚拟机. 透明网关虚拟机回复 icmp 报文,
问题出在这里, 抓包发现透明网关的 icmp 响应 目的 mac 是宿主机的 bridge0, 而不是路由器网关, 这就导致 icmp 没办法经过路由器原路 返回到 宿主机, 再返回给宿主机的容器.
而宿主机直接 ping 7.0.0.11 没问题, 报文也是一样的回复路径, 但是由于目的 mac 是宿主机的 bridge0, 也算被宿主机收到了.
感觉有点像 hairpin-nat 这种类型的问题, 请问应该修改哪个环节的配置解决该问题?