并开始注意到重新启动后 sysctl 系统设置不再应用,特别是这些设置/etc/sysctl.d/999-vpn.conf
(也尝试将它们放入99-sysctl.conf
文件中):
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.enx002427fe2be7.rp_filter = 2
这是我的系统日志中的错误:
systemd-sysctl[289]: Couldn't write '2' to 'net/ipv4/conf/enx002427fe2be7/rp_filter', ignoring: No such file or directory
enx002427fe2be7
是我使用的 USB 网络适配器的网络接口名称,我猜测失败的原因可能是因为在命令运行时它尚未初始化sysctl
。
为了解决这个问题,我尝试了一个upstart
脚本,但即使exec sleep 60 && sysctl --system
这样似乎也不起作用。
手动运行sysctl --system
可以修复此问题,但我更希望实现自动化。
修复此问题的正确方法是什么?
使用 Ubuntu 16.04 LTS 服务器版本
答案1
我想到了一些事情:
- ubuntu 16.04
systemd
默认使用 而不是upstart
。因此,您可以尝试编写一个systemd
单元而不是upstart
脚本 如果您使用它
/etc/network/interfaces
来管理您的网络,您可以在您的界面上添加如下一行:up sysctl net.ipv4.conf.enx002427fe2be7.rp_filter=2
并从文件中删除相应的行
/etc/sysctl.d/999-vpn.conf
。如果您使用,则可以在
NetworkManager
其中/etc/NetworkManager/dispatcher.d/
放置脚本,以便在建立连接后执行。当然,您应该在脚本中检查所启动的接口是否确实是您的 USB 适配器。if [ "$1" == 'enx002427fe2be7' ] && [ "$2" == 'up' ] ; then sysctl net.ipv4.conf.enx002427fe2be7.rp_filter=2 fi
或者,您可以将该脚本放入
/etc/network/if-up.d/
。这应该对ifupdown
和都有效NetworkManager
。(来源:https://askubuntu.com/a/14139/726877)。在这种情况下,您不需要该up
行/etc/network/interfaces
。if [ "$IFACE" == 'enx002427fe2be7' ] ; then sysctl net.ipv4.conf.enx002427fe2be7.rp_filter=2 fi
这些只是做同一件事的不同方法:
sysctl
在网络适配器启动并可用时添加网络适配器的设置,但不能更早。