![Ubuntu Server 18.04 での sysctl の奇妙な動作](https://rvso.com/image/913202/Ubuntu%20Server%2018.04%20%E3%81%A7%E3%81%AE%20sysctl%20%E3%81%AE%E5%A5%87%E5%A6%99%E3%81%AA%E5%8B%95%E4%BD%9C.png)
たとえば、IPv6 を無効にしたい Ubuntu bionic サーバーがあるとします。(重要: これは XY 問題ではありません。私が何を達成しようとしているのか推測したり、なぜこれをやりたいのか尋ねたりしないでください。IPv6 がいかに素晴らしく素晴らしいかはわかっています。同調者に説教する必要はありません。) これを実行する 1 つの方法は、次の 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
#
そこで私の質問は、sysctlをデフォルト以外の特定の値に設定すると、/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
ネットワーク接続で。
分かりやすく書けたと思います。