我有一个接口 enp7s0,地址为 192.168.0.11。
我的路由器是192.168.0.1。
我的路由表是
Ziel Router Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp7s0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp7s0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp7s0
Run Code Online (Sandbox Code Playgroud)
一切正常。我没有设置 iptalbes。
现在我尝试重置路由表并再次设置默认网关。
ip route flush table main
route add default gw 192.168.0.1
Run Code Online (Sandbox Code Playgroud)
冲洗就可以了。但添加失败。
SIOCADDRT: network is unreachable
Run Code Online (Sandbox Code Playgroud)
这里有什么问题??
在 Linux 上,默认情况下(当地址未添加noprefixroute标志时),向接口添加地址会隐式添加一条到 LAN 的路由,其范围为 link。您有一条通往网关的路由,因为可以使用 dev enp7s0访问它:
# ip route
default via 192.168.0.1 dev enp7s0
192.168.0.0/24 dev enp7s0 proto kernel scope link src 192.168.0.11
# ip route get 192.168.0.1
192.168.0.1 dev enp7s0 src 192.168.0.11 uid 0
cache
Run Code Online (Sandbox Code Playgroud)
当您刷新路由时,您还刷新了隐式作用域链接路由:
# ip route flush table main
# ip route
# ip route get 192.168.0.1
RTNETLINK answers: Network is unreachable
Run Code Online (Sandbox Code Playgroud)
因此,您有两种方法可以将其恢复:手动将其添加回来( ),或者将接口关闭然后打开,这将再次触发隐式作用域链接ip route add 192.168.0.0/24 dev enp7s0
路由的添加:
# ip route
# ip link set enp7s0 down; ip link set enp7s0 up
# ip route
192.168.0.0/24 dev enp7s0 proto kernel scope link src 192.168.0.11
# ip route add default via 192.168.0.1
#
Run Code Online (Sandbox Code Playgroud)
唯一的区别是存在proto kernel
作为指示,路由是由内核添加的,而不是手动添加的。所以最好不要使用flush命令(使用delete),或者添加其他过滤器(例如:ip route flush scope global
将保留本地LAN路由)