Ubuntu 20.04 重启后 ip_forward=1 失败

Ubuntu 20.04 重启后 ip_forward=1 失败

我将 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

并重新启动操作系统。

相关内容