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

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

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

$ cat /proc/sys/net/ipv4/ip_forward
1

但转发仍然不起作用。我尝试添加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

我无法启用/proc/sys/net/ipv4/conf/enp0s3/forwarding/proc/sys/net/ipv4/conf/tun0/forwarding因为sysctl.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)

,而且tun0是动态接口(可以随时添加和删除)。

如果我手动启用转发enp0s3tun0那么转发就会按预期工作。

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

PS:Gentoo 内核为 4.1.15,systemd 为 226

PPS:如果我没记错的话,不久前net.ipv4.ip_forward = 1就已经足够了。

答案1

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

man systemd.network

[网络] 部分选项

...

IP转发=

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

注意:除非打开此选项或将其设置为“内核”,否则不会在此接口上进行任何 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

相关内容