在同一子网中具有两个 IP 的路由虚拟机

在同一子网中具有两个 IP 的路由虚拟机

我有两个 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以下是使用和标记数据包来实现此目的的方法:

  1. 删除冲突的静态路由:

    如果希望来自 192.168.1.5 的流量正确到达目的地,请删除冲突的静态路由:

    ip route del 192.168.1.5 via 10.10.10.129 dev ens192
    
  2. 配置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
    
  3. 为每个标记创建路由表:

    为每个标记创建两个自定义路由表,这将确定传出接口:

    echo "1 nic1" >> /etc/iproute2/rt_tables
    echo "2 nic2" >> /etc/iproute2/rt_tables
    
  4. 为每个路由表添加路由:

    现在,将路由添加到两个自定义路由表,指定传出接口和网关:

    对于表“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
    
  5. 创建ip rule条目以根据标记选择路由表:

    创建根据标记选择路由表的规则:

    对于标记为“1”的流量(ens192):

    ip rule add fwmark 1 table nic1
    

    对于标记为“2”(ens256)的流量:

    ip rule add fwmark 2 table nic2
    
  6. 刷新路由缓存:

    ip route flush cache
    

经过这些更改后,来自 192.168.1.5 的数据包应根据其源接口正确标记,并且应使用相应的路由表和接口进行回复。这应确保来自 192.168.1.5 的流量从其最初发送的同一接口接收回复。

相关内容