下午好!在 Debian 系统上,安装了 docker 17.12.1-ce 服务,并且在同一网络上有 2 个具有相同网关的接口,通过 /etc/iptoute2/rt_tables - T1、T2 中描述的 2 个表工作:
iface eth0 inet static
address 10.10.6.2
netmask 255.255.252.0
# hook scripts
post-up ip route add default via '10.10.6.1' dev eth0 table T1
post-up ip rule add from '10.10.6.2' table T1
post-up ip rule add to '10.10.6.2' table T1
post-up ip route add default via '10.10.6.1' metric 101 dev eth0
post-down ip rule del from 0/0 to 0/0 table T1
post-down ip rule del from 0/0 to 0/0 table T1
第二个接口配置类似,当docker镜像升起时,docker0网桥升起并在系统中添加路由:
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
并且所有数据包都正常从docker向外发送,除了主机接口:eth0和eth1,数据包在172.17.0.1之后立即消失到这些接口的IP地址。在docker的ip上,所有的包也正常通过。将路由添加到表的解决方案
ip route add 172.17.0.0/16 dev docker0 table T1
问题:
- 这是一个正确的决定吗?
- 如何使桥升起时,docker服务本身添加必要的路由?
问题是路由规则在nata 之前起作用。也就是说,这些包的地址为 172.17.0.0。在您的方向舵中,路线是从源地址中选择的。此类路由仅适用于来自主机的流量,但不适用于通过。
解决方案很经典:在 mangle 中标记连接和数据包,按标签路由。
一个高级选项是在两个接口上创建相同的地址,使用 arptables 进行 shamanize 并指定多跳 (multipaf) 路由 - 一个路由中的两个网关。虽然您可以留下 2 个地址并打开伪装。
我开始配置网络参数,由于缺乏对流量的复杂操作和路由规则的 rake,在创建表后,我得出了一个有趣的结论,所有规则都简化为
和 eth1 的类似配置。一切都正常工作:数据包到达 docker,它们也到达它,当 eth0 被禁用时,流量通过 eth1,当 eth1 被禁用时,流量通过 eth0。
这个解决方案有什么缺点吗?