Задача: отключить на уровне операционной системы поддержку неприменимого в заданной сетевой конфигурации протокола IPv6.
Не будем здесь о светлом будущем, когда IPv6 повсеместно вытеснит IPv4. На практике ни в одной из сетей, где я работал в течении последних десяти лет (с 2008 по 2018 годы), IPv6 не поддерживался даже на уровне коммутирующего оборудования. В то же время настройки "по умолчанию" Linux-сервисов всё более пронизываются трендом перехода на IPv6, до той степени, что приходится дополнительно тратить время, настраивая нюансы их работы ещё и для протокола, который в производственных условиях не может быть использован за рамками "локальной петли".
Из соображений экономии времени и снижения риска путаницы при конфигурирования сети отключаем невостребованный протокол IPv6.
Отключение IPv6 параметром загрузчика "Grub2".
Элементарно дополняем строку опций загрузки ядра системы параметром выключения IPv6:
# vi /etc/default/grub
....
GRUB_CMDLINE_LINUX="... ipv6.disable=1"
....
GRUB_CMDLINE_LINUX="... ipv6.disable=1"
....
Даём команду пересобрать действующую конфигурацию загрузчика, в "Debian/Ubuntu":
# update-grub
В "Fedora/CentOS/RHEL" команда обновления действующей конфигурации иная, но результат идентичный:
# grub2-mkconfig -o /boot/grub2/grub.cfg
Таким образом я отключал IPv6 на серверах примерно до 2016-го.
Отключение IPv6 посредством "sysctl".
С 2017-го я предпочитаю деактивировать IPv6 следующим способом, без вмешательства в конфигурацию загрузчика операционной системы - безопаснее.
Создаём файл с параметрами конфигурации для ядра системы и перечисляем там флаги выключения IPм6 для всех действующих интерфейсов, всех будущих и, для подстраховки, явно для интерфейса "локальной петли":
# vi /etc/sysctl.d/70-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Применяем заготовленный набор параметров:
# sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf
В "Linux Ubuntu v18" обнаружился забавный "баг", выражающийся в несвоевременной загрузке параметров "sysctl", отчего вышеприведённая конфигурация перекрывается другими подсистемами. Проще всего это обходится дополнительно принудительной установкой необходимых параметров уже после загрузки системного окружения:
# vi /etc/rc.local && chmod ug+x /etc/rc.local
#!/bin/bash
# /etc/rc.local
# The way to bypass the early loading "procps+sysctl" (bug:#50093)
/sbin/sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf
exit 0
# /etc/rc.local
# The way to bypass the early loading "procps+sysctl" (bug:#50093)
/sbin/sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf
exit 0
Дополнительная зачистка упоминаний об IPv6.
Несмотря на то, что модуль поддержки IPv6 может быть и не загрузился после вышеперечисленных манипуляций по его отключению, но в ряде конфигурационных файлов упоминание о протоколе сохранилось - лучше бы их зачистить, чтобы снизить вероятность сбоя восприятия реальности пользовательскими сервисами и приложениями.
В частности, в обязательном порядке деактивируем сопоставления IPv6-адреса и символического имени "локальной петли" в файле локальных сопоставлений IP-адресов и FQDN:
# vi /etc/hosts
....
# Remove IPv6 from list of address mappings (via commenting)
#::1 localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
# Remove IPv6 from list of address mappings (via commenting)
#::1 localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
Проверка успешности выключения IPv6.
В зависимости от выбранного способа, сразу или после перезагрузки операционной системы, можно будет удостовериться в том, что протокол IPv6 действительно выключен следующими командами.
Вывод сведений о текущей конфигурации имеющихся сетевых интерфейсов:
# ip address
Вывод сведений о сетевых интерфейсах и портах, прослушиваемых сервисами и пользовательскими приложениями:
# netstat -apn | grep -i tcp | grep -i listen