我有 2 个带公共 IP 的网卡。我正在运行 2 个服务。那么我该如何路由连接呢?
目前,只有一个接口 IP 可以工作,尽管两个 IP 都可以从互联网上 ping 通。
我的路由表目前是这样的:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.31.128.1 0.0.0.0 UG 0 0 0 eth1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.31.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.31.129.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
那么我应该添加什么才能使其发挥作用呢?
目前,eth1 运行正常,没有任何问题。
答案1
我根据接口名称和“iproute2”的标签假设是 Linux。
这是行不通的,因为仅仅指定一条默认路由就意味着所有传出的流量都将通过该接口,甚至是来自其他接口的请求的响应!
在您的例子中,您说您有公共 IP,但两个直接连接的接口具有私有 IP 地址,因此我假设这意味着您正在进行 NAT。只要您有 NAT,您就不能使用这种类型的三角路由,其中传入和传出的数据包采用不同的路径,因为数据包在传入途中已被 NAT 盒更改,并且需要在传出途中以相同的方式进行更改。您的请求客户端最终会从它不期望的 IP 地址收到数据包,并且无法识别响应。
您需要做的是告诉操作系统,任何从 172.31.128.0/24 接口发起到互联网的 IP 地址的数据包都需要到达 172.31.128.1 的网关,相应地,172.31.129.0/24 子网也是如此。
可以像这样实现:
ip route add 172.31.129.0/24 dev eth0 src 172.31.129.XXX table T1
ip route add default via 172.31.129.1 table T1
ip route add 172.31.128.0/24 dev eth1 src 172.31.128.XXX table T2
ip route add default via 172.31.128.1 table T2
ip rule add from 172.31.129.XXX table T1
ip rule add from 172.31.128.XXX table T2
您需要将 XXX 替换为这些本地子网上的服务器的 IP 地址。
这应该可以让你开始。你可以在以下网址找到有关此主题的更多信息Linux 高级路由和流量控制 HOWTO 第 4.2 节。