我有两个 NIC,它们的 IP 位于同一子网中。
IP1:10.10.10.142 - 网关:10.10.10.129 - dev:ens192。IP2:10.10.10.143 - 网关:10.10.10.129 - dev:ens256。
我想要配置到 IP [192.168.1.5] 的静态路由,如下所示:
192.168.1.5 通过 10.10.10.129 dev ens192
192.168.1.5 通过 10.10.10.129 dev ens256
现在我遇到一个问题,当 [192.168.1.5] 发送到 [10.10.10.143] 时,我收到了来自 [10.10.10.142] 的回复。
我该如何修复静态路由以从同一接收 IP 回复?
答案1
Tom Yan,你说得对,我为之前提供的错误信息道歉。我提到的规则在这种情况下没有意义,你对期望行为的观察是正确的。
如果目标是使用与发送原始流量相同的 NIC 和 IP 地址回复来自 192.168.1.5 的流量,那么您确实应该依靠连接跟踪(conntrack
)并适当地标记数据包。
conntrack
以下是使用和标记数据包来实现此目的的方法:
删除冲突的静态路由:
如果希望来自 192.168.1.5 的流量正确到达目的地,请删除冲突的静态路由:
ip route del 192.168.1.5 via 10.10.10.129 dev ens192
配置
conntrack
和数据包标记:您可以
iptables
根据数据包离开系统时的源 IP 地址对其进行标记。例如,如果流量来自 192.168.1.5 经由 ens192,则按如下方式对其进行标记:iptables -t mangle -A OUTPUT -s 192.168.1.5 -o ens192 -j MARK --set-mark 1
如果流量来自 192.168.1.5 通过 ens256,则标记如下:
iptables -t mangle -A OUTPUT -s 192.168.1.5 -o ens256 -j MARK --set-mark 2
为每个标记创建路由表:
为每个标记创建两个自定义路由表,这将确定传出接口:
echo "1 nic1" >> /etc/iproute2/rt_tables echo "2 nic2" >> /etc/iproute2/rt_tables
为每个路由表添加路由:
现在,将路由添加到两个自定义路由表,指定传出接口和网关:
对于表“nic1”:
ip route add default via 10.10.10.129 dev ens192 table nic1
对于表“nic2”:
ip route add default via 10.10.10.129 dev ens256 table nic2
创建
ip rule
条目以根据标记选择路由表:创建根据标记选择路由表的规则:
对于标记为“1”的流量(ens192):
ip rule add fwmark 1 table nic1
对于标记为“2”(ens256)的流量:
ip rule add fwmark 2 table nic2
刷新路由缓存:
ip route flush cache
经过这些更改后,来自 192.168.1.5 的数据包应根据其源接口正确标记,并且应使用相应的路由表和接口进行回复。这应确保来自 192.168.1.5 的流量从其最初发送的同一接口接收回复。