![Странное поведение sysctl на Ubuntu Server 18.04](https://rvso.com/image/913202/%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20sysctl%20%D0%BD%D0%B0%20Ubuntu%20Server%2018.04.png)
Допустим, у меня есть сервер Ubuntu Bionic, на котором я хочу отключить IPv6. (Важно: это не проблема XY, пожалуйста, не пытайтесь угадать, чего я пытаюсь добиться, и не спрашивайте меня, почему я хочу это сделать. Я знаю, насколько хорош и замечателен IPv6, не нужно читать проповеди хору.) Один из способов сделать это — установить следующие sysctls:
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
в вашем сетевом подключении.
Надеюсь, я написал понятно.