我正在使用 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 网络的一部分。)