为什么我不能添加具有不同网关的路线?

为什么我不能添加具有不同网关的路线?

我正在使用 Linux Centos 7/8。

  • 主网络是92.168.0.1/24
  • 服务器有192.168.0.70

该服务器连接到一个交换机,该交换机允许我访问不同的子网。

我想10.50.0.0/24使用其网关访问不同的子网10.50.0.254,但由于要求,我需要将源 IP 设置为172.16.0.10

为此,我172.16.0.10为 eno0 接口分配了第二个 IP。

添加 IP 不是问题:ip addr add 172.16.0.10 dev eno0

尽管如此,添加路线ip route add 10.50.0.0/24 via 10.50.0.254 src 172.16.0.10会返回RTNETLINK answers: Network is unreachable

奇怪的是,我没有用 tcpdump 看到 ARP……它怎么知道网络不可达?!

为什么?我该如何添加此路线?

答案1

它怎么知道网络不可达?!

因为你还没有到 10.50.0.254 的直接路由。系统不知道使用哪个接口到达网关本身。

您需要指定网关的其他地址 – 位于您子网中的地址。(网关将有多个地址,每个地址来自其所属的每个网络。)

  • 例如,如果您是 192.168.0.70/24,并且网关在其一个接口上有 192.168.0.50/24,在另一个接口上有 10.50.0.254/24,那么您的路由需要是:

    ip route add 10.50.0.0/24 via 192.168.0.50
    
  • 如果网关物理上位于第 2 层网络上,但对于一些原因是没有来自您子网的地址(假设您有 2 个不同的子网共享同一个 VLAN),那么使用它所具有的任何地址,只要地址就在你这边。

    在这种情况下,您需要指定onlink标志以强制 Linux 接受路由,或者首先为该地址添加设备路由。(有时来自任何接口可以工作,但并非所有网关都会响应“错误”接口 IP 地址的 ARP 请求。)

    假设您的以太网由于某种原因同时具有 192.168.0.0/24 和 192.168.5.0/24,并且您是 192.168.0.70,但想要使用网关 192.168.5.50。这可以实现:

    ip route add 10.50.0.0/24 via 192.168.5.50 onlink dev eno1
    

    较旧的内核无法识别 IPv4 的“onlink”标志(它最初是为 IPv6 添加的),因此它们需要两条路由,第一条是“直接”路由,声明网关本身(或整个子网)为 on-link:

    ip route add 192.168.5.50/32 dev eno1
    ip route add 10.50.0.0/24 via 192.168.5.50
    
  • 如果网关物理上位于您的第 2 层网络上,但由于某种原因没有任何您这边的 IPv4 地址,可以指定 IPv6 地址作为网关...只要它解析为相同的第 2 层地址:

    ip route add 10.50.0.0/24 via inet6 fe80::a1:b2c3 dev eno1
    
  • 最后,如果网关不是物理上在你的网络中……那么就没有办法通过它添加直接路由,因为路由通过改变第 2 层地址来工作。

    您只能通过以下网关进行路由物理上位于您的网络中,并且这些网关(而不是您)决定将数据包进一步发送到哪里。(隧道有时是绕过此限制的一种选择,但必须明确设置远程网关才能接收隧道数据包。)

    (“源路由”和“段路由”系统为该规则添加了例外,但它们通常不是基本 IP 网络的一部分。)

相关内容