Как отключить IPv6 в Linux: sysctl, GRUB и NetworkManager

Отключить IPv6 в Linux можно на трёх уровнях. Мягкий способ — параметры sysctl net.ipv6.conf.*.disable_ipv6 = 1 в файле /etc/sysctl.d/99-disable-ipv6.conf: стек остаётся в ядре, но у интерфейсов пропадают IPv6-адреса. Жёсткий способ — параметр ядра ipv6.disable=1 в загрузчике GRUB: IPv6 не инициализируется вовсе. Третий уровень — сетевой менеджер: в NetworkManager ipv6.method disabled, в netplan отказ от DHCPv6, RA и link-local.

Для большинства серверов на Debian 12/13, Ubuntu 24.04 и AlmaLinux / Rocky Linux 9/10 достаточно sysctl. На AlmaLinux и RHEL с NetworkManager Red Hat рекомендует отключать IPv6 в профиле подключения через nmcli. Параметр ядра нужен, когда IPv6 должен исчезнуть полностью, включая ::1 на loopback.

Но сначала стоит ответить на вопрос, нужно ли отключать IPv6 вообще. Часто проблему решает настройка одной службы, а не выключение протокола во всей системе.

Когда отключать IPv6, а когда не надо

Отключение оправдано, если:

  • провайдер не даёт IPv6, а система получает от соседей случайные Router Advertisement и строит маршруты в никуда;
  • политика безопасности требует закрыть неиспользуемый протокол, а настраивать для него межсетевой экран некому;
  • старое ПО ведёт себя некорректно при наличии IPv6 и обновить его нельзя;
  • сервер в изолированной сети, где IPv6 не используется и не планируется.

Отключать не стоит, если:

  • у сайтов на сервере есть записи AAAA в DNS — посетители с IPv6 перестанут открывать сайт;
  • провайдер выдал только IPv6 или NAT64 — пропадёт связь;
  • на сервере Docker, Kubernetes или другие системы, которые рассчитывают на IPv6 внутри хоста;
  • проблема в одной службе. Например, письма с сервера уходят в спам у Gmail через IPv6 из-за отсутствия PTR-записи. Тут правильнее ограничить Postfix протоколом IPv4 или настроить PTR для IPv6, а не ломать стек. Подробнее о требованиях к почтовому серверу — в статье Собственный почтовый сервер: какой выбрать и как не попасть в спам.

Если IPv6 мешает только как «лишняя дверь», закройте его межсетевым экраном (nftables, firewalld, ufw) — это обратимо и не ломает приложения.

Способ 1: sysctl через /etc/sysctl.d/

Создайте отдельный файл. Не дописывайте строки в /etc/sysctl.conf: в Debian 13 systemd-sysctl этот файл больше не читает, локальные настройки должны лежать в /etc/sysctl.d/*.conf. Отдельный файл к тому же проще найти и удалить.

sudo tee /etc/sysctl.d/99-disable-ipv6.conf >/dev/null <<'EOF'
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF

sudo sysctl --system

Что означают строки:

  • all — применить ко всем существующим интерфейсам;
  • default — значение для интерфейсов, которые появятся позже (VLAN, мосты, туннели);
  • lo — loopback, адрес ::1. Если вам нужен ::1 для локальных служб, эту строку можно не добавлять.

Команда sysctl --system перечитывает все файлы из /etc/sysctl.d/, /run/sysctl.d/ и /usr/lib/sysctl.d/ и применяет их сразу, без перезагрузки. Префикс 99- нужен, чтобы ваш файл применялся последним и перекрывал системные значения.

В старой версии этой статьи для CentOS 6 предлагалось выполнить sysctl -a | grep disable >> /etc/sysctl.conf и поменять нули на единицы. Так получался список всех интерфейсов, включая venet0 из OpenVZ. Сегодня перечислять интерфейсы не нужно: хватает all и default.

Особенность: sysctl и NetworkManager

NetworkManager при активации профиля сам управляет IPv6 на своих интерфейсах. Если в профиле IPv6 включён (ipv6.method auto), он может вернуть адреса на интерфейс. Поэтому на AlmaLinux, Rocky Linux и десктопах с NetworkManager дополнительно отключите IPv6 в профиле (способ 3).

Способ 2: параметр ядра ipv6.disable=1

Параметр ipv6.disable=1 в командной строке ядра запрещает инициализацию IPv6. Каталога /proc/sys/net/ipv6 не будет, сокеты AF_INET6 создать нельзя. Это самый радикальный вариант, и от него чаще всего ломаются службы (см. раздел о побочных эффектах).

Debian 12/13 и Ubuntu 24.04

Откройте /etc/default/grub и добавьте параметр в строку GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="ipv6.disable=1"

Если в строке уже есть параметры, добавьте новый через пробел. Затем обновите конфигурацию загрузчика и перезагрузитесь:

sudo update-grub
sudo reboot

AlmaLinux и Rocky Linux 9/10

В RHEL-ветке параметры ядра удобнее менять утилитой grubby. Она правит записи всех установленных ядер сразу:

sudo grubby --update-kernel=ALL --args="ipv6.disable=1"
sudo reboot

Проверить, что параметр попал в загрузочные записи: sudo grubby --info=ALL | grep args. Убрать: sudo grubby --update-kernel=ALL --remove-args="ipv6.disable".

Есть промежуточный вариант ipv6.disable_ipv6=1: модуль загружается, но адреса не назначаются. По смыслу он близок к sysctl, только действует с самого начала загрузки.

Способ 3: NetworkManager (AlmaLinux, Rocky Linux, RHEL)

В профиле подключения есть параметр ipv6.method. Значение disabled отключает IPv6 на этом интерфейсе полностью: NetworkManager не будет принимать RA и назначать адреса, в том числе link-local.

# список профилей
nmcli connection show

# отключить IPv6 в профиле ens18 и применить
sudo nmcli connection modify ens18 ipv6.method disabled
sudo nmcli connection up ens18

Значение ignore работает иначе: NetworkManager просто не трогает IPv6, а ядро продолжит настраивать адреса само. Для отключения нужен именно disabled.

Настройка сохраняется в файле профиля /etc/NetworkManager/system-connections/ens18.nmconnection в секции [ipv6] строкой method=disabled. Повторите команду для каждого профиля. Как устроены профили, nmcli и nmtui, разобрано в статье Настройка сети в AlmaLinux и RHEL 9: nmtui и nmcli.

Способ 4: netplan в Ubuntu 24.04

В netplan нет отдельного ключа «выключить IPv6». Можно только не настраивать его: не запрашивать DHCPv6, не принимать RA и не поднимать link-local IPv6.

# /etc/netplan/50-cloud-init.yaml (имя у вас может отличаться)
network:
  version: 2
  ethernets:
    ens18:
      dhcp4: true
      dhcp6: false
      accept-ra: false
      link-local: [ ipv4 ]

Пустой список link-local: [] отключает link-local-адреса обоих протоколов. Применяйте через sudo netplan try: если что-то пойдёт не так, конфигурация откатится через 120 секунд. Чтобы IPv6 гарантированно не включился на других интерфейсах, netplan дополняют файлом sysctl из способа 1.

Проверка результата

# IPv6-адреса: при отключении вывод пустой
ip -6 addr show

# значения sysctl (1 — отключено)
sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6

# после ipv6.disable=1 этого каталога нет
ls /proc/sys/net/ipv6

# параметры загрузки ядра
cat /proc/cmdline

# никто не слушает на IPv6
ss -tlnp | grep '\['

Примерно так выглядит вывод sysctl после отключения:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Обязательно перезагрузите сервер и проверьте ещё раз. Настройка, которая работает только до перезагрузки, — частая причина «IPv6 опять появился».

Побочные эффекты и как их исправить

Многие службы по умолчанию слушают и IPv4, и IPv6. После отключения IPv6 они либо пишут предупреждения, либо не запускаются.

Postfix

С настройкой inet_protocols = all Postfix при отсутствии IPv6 пишет в лог предупреждения, а при ipv6.disable=1 может не запуститься. Явно укажите только IPv4:

sudo postconf -e 'inet_protocols = ipv4'
sudo systemctl restart postfix

Этот же параметр — правильный способ отправлять почту только по IPv4, не отключая IPv6 в системе.

OpenSSH

Если в /etc/ssh/sshd_config указан ListenAddress ::, sshd не сможет открыть этот адрес. Также ломается проброс X11: sshd пытается открыть сокет на ::1. Решение — ограничить sshd протоколом IPv4:

# /etc/ssh/sshd_config или файл в /etc/ssh/sshd_config.d/
AddressFamily inet
ListenAddress 0.0.0.0

Перед перезапуском проверьте конфигурацию: sudo sshd -t. Затем sudo systemctl restart ssh в Debian/Ubuntu или sudo systemctl restart sshd в AlmaLinux. Не закрывайте текущую сессию, пока не проверите вход из новой.

localhost и ::1

В /etc/hosts обычно есть строка ::1 localhost ip6-localhost ip6-loopback. Если IPv6 на loopback отключён, программы, которые сначала пробуют ::1, получают отказ или задержку при подключении к localhost. Уберите слово localhost из строки с ::1, оставьте его только у 127.0.0.1. В конфигурациях служб пишите 127.0.0.1 вместо localhost, если подключение должно идти по IPv4.

Nginx, Apache, MySQL и другие службы

В стандартном сайте Nginx в Debian и Ubuntu есть строка listen [::]:80 default_server;. При ipv6.disable=1 Nginx не стартует с ошибкой Address family not supported by protocol. Уберите listen [::] из всех конфигураций и проверьте: sudo nginx -t. То же касается Listen [::]:80 в Apache и bind-address = :: в MySQL и MariaDB.

Таблица: симптом, причина, решение

СимптомПричинаРешение
После перезагрузки IPv6 вернулсяНастройка в /etc/sysctl.conf (не читается в Debian 13) или применена только командой sysctl -wФайл в /etc/sysctl.d/, проверка после перезагрузки
sysctl = 1, но адрес на интерфейсе естьNetworkManager включает IPv6 по профилюnmcli connection modify ... ipv6.method disabled
У нового VLAN или моста есть IPv6Не задан default.disable_ipv6Добавьте строку с default
Nginx не запускается: Address family not supported by protocollisten [::]:80 при ipv6.disable=1Удалите listen [::], nginx -t
sshd: Bind to port 22 on :: failed, не работает X11sshd пытается слушать IPv6AddressFamily inet
Postfix пишет предупреждения об IPv6inet_protocols = allinet_protocols = ipv4
Подключение к localhost тормозит или отклоняетсяlocalhost резолвится в ::1Правка /etc/hosts, адрес 127.0.0.1 в конфигурациях
Сайт не открывается у части посетителейВ DNS осталась запись AAAAУдалите AAAA или верните IPv6

Сравнение способов

СпособГде работаетПерезагрузкаЧто остаётся
sysctl в /etc/sysctl.d/Все дистрибутивыНе нужнаСтек в ядре, сокеты :: можно открыть
ipv6.disable=1 в GRUBВсе дистрибутивы; update-grub в Debian/Ubuntu, grubby в AlmaLinuxНужнаНичего, IPv6 недоступен совсем
ipv6.method disabledСистемы с NetworkManagerНе нужнаIPv6 на других интерфейсах и loopback
netplan dhcp6, accept-ra, link-localUbuntuНе нужнаСтек в ядре, IPv6 на неописанных интерфейсах

Частые вопросы

Чем sysctl отличается от ipv6.disable=1?

Sysctl убирает адреса с интерфейсов, но стек IPv6 остаётся в ядре, и программы могут открывать IPv6-сокеты. Параметр ядра ipv6.disable=1 не даёт IPv6 загрузиться вообще. Первый вариант безопаснее для служб, второй надёжнее, если IPv6 не должно быть совсем.

Нужна ли перезагрузка после изменения sysctl?

Нет. Команда sudo sysctl --system применяет файлы из /etc/sysctl.d/ сразу. Но перезагрузку стоит сделать один раз для проверки, что настройка применяется при старте и её не перекрывает сетевой менеджер.

Почему мои строки в /etc/sysctl.conf не работают в Debian 13?

В Debian 13 systemd-sysctl больше не читает /etc/sysctl.conf. Перенесите строки в отдельный файл в /etc/sysctl.d/, например 99-disable-ipv6.conf, и выполните sysctl --system.

Безопасно ли отключать IPv6 на loopback?

В большинстве случаев да, если поправить /etc/hosts и службы, которые слушают ::1. Если сомневаетесь, отключите IPv6 только на внешних интерфейсах и не добавляйте строку net.ipv6.conf.lo.disable_ipv6.

Как вернуть IPv6?

Удалите файл /etc/sysctl.d/99-disable-ipv6.conf и перезагрузитесь, либо выставьте значения 0 командой sysctl -w. Параметр ядра уберите через grubby --remove-args или правкой /etc/default/grub с update-grub. В NetworkManager верните ipv6.method auto.

Влияет ли отключение IPv6 на MAC-адрес и сетевую карту?

Нет. Отключение IPv6 затрагивает только протокол сетевого уровня. Карта, драйвер и MAC-адрес остаются прежними. Если нужно сменить сам MAC, смотрите статью Как сменить MAC-адрес сетевой карты в Linux.