在具有多个接口的 Debian Stretch 系统上,我需要通过特定接口定义默认路由ens3
。此接口10.33.34.2
通过 dhcp 接收其 ip 地址。
我根据自己的需要调整了以下指南:
/etc/systemd/network/route.network
因此,我创建了一个包含以下内容的文件
[Match]
Name=ens3
[Network]
Gateway=10.33.34.1
但是,启动时默认路由设置不正确。
systemd-networkd
我根据启用了调试如何调试 systemd-networkd?
重新启动后systemd-networkd
,我在日志中看到以下内容:
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Setting routes
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Could not set route: Network is unreachable
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Routes set
Aug 21 13:43:13 vpn dhclient[15709]: Listening on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on Socket/fallback
Aug 21 13:43:13 vpn dhclient[15709]: DHCPDISCOVER on ens3 to 255.255.255.255 port 67 interval 8
Aug 21 13:43:13 vpn dhclient[15709]: DHCPREQUEST of 10.33.34.2 on ens3 to 255.255.255.255 port 67
Aug 21 13:43:13 vpn dhclient[15709]: DHCPOFFER of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn dhclient[15709]: DHCPACK of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Adding address: 10.33.34.2/24 (valid forever)
看起来 networkd 尝试在通过 dhcp 分配 IP 地址之前设置路由。
如何使用 systemd 将默认路由设置为特定接口?
== 编辑 ==
我错误地认为 systemd-networkd 会启动这些接口。如果我重启系统,我会看到
$ sudo service systemd-networkd status
● systemd-networkd.service - Network Service
Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor pres
Drop-In: /etc/systemd/system/systemd-networkd.service.d
└─10-debug.conf
Active: inactive (dead)
Docs: man:systemd-networkd.service(8)
因此,配置/etc/systemd/network/route.network
在启动时不起作用。目前,我想知道哪个服务负责启动所有网络设备。
== 编辑 2 ==
本文由 Steven Iveson 撰写提供了有关网络设备如何启动systemd-udevd
以及如何修改接口配置的良好见解。
通过测试和进一步阅读,我还会重述我的问题:多个接口以随机顺序启动。每个接口都获得正确的 dhcp 配置。第一个启动的接口将设置默认路由,因此10.33.34.1
不会始终用作默认路由
答案1
如果全部接口通过默认路由接收有效的 DHCP 提供,那么就无法通过配置dhclient
来忽略这些提供 —— 你不能用、或者任何其他连接到 init 系统的程序来做这systemd
件事udev
。
其中一种方法是这里:你在 的一个“钩子”目录中创建(当然,你也可以使用编辑器)一个 shell 脚本片段dhclient
,
cat << EOF > /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route
## Only the DHCP server talking to ens3 is allowed to give us a default
## route. Other interfaces only get local-segment configuration.
case ${interface} in
ens3)
;;
*)
unset new_routers
;;
esac
EOF
它只会接受 的routers
默认路由选项ens3
。没有时间问题,也没有确定要使用哪些文件的问题,并且该路由仅在启动并收到 DHCP 提供systemd
时才有效。ens3
答案2
对于 Debian Stretch,接口由 udev 命名,基本配置发生在 中/etc/network/interfaces
。如编辑 2 中所述,多个接口按随机顺序启动。每个接口都获得正确的 dhcp 配置。要启动的第一个接口将设置默认路由。我们只需接受所需接口的默认路由。这可以通过钩子实现到dhcpclient
添加新的钩子脚本/etc/dhcp/dhclient-enter-hooks.d/nodefaultroute
:
#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us
case ${interface} in
ens8|ens9)
printf "executing ip route delete default via $new_routers\n"
ip route delete default via $new_routers
;;
*)
;;
esac
可以ens8|ens9
扩展其中列出所有不能接受默认路由的接口。