Отключить 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 protocol | listen [::]:80 при ipv6.disable=1 | Удалите listen [::], nginx -t |
sshd: Bind to port 22 on :: failed, не работает X11 | sshd пытается слушать IPv6 | AddressFamily inet |
| Postfix пишет предупреждения об IPv6 | inet_protocols = all | inet_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-local | Ubuntu | Не нужна | Стек в ядре, 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.