Ubuntu Server 18.04 上奇怪的 sysctl 行为

Ubuntu Server 18.04 上奇怪的 sysctl 行为

假设我有一台 Ubuntu bionic 服务器,我想禁用它的 IPv6。(重要提示:这不是 XY 问题,请不要猜测我想要实现什么,也不要问我为什么要这样做。我知道 IPv6 有多棒,不需要对信徒们说教。)一种方法是设置以下 sysctl:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

使用上述设置手动运行时sysctl,这将禁用主机上的所有 IPv6 网络:

# ip -6 a
#

很好,但这不会在重启后继续存在。使 sysctl 继续存在的推荐方法是将它们放入/etc/sysctl.conf或 中的文件中/etc/sysctl.d。我这样做了,但重启后,IPv6 仍然存在:

# ip -6 addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 <censored>/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 2591985sec preferred_lft 604785sec
    inet6 fe80::250:56ff:feae:c158/64 scope link 
       valid_lft forever preferred_lft forever

然而,sysctl 似乎设置正确:

# sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.lo.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

然而,当我在命令行上将它们设置为相同的值时,IPv6 突然就实际上已禁用:

# sysctl -w net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# ip -6 addr
# 

所以我的问题是:为什么将 sysctls 设置为特定的非默认值/etc/sysctl.d/ 出现根据其本身的输出来做某事sysctl,然而不是是否真的影响了内核的行为?设置 sysctl 和使其生效之间是否存在细微的差别?

我知道这sysctl是一个界面/proc/sys但我也在那里看到了同样的东西:

# cat /proc/sys/net/ipv6/conf/all/disable_ipv6 
1
# ip -6 a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 <censored>/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 2591945sec preferred_lft 604745sec
    inet6 fe80::250:56ff:feae:c158/64 scope link 
       valid_lft forever preferred_lft forever
# echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
# ip -6 a
#

此外,我对此进行了大量研究,这个问题并不是以下任何问题的重复:

答案1

我在 bionic 上做了一个非常糟糕的破解来解决这个问题。正如 steeldriver 提到的,这是一个时间问题。

cp -a /lib/systemd/system/systemd-sysctl.service /etc/systemd/system/

在新文件中我添加Requires=network.target

etc/sysctl.d/50-ipv6.conf创建一个包含内容的文件net.ipv6.conf.all.disable_ipv6 = 1如果你在服务器上使用 NetworkManager,请不要忘记设置 method=ignore

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ip6-privacy=0
method=ignore

在您的网络连接中。

我希望我写的能够让人理解。

相关内容