Ubuntu Server 18.04 上的奇怪 sysctl 行為

Ubuntu Server 18.04 上的奇怪 sysctl 行為

假設我有一個 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

在您的網路連線中。

我希望我寫的可以理解。

相關內容