如何使用 systemd 在 Linux 中正确永久启用 ip 转发?

Uns*_*ced 9 linux-networking linux-kernel systemd

我尝试启用IP转发(间enp0s3tun0接口),并写net.ipv4.ip_forward = 1/etc/sysctl.conf。重启后我有

$ cat /proc/sys/net/ipv4/ip_forward
1
Run Code Online (Sandbox Code Playgroud)

但是转发还是不行。我尝试添加net.ipv4.conf.default.forwarding=1/etc/sysctl.conf。现在重启后我有

$ cat /proc/sys/net/ipv4/ip_forward
1
$ cat /proc/sys/net/ipv4/conf/default/forwarding
1
$ cat /proc/sys/net/ipv4/conf/all/forwarding
1
$ cat /proc/sys/net/ipv4/conf/enp0s3/forwarding
0
$ cat /proc/sys/net/ipv4/conf/tun0/forwarding
0
Run Code Online (Sandbox Code Playgroud)

我无法启用/proc/sys/net/ipv4/conf/enp0s3/forwarding和输入/proc/sys/net/ipv4/conf/tun0/forwardingsysctl.conf因为这些文件在这么早的启动时间不存在:

systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/enp0s3/forwarding', ignoring: No such file or directory
systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/tun0/forwarding', ignoring: No such file or directory)
Run Code Online (Sandbox Code Playgroud)

,更多的tun0是动态接口(可以随时添加和删除)。

如果我手动启用转发enp0s3tun0然后转发按预期工作。

那么,如何正确开启接口转发呢?

PS:Gentoo 内核 4.1.15 和 systemd 226

PPS:如果我没记错的话,前段时间net.ipv4.ip_forward = 1就够了。

Uns*_*ced 5

我终于解决了问题。我使用 systemd(带有 networkd)并且 systemd-221 中引入了关于 ip 转发的新功能:“IPForwarding=” - 见https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS

来自man systemd.network

[网络] 部分选项

...

IP转发=

为网络接口配置 IP 转发。如果启用,网络接口上的传入数据包将根据路由表转发到其他接口。采用布尔参数,或值“ipv4”或“ipv6”,仅启用指定地址系列的 IP 转发,或“内核”,保留现有的 sysctl 设置。这控制了网络接口的 net.ipv4.conf..forwarding 和 net.ipv6.conf..forwarding sysctl 选项(有关 sysctl 选项的详细信息,请参阅 ip-sysctl.txt[1])。默认为“否”。

注意:除非打开这个选项,或者设置为“kernel”,否则不会在这个接口上进行IP转发,即使在内核中全局打开了,使用net.ipv4.ip_forward,net.ipv4.conf。 all.forwarding 和 net.ipv6.conf.all.forwarding sysctl 选项。

所以现在我使用如下的网络文件来启用 ip 转发(每个接口):

# cat /etc/systemd/network/tun0.network
[Match]
Name=tun0

[Network]
IPForward=ipv4
Run Code Online (Sandbox Code Playgroud)

  • 请注意,systemd v228 改变了行为。请参阅https://github.com/systemd/systemd/commit/765afd5c4dbc71940d6dd6007ecc3eaa5a0b2aa1 (2认同)