为什么我无法添加具有不同网关的路由?

Ale*_*xis 3 networking linux routing

我使用的是 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

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

添加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...它怎么知道网络不可达?!

为什么?我怎样才能添加这条路线?

use*_*686 5

\n

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

\n
\n

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

\n

您需要指定网关的其他地址 \xe2\x80\x93(位于您的子网中的地址)。(网关将有多个地址,它所属的每个网络都有一个地址。)

\n
    \n
  • 例如,如果您的地址为 192.168.0.70/24,并且网关的一个接口上有 192.168.0.50/24,另一接口上有 10.50.0.254/24,则您的路由需要为:

    \n
    ip route add 10.50.0.0/24 via 192.168.0.50\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 如果网关物理上位于您的第 2 层网络上,但由于某种原因没有来自您的子网的地址(假设您有 2 个不同的子网共享同一 VLAN),则使用它具有的任何地址,只要该地址即可地址就在你这边。

    \n

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

    \n

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

    \n
    ip route add 10.50.0.0/24 via 192.168.5.50 onlink dev eno1\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n
    ip route add 192.168.5.50/32 dev eno1\nip route add 10.50.0.0/24 via 192.168.5.50\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 如果网关物理上位于您的第 2 层网络上,但由于某种原因您这边没有任何IPv4 地址,则可以指定 IPv6 地址作为网关...只要它解析到同一层 - 2地址:

    \n
    ip route add 10.50.0.0/24 via inet6 fe80::a1:b2c3 dev eno1\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 最后,如果网关物理上不在您的网络中...那么就无法通过它添加直接路由,因为路由是通过更改第 2 层地址来工作的。

    \n

    您只能通过网络中物理上的网关进行路由,并且这些网关 \xe2\x80\x93 而不是您 \xe2\x80\x93 决定将数据包进一步发送到哪里。(有时可以选择使用隧道来绕过此限制,但必须显式设置远程网关才能接收隧道数据包。)

    \n

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

    \n
  • \n
\n