我正在努力让网络在 Linux VM 上正常工作。设置后,我有以下内容ifconfig
:
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.190.144 netmask 255.255.0.0 broadcast 172.19.255.255
inet6 fe80::215:5dff:febe:6707 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:be:67:07 txqueuelen 1000 (Ethernet)
RX packets 30629 bytes 3428768 (3.2 MiB)
RX errors 0 dropped 409 overruns 0 frame 0
TX packets 351 bytes 53232 (51.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 78 bytes 6600 (6.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78 bytes 6600 (6.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这个路由表:
# ip route
default via 172.19.190.1 dev eth0 proto static metric 100
172.19.0.0/16 dev eth0 proto kernel scope link src 172.19.190.144 metric 100
通过此设置,我可以 ping 通网关和外部互联网主机,但无法 ping 通 172.19.180.x 子网上的主机,并出现“主机不可达”的情况。
当我手动执行
# ip route add 172.19.0.0/16 via 172.19.190.1 dev eth0
然后一切都按预期进行。我现在将这一行添加到/etc/sysconfig/network-scripts/route-eth0
:
172.19.0.0/16 via 172.19.190.1
重启后,我的路由表如下所示:
# ip route
default via 172.19.190.1 dev eth0 proto static metric 100
172.19.0.0/16 dev eth0 proto kernel scope link src 172.19.190.144 metric 100
172.19.0.0/16 via 172.19.190.1 dev eth0 proto static metric 100
我再次无法访问 172.19.180.x 子网。此方法与手动添加方法的区别ip route add
在于,最后一行proto static metric 100
末尾有,而手动添加方法则没有。
我需要做什么才能使重启后一切正常运行?
更新:这是我的ifcfg-eth0
文件:
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=.... (masked)
DEVICE=eth0
ONBOOT=yes
IPADDR=172.19.190.144
PREFIX=16
GATEWAY=172.19.190.1
DNS1=172.19.190.240
DNS2=172.19.190.242
更新2:
如果我删除第二条路由(... src 172.19.190.144...
)并只保留一条默认路由,那么一切都会正常工作。那么问题就变成了:第二条路由来自哪里,我该如何删除它?
答案1
问题是您有两条到 的路由172.19/16
。由于它们的网络掩码长度相同(16 位),因此第二条路由将覆盖第三条路由。
第三条路线:
172.19.0.0/16 via 172.19.190.1 dev eth0 proto static metric 100
由 添加/etc/sysconfig/network-scripts/route-eth0
。第二个:
172.19.0.0/16 dev eth0 proto kernel scope link src 172.19.190.144 metric 100
有一个proto kernel
,因此它是由配置接口 IP 地址的脚本添加的。
下面我猜你使用的是 Fedora。你用来配置 IP 地址的网络掩码/网络前缀太宽。你需要在文件中添加/etc/sysconfig/network-scripts/ifcfg-eth0
一行,如下所示:
PREFIX=24
更新 2 的答案:当您向接口添加 IP 地址(例如 1.2.3.4)时,也会添加一些路由。具体路由取决于工具:
ip addr
将强制您指定网络前缀(网络掩码的大小)1.2.3.4,否则会收到强烈投诉。如果您执行:ip addr add dev eth0 1.2.3.4/24
,您将获得一条1.2.3.4/24 dev eth0
奖励路由(+ 2 条您看不到的路由,因为它们在local
路由表中,参见ip route show table local
)。ifconfig
如果您未指定网络掩码并添加路由,则会假定您的网络前缀为 241.2.3.4/24 dev eth0
。
因此,对你的问题的直接回答是:这条PREFIX=16
线/etc/sysconfig/network-scripts/ifcfg-eth0
导致第二条路线出现。