我有一台 Ubuntu 系统,其以太网接口 (eth0) 连接到一台充当 DHCP 服务器的路由器,提供默认路由。但是,我已将 eth0 设置为使用静态地址并忽略路由,因为我想运行一个脚本来测试路由器是否具有连接性,并且仅在有连接时才通过它添加默认路由。但每当我打开接口时,我都会看到指向它的默认路由:
default via 192.168.100.1 dev eth0
奇怪的是,此路由没有 src、metric 或 proto 字段。更奇怪的是,它时有时无 - 重复调用ip route
有时会显示它存在,有时则不存在。
完整输出ip route
如下 - 目前我有一个 WiFi 接口,并提供默认路由,当以太网连接的路由器没有连接时,我想使用它。删除路由没有帮助 - 它只是重新出现。
有什么线索可以解释为什么会出现这条虚假路线吗?
default via 192.168.100.1 dev eth0
default via 192.168.1.254 dev wlan0 proto dhcp src 192.168.1.67 metric 600
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.0.0/22 dev wlan0 proto kernel scope link src 192.168.1.67
192.168.1.254 dev wlan0 proto dhcp scope link src 192.168.1.67 metric 600
192.168.96.0/24 dev bond-lan0 proto kernel scope link src 192.168.96.254
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.100
Netplan 配置是:
network:
version: 2
ethernets:
eth0:
addresses: [192.168.100.100/24]
dhcp4: no
dhcp4-overrides:
use-dns: no
use-routes: no
eth1:
dhcp4: no
addresses: []
eth2:
addresses: []
dhcp4: no
bonds:
bond-lan0:
interfaces: [eth1, eth2]
addresses: [192.168.96.254/24]
parameters:
mode: 802.3ad
mii-monitor-interval: 1
wifis:
wlan0:
dhcp4: yes
dhcp6: yes
dhcp4-overrides:
use-dns: no
dhcp6-overrides:
use-dns: no
运行ip mon route
结果如下:
Deleted 192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.100
Deleted broadcast 192.168.100.255 dev eth0 table local proto kernel scope link src 192.168.100.100
Deleted local 192.168.100.100 dev eth0 table local proto kernel scope host src 192.168.100.100
local 192.168.100.100 dev eth0 table local proto kernel scope host src 192.168.100.100
broadcast 192.168.100.255 dev eth0 table local proto kernel scope link src 192.168.100.100
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.100
default via 192.168.100.1 dev eth0
Deleted 192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.100
Deleted broadcast 192.168.100.255 dev eth0 table local proto kernel scope link src 192.168.100.100
Deleted local 192.168.100.100 dev eth0 table local proto kernel scope host src 192.168.100.100
local 192.168.100.100 dev eth0 table local proto kernel scope host src 192.168.100.100
broadcast 192.168.100.255 dev eth0 table local proto kernel scope link src 192.168.100.100
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.100
default via 192.168.100.1 dev eth0
Deleted 192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.100
不断重复。
答案1
我似乎已经解决了这个问题。首先,背景:
我正在使用netplan
,systemd-networkd
因此通过编辑/etc/netplan/50-network.yaml
、运行来配置 ,netplan apply
更新 下的文件,/run/systemd/network/
由 读取systemd-network
。据我所知,所有这些都取代了 中的文件/etc/network/interfaces.d
,这些文件不受 netplan 的影响。
但是,它似乎ifup
仍然读取这些文件并运行,dhclient
因为它认为该接口是 dhcp 客户端。在 Ubuntu 安装期间,该目录中创建了一些文件,这些文件标记eth0
为 dhcp 模式。
因此我删除了下面的文件/etc/network/interfaces.d/
,并且在系统重启后,虚假路线不再被应用。
答案2
调查使用:
ss -f netlink "src = rtnl"
列出主动连接到的进程rtnetlink这是用于添加/删除路由(以及 IP 地址和其他内容)的主要 Linux 界面。systemctl status <pid>
确定某个(正在运行的)进程属于哪个服务 – 例如“ip route add”的父进程。
从您的 extrace/forkstat 结果来看,似乎您有两个网络客户端并排运行 - systemd-networkd(作为 netplan 的一部分)和 dhclient(可能是 ifupdown 或 NetworkManager 的一部分)等。
可能发生的情况:
- dhclient 获取租约并添加路由;
- systemd-networkd(Netplan 使用的后端)默认删除所有“外部”路由;
- dhclient 更新租约并添加路由;
- systemd-networkd 删除“外部”路由;
- 重复
没有是proto ...
正常的——dhclient 用于ip route add
添加路由,并且不费心指定自定义协议值,因此它采用默认值(“proto boot”),并且默认值不会显示在路由列表中(除非您使用,ip -d route
我想)。