在 Debian Stretch 上通过 dhcp 配置多个接口,设置默认路由

在 Debian Stretch 上通过 dhcp 配置多个接口,设置默认路由

在具有多个接口的 Debian Stretch 系统上,我需要通过特定接口定义默认路由ens3。此接口10.33.34.2通过 dhcp 接收其 ip 地址。

我根据自己的需要调整了以下指南:

5.3. 没有 GUI 的现代网络配置

/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扩展其中列出所有不能接受默认路由的接口。

相关内容