我将 Ubuntu 20.04 配置为路由器,并安装了 nftables 和 frr(配置了 ospf)。我在不同的网络中配置了两个接口(ens33 和 ens34),在 /etc/sysctl.conf 中配置了转发,net.ipv4.ip_forward=1,在 /etc/systemd/network/ens33.network 中也配置了转发
[Match]
Name=ens33
[Network]
IPForward=1
/etc/systemd/network/ens34.network
[Match]
Name=ens34
[Network]
IPForward=1
netplan 文件:
# This is the network config written by 'subiquity'
network:
version: 2
renderer: networkd
ethernets:
ens33:
mtu: 1300
addresses:
- 10.10.2.1/24
gateway4: 10.10.2.254
nameservers:
addresses:
- 10.10.3.1
search:
- management.int
ens34:
mtu: 1300
addresses:
- 10.10.20.254/24
nameservers: {}
bridges:
br0:
mtu: 1300
addresses:
- 10.10.3.22/32
nameservers: {}
执行命令“systemctl -p”后一切正常,但重启后 ip forward 被禁用(sysctl net.ipv4.ip_forward 的输出为:net.ipv4.ip_forward=0)
答案1
当netplan
生成配置时,它将为每个接口写入一个文件,/run/systemd/network/
格式为:10-netplan-{interface}.network
。之后systemd-networkd
将应用配置。
systemd-networkd
将在 中找到配置文件/run/...
,并在 中找到您的配置文件/etc/...
,然后它将按词汇顺序处理它们。
从www.freedesktop.org/.../systemd.network.html:
所有配置文件都按词汇顺序进行集体排序和处理,无论它们位于哪个目录中。但是,文件名相同的文件会互相替换。
[匹配] 部分选项
网络文件包含一个 [Match] 部分,用于确定给定的网络文件是否可以应用于给定的设备;还有一个 [Network] 部分,用于指定应如何配置设备。将应用与给定设备匹配的第一个网络文件(按词汇顺序),所有后续文件都将被忽略**,即使它们也匹配。
所以现在您可以看到该IPForward
选项永远不会被应用。
现在你需要集中精力解决 sysctl.conf 的问题
从www.freedesktop.org/.../sysctl.d.html:
配置目录和优先级
配置文件按优先顺序从 /etc/、/run/、/usr/local/lib/ 和 /usr/lib/ 目录中读取,如上文概要部分所列。文件必须具有“.conf”扩展名。/etc/ 中的文件将覆盖 /run/、/usr/local/lib/ 和 /usr/lib/ 中同名的文件。/run/ 中的文件将覆盖 /usr/ 下同名的文件。所有配置文件都按其文件名的字典顺序排序,无论它们位于哪个目录中。如果多个文件指定了相同的选项,则按字典顺序排列的最新名称的文件中的条目将优先。因此,某个文件中的配置可能会被完全替换(通过将同名文件放在优先级更高的目录中),或者可能会更改个别设置(通过在稍后排序的不同名称的文件中指定其他设置)。
编辑:
有可能有些应用程序会覆盖sysctl.conf
例如ufw
中的防火墙配置/etc/ufw/sysctl.conf
可能有这样的行,net/ipv4/ip_forward=0
它将优先于/etc/sysctl.conf
。但这不是默认配置,必须手动配置。
答案2
/etc/sysctl.d/99-forward.conf
使用创建文件
net.ipv4.ip_forward=1
并重新启动操作系统。