子网 1 上的路由器 IP 与子网 2 上的相同主机 IP 冲突

子网 1 上的路由器 IP 与子网 2 上的相同主机 IP 冲突

我正在尝试将一台 Linux 机器设置为以下子网的路由器:

                             +--------------------------------------------+ host3
                             | 路由器 | 10.1.0.254
                             | | |
                             | | |
                             | | |
-----------------------------+ ---+ eth1 eth3 +--- +--------------------+-----
                10.1.0.0/16 | | 10.1.0.254 10.1.0.1 | | 10.1.0.0/16
                子网1 | | | | 子网3
                             | | | |
                             | | 前进 前进 | |
                             | | | |
                             | | | |
-----------------------------+ ---+ eth2 eth4 +--- +-----------------------------
                10.2.0.0./16 | 10.2.0.254 10.2.0.254 | 10.2.0.0/16    
                子网2 | | 子网4        
                             +--------------------------------------------+                

路由器应该:

  • 在子网 1 和 sebnet2 之间转发流量。
  • 在子网3和setnet4之间转发流量。
  • 保持子网 1+2 与子网 3+4 隔离

我已经使用以下方法实现了此设置

  • ip 路由(4 个路由表,每个网卡 1 个)
  • ip 规则(每个网卡都与其自己的路由表相关联)

这种方法效果很好,但有一个例外:

  • 流量在子网 1 和 2 之间转发。
  • 流量在子网 3 和 4 之间转发。
  • 唯一的例外是 host3
    • 它无法发送/接收来自子网 4 的流量
    • 它无法获得 10.1.0.1 的 arp 回复。
    • 它的ip和路由器eth1上的自己的ip相同。
    • 如果我为 host3 在 subnet3 上提供不同的 ip,所有问题都解决了。
      由于超出本文范围的原因,我无法更改其 ip。
      我也无法更改 eth1 的 ip。

通过谷歌搜索类似问题,我找到了本地路由表。

  • 本地路由表有 eth1 ip 的路由条目(自动创建)
  • 该表在系统中具有最高优先级,并且似乎正在劫持 host3 的流量。
  • 我尝试删除此条目 -
    • ip route del table local 10.1.0.254 dev eth1 proto kernel scope host src 10.1.0.254
    • 它解决了这个问题,主机3 可以从子网4 发送/接收流量。
    • 但这不是一个真正的解决方案,因为 eth1 停止回复来自子网 1 的 arp 请求。
      (只要子网 1 主机缓存了其 MAC,就不会被察觉)。

这个问题的正确解决方案是什么?
如何防止本地路由表“耦合”我试图分开的这些 L3 域?
如何在不丢失 arp 功能的情况下禁用本地路由条目?
(eth1-4 仅用于转发,它们本身永远不会成为任何 tcp 流量的目标)

答案1

检查以下方案:

  1. 每个单独的路由域都有一个路由表(您的路由器可以在路由域内转发数据包,而不是在路由域之间转发)。本地路由允许从这些域与路由器本身进行通信。
#域 1 (eth1 + eth2)
ip 路由添加 10.1.0.0/16 dev eth1 表 dom1
ip 路由添加 10.2.0.0/16 dev eth2 表 dom1
ip 路由添加本地 10.1.0.254 dev eth1 表 dom1
ip 路由添加本地 10.2.0.254 dev eth2 表 dom1
#域 2 (eth3 + eth4)
ip 路由添加 10.1.0.0/16 dev eth3 表 dom2
ip 路由添加 10.2.0.0/16 dev eth4 表 dom2
ip 路由添加本地 10.1.0.1 dev eth3 表 dom2
ip 路由添加本地 10.2.0.254 dev eth4 表 dom2
  1. 创建路由规则,分离路由域:
#域 1
ip 规则添加 iif eth1 查找 dom1 pref 101
ip 规则添加 iif eth2 查找 dom1 pref 102
ip 规则添加 oif eth1 查找 dom1 pref 103
ip 规则添加 oif eth2 查找 dom1 pref 104
#域 2
ip 规则添加 iif eth3 查找 dom2 pref 201
ip 规则添加 iif eth4 查找 dom2 pref 202
ip 规则添加 oif eth3 查找 dom2 首选项 203
ip 规则添加 oif eth4 查找 dom2 pref 204
  1. 将优先级为 0 的路由规则移至您的规则下方:
ip 规则从所有查找本地首选项 1000 添加
ip 规则 del pref 0

eth2 和 eth4 接口上的地址重复导致了一些问题。您可以使用 CONNMARK 的 iptables 规则来解决它。

答案2

您可以使用网络命名空间来分离您的网卡。一个用于路由器的左侧,一个用于路由器的右侧。这样您就不需要任何额外的路由表分离。

网络命名空间介绍:https://blogs.igalia.com/dpino/2016/04/10/network-namespaces/

提示:大多数关于网络命名空间的文章都将 veth 接口放入 ns。但您可以将任何类型的网络接口放入命名空间,例如您情况下的物理接口。

相关内容