sysctl 无法在启动时应用设置

sysctl 无法在启动时应用设置

我遵循了与此类似的教程https://www.niftiestsoftware.com/2011/08/28/making-all-network-traffic-for-a-linux-user-use-a-specific-network-interface/

并开始注意到重新启动后 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

我想到了一些事情:

  1. ubuntu 16.04systemd默认使用 而不是upstart。因此,您可以尝试编写一个systemd单元而不是upstart脚本
  2. 如果您使用它/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在网络适配器启动并可用时添加网络适配器的设置,但不能更早。

相关内容