我尝试启用 IP 转发(在enp0s3
和tun0
接口之间)并写入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
是动态接口(可以随时添加和删除)。
如果我手动启用转发enp0s3
,tun0
那么转发就会按预期工作。
那么,如何正确启用接口转发?
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