![Ubuntu Server 18.04 上的奇怪 sysctl 行為](https://rvso.com/image/913202/Ubuntu%20Server%2018.04%20%E4%B8%8A%E7%9A%84%E5%A5%87%E6%80%AA%20sysctl%20%E8%A1%8C%E7%82%BA.png)
假設我有一個 Ubuntu 仿生伺服器,我希望在其上停用 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
#
很好,但是重啟後這種情況不會持續存在。使 sysctls 持久存在的建議方法是將它們放入/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
然而,sysctls 似乎設定正確:
# 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
我做了一個非常糟糕的駭客來解決仿生學上的這個問題。正如 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
在您的網路連線中。
我希望我寫的可以理解。