我正在使用 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 ......它怎么知道网络不可达?!
因为您还没有到 10.50.0.254 的直接路由。系统不知道使用哪个接口来访问网关本身。
您需要指定网关的另一个地址——在您的子网中的那个。(网关将有多个地址,一个来自它所属的每个网络。)
例如,如果您是 192.168.0.70/24,并且网关在其一个接口上有 192.168.0.50/24,在另一个接口上有 10.50.0.254/24,那么您的路由需要是:
如果网关物理上在您的第 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。这可以工作:
较旧的内核无法识别 IPv4 的“onlink”标志(最初是为 IPv6 添加的),因此它们需要两条路由,第一个是“直接”路由,将网关本身(或整个子网)声明为 on-link:
如果网关物理上在您的第 2 层网络上,但由于某种原因您身边没有任何IPv4 地址,则可以将 IPv6 地址指定为网关......只要它被解析到同一层- 2地址:
最后,如果网关实际上不在您的网络中……那么就无法通过它添加直接路由,因为路由通过更改第 2 层地址来工作。
您只能通过网络中物理上的网关进行路由,而这些网关(而不是您)决定将数据包进一步发送到何处。(隧道有时是绕过此限制的一种选择,但必须明确设置远程网关以接收隧道数据包。)
(有“源路由”和“分段路由”系统为这条规则添加了例外,但它们通常不是基本 IP 网络的一部分。)