systemd-networkd 是否实现了 DHCP 服务器或与 isc-dhcp-server 一起工作?我尝试使用 18.04 LTS 服务器实现网关/路由器。我正在阅读有关 systemd-networkd 服务的手册页。
答案1
我猜我有一段与此相关的新经历 - 我发现的陷阱并没有得到很好的记录。没有以完整的“用户故事”的形式记录下来,从 A 到 Z。因此我做出了这样的回应。
对于特定用例,我的目标是构建一台小型 PC 机作为某种“数据收集器/记录器”,具有两个物理以太网接口,允许您永久连接“带有以太网端口的传感器”,并根据需要可选地连接笔记本电脑。这三台机器将组成一个独立/自给自足的网络,没有与狂野互联网的上行链路连接。“传感器”和笔记本电脑都希望成为 DHCP 客户端,并且笔记本电脑需要与“传感器”位于同一个 L2 网络中,以便进行临时维护(人类操作员/旅行技术人员可能想看看)。
因此,我在一台具有两个物理 LAN 端口的小型 PC 上安装了 Debian Buster 基础系统(我知道,这是一个 Ubuntu 论坛,但我相信我的 gotcha 原则同样适用),然后继续在盒子上配置软桥,为桥接器的内部接口分配静态 IP 地址,并运行绑定到同一桥接接口的 ISC dhcpd。
我以前做过类似的事情,通常只是将所有必要的 brctl 和 ifconfigs 塞进 /etc/rc.local。这一次,因为我想遵循在 Linux 操作系统中配置网络的当前/现代/规范方式,默认情况下使用 systemd,所以我决定使用 systemd-networkd。(我不太喜欢 NetworkManager,它似乎带来了 X 作为实际依赖项......)因此,对于 systemd-networkd,我提出了以下文件集/etc/systemd/network/
:
br0.netdev:
[NetDev]
Name=br0
Kind=bridge
#MACAddress=00:d0:c9:cb:af:df
eth0.网络:
[Match]
Name=eth0
[Network]
Bridge=br0
eth1.网络:
[Match]
Name=eth1
[Network]
Bridge=br0
lan0.网络:
[Match]
Name=br0
# All you need really is either DHCP=ipv4 or the Address= line.
# The rest is optional.
[network]
#DHCP=ipv4
Address=192.168.100.1/24
#Gateway=192.168.100.100
#DNS=192.168.100.1
是的,请大家原谅我,因为我犯了罪:我net.ifnames=0
在内核命令行中添加了内容。
所以我做了所有这些,然后我开始疑惑,为什么我的接口在启动时无法启动。我花了一段时间才意识到我的配置文件中实际上没有任何语法错误。相反,当我试图使我的配置正常工作时,我的 Linux 机器与任何网络断开连接 = 两个以太网端口的链路都断开了。请注意,Linux 软桥的实例还会总结其组成物理端口的链路状态,因此在我的情况下,br0 网络设备也没有处于“运行”状态。
事实证明,systemd-networkd 只会在达到“正在运行”状态时为当前具有链接的接口分配 IP 地址。并且,如上所述,将物理接口隐藏在网桥后面并不能起到解决方法!
事实证明这是我最大的陷阱——因为我做过希望机器在两个以太网端口均未链接的情况下可靠地启动,并启动 br0 接口,并分配 IP 地址。关键原因是 isc-dhcp-server需要启动时,它应该绑定接口上的 IP 地址,否则它会立即终止并出现错误,并抱怨“eth0 没有子网声明(没有 IPv4 地址)”,然后是“未配置为侦听任何接口!”。是的,我确实有INTERFACESv4="br0"
。/etc/default/isc-dhcp-server
就 ISC dhcpd 而言,接口不需要处于“运行”状态(链接),但它应该“管理上启动”并分配有 IP 地址。
无论我如何解决问题和配置,我都找不到任何办法(除了破解其源代码)强制 systemd-networkd 在启动时分配 IP 地址,而不管链接状态如何。
因此,过了一段时间,我禁用了 systemd-networkd 服务并返回到已弃用的旧配置文件,即/etc/network/interfaces
:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface, and the physical netdevices.
# Cannot mention br0 right here.
auto lo eth0 eth1
iface lo inet loopback
Allow-hotplug eth0
Allow-hotplug eth1
iface eth0 inet manual
iface eth1 inet manual
#iface br0 inet dhcp
iface br0 inet static
bridge_ports eth0 eth1
bridge_waitport 0
address 192.168.100.1
netmask 255.255.255.0
broadcast 192.168.100.255
#gateway 192.168.100.100
# The netdevice name mentioned in the "auto" command
# may only refer to a netdevice that already exists.
# Thus, auto br0 must follow the declaration of this netdevice.
# Note that for comparison, physical devices exist since kernel boot.
auto br0
这句话说的auto <interface>
是让接口在启动时启动。如果没有这个auto
子句,接口将永远等待“ifup”,并且将处于管理关闭状态。
还有一个问题,与我的要求有关,即机器必须能够在两个以太网断开的情况下启动(并启动 DHCP)。机器会在启动期间挂起,systemd 会等待接口启动。解决方案是:
systemctl disable systemd-networkd-wait-online.service
不确定在仍然使用 systemd-networkd 时是否需要这样做,或者甚至在我恢复到 /etc/network/interfaces 之后是否还需要这样做。
答案2
我认为systemd-networkd
DHCPServer 支持有限,基于https://www.freedesktop.org/software/systemd/man/systemd.network.html#%5BDHCPServer%5D%20Section%20Options
isc-dhcp-server
但是,如果您需要一次微调 DHCP 的多个子网或提供高级 DHCP 选项等,那么您最好使用。
我有一个 LXD 网络,它使用 18.04 容器,该容器通过 为该子网上的所有其他容器提供 DHCP isc-dhcp-server
。它似乎可以与systemd-networkd
DHCPnetplan
客户端配合使用。
请注意任何一个无论您使用哪种情况,DHCP 服务器都应该在 DHCP 池之外有一个静态 IP 地址;这样服务器的行为就一致。