假设我有一台 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
在您的网络连接中。
我希望我写的能够让人理解。