在我的 Linux 服务器(4.9.9_1 内核,x86_64)中enp5s0
有一个静态 IP 192.168.1.30
,并enp9s0
通过 分配一个地址dhcpcd
。
# ip route ls
default via 192.168.1.1 dev enp5s0 src 192.168.1.30 metric 202
default via 39.53.131.254 dev enp9s0 src 39.53.131.237 metric 203
39.53.130.0/23 dev enp9s0 proto kernel scope link src 39.53.131.237 metric 203
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.30 metric 202
我不明白的第一件事是为什么系统设置了两条默认路线,尽管根据 优先考虑了一条metric
。
我想要做的是删除第二条默认路由via 39.53....
,添加另一个路由表,并ip rule
为其设置添加相同的默认路由,但为新的路由表。
什么时候:
# ip route del default via 39.53.131.254 dev enp9s0
# echo $?
0
但路由表似乎没有改变:
# ip route l
default via 192.168.1.1 dev enp5s0 src 192.168.1.30 metric 202
default via 39.53.131.254 dev enp9s0 src 39.53.131.237 metric 203
39.53.130.0/23 dev enp9s0 proto kernel scope link src 39.53.131.237 metric 203
192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.30 metric 202
之后ip route flush cache
:
# ip route show cache
什么也没显示。
我应该怎么办?
答案1
在 Freenode IRC ##linux 频道上寻求帮助后。由于dhcpcd
负责 的 IP 地址enp9s0
,清除通过该接口的路由的方法是刷新设备:
ip addr flush dev enp9s0
。
答案2
有趣的是,但多年以后,我在 Debian Buster 中遇到了类似的情况。
我的默认路由经常出现问题,原因是 systemd connman.service。
最后我找到了日志:
journalctl -n -u connman.service
br0 {add} route 192.168.1.0 gw 0.0.0.0 scope 253 <LINK>
br0 {add} route 0.0.0.0 gw 192.168.1.1 scope 0 <UNIVERSE>
enp5s0 {add} address 169.254.208.64/16 label enp5s0 family 2
enp5s0 {add} route 169.254.0.0 gw 0.0.0.0 scope 253 <LINK>
enp5s0 {add} route 0.0.0.0 gw 0.0.0.0 scope 253 <LINK>
就这样,互联网消失了。
通过完全删除服务来修复:
systemctl stop connman.service
systemctl disable connman.service
systemctl mask connman.service