ZIM-НИЙ SAAALEЗимние скидки: до −50% на старт и −20% на продление
до 31.01.2026 Подробнее
Выберите продукт

IPv6 в проде: AAAA-записи, конфиг веб‑сервера и файрвол на VDS

Готовим прод к IPv6: адрес на VDS, AAAA в DNS, nginx/Apache на [::]:80/443, безопасный файрволл (nftables/ufw), ICMPv6 и sysctl. Всё пошагово: проверка связности, публикация записей и чек‑лист отката. Без резких движений и таймаутов у пользователей.
IPv6 в проде: AAAA-записи, конфиг веб‑сервера и файрвол на VDS

IPv6 больше не «опция для галочки». Большие провайдеры и корпоративные сети уже предпочитают IPv6, а пользователи мобильного интернета часто приходят к вам именно по нему. Если сайт не слушает IPv6, часть аудитории будет уходить к конкурентам или получать лишнюю задержку из‑за отката к IPv4 через Happy Eyeballs. В этой статье разберём, как аккуратно включить IPv6 на VDS: от адресации и AAAA‑записей в DNS до конфигурации nginx/Apache, файрволла и полезных sysctl.

Зачем включать IPv6 в проде

Поддержка IPv6 повышает доступность и сокращает задержки в ряде сетей, особенно мобильных. Отдельный бонус — избавление от сложностей NAT в цепочке между клиентом и вами: меньше нестабильностей при установлении соединений, точнее геолокация, корректные механизмы PMTUD. Плюс вы получаете огромный адресный простор для будущих задач: адресация контейнеров, изоляция сервисов на уровне подсетей.

IPv6 — это про стабильность, предсказуемость маршрутизации и экономию на костылях. Включайте его, но делайте это управляемо: сначала сеть и файрволл, затем DNS и уже потом трафик.

Что обычно выдаёт провайдер VDS по IPv6

Типовые варианты адресации на виртуальных серверах сегодня такие:

  • Один адрес /128 и шлюз по link‑local (часто fe80::1) на том же интерфейсе. Маршрут по умолчанию строится до link‑local шлюза с указанием интерфейса.
  • Роутируемый префикс /64 (или больше), направленный на ваш основной IPv6. Это удобно, если хотите раздавать адреса контейнерам/подслужбам.
  • Автоматическая конфигурация через SLAAC/RA. На VDS встречается реже, но иногда сеть отдаёт префикс анонсами RA, вы получаете адрес без ручной правки.

Для продовых серверов не используйте «временные адреса» (privacy extensions) на интерфейсе: это уместно для рабочих станций, но серверу нужен стабильный адрес, который вы публикуете в DNS. На Linux это управляется параметром use_tempaddr, о нём ниже.

AAAA‑записи в DNS‑зоне и поток трафика IPv6

Настройка IPv6 на сервере: базовые шаги

Независимо от дистрибутива: убедитесь, что IPv6 не отключён в ядре, корректно задайте адреса/маршруты и сохраните конфиг, чтобы переживал перезагрузку. Проверьте, что модуль IPv6 активен (lsmod | grep ipv6) или просто посмотрите наличие ::1 в ip -6 addr.

Далее добавьте выданный адрес на основной интерфейс, например eth0, и маршрут по умолчанию. Если у вас один /128 и link‑local шлюз, маршрут оформляется с явным интерфейсом. После применения конфигурации проверьте связность: ping -6 до внешнего адреса и traceroute -6 для маршрута.

Важно: не включайте форвардинг IPv6 на обычном веб‑VDS, если вы не роутер. Это упростит безопасность и поведение ядра. Также не блокируйте весь ICMPv6 — без него не работает соседское обнаружение (NDP), фрагментация и PMTUD, а значит, вы «поломаете» IPv6 для части клиентов.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

DNS: AAAA‑записи и что учесть

Чтобы клиенты приходили по IPv6, домен должен иметь AAAA‑запись. В типичной зоне для корня домена и поддоменов добавляются соответствующие строки. TTL выбирайте осознанно: для релиза сначала снизьте, чтобы упростить откат, затем верните стандартный TTL.

; Пример фрагмента зоны
@          3600 IN A     203.0.113.10
@          3600 IN AAAA  2a03:1111:2222:3333::10
www        3600 IN A     203.0.113.10
www        3600 IN AAAA  2a03:1111:2222:3333::10

Если у вас несколько фронтендов, можно добавить несколько AAAA. Клиенты выберут адрес согласно своей политике, а браузеры применяют Happy Eyeballs. PTR (reverse) по IPv6 полезен для почтовых серверов и диагностики, но обычно им управляет провайдер адресного блока. Для веб‑сайта это не критично.

Не публикуйте AAAA до тех пор, пока веб‑сервер не слушает IPv6 и файрволл не пропускает трафик и ICMPv6. Иначе пользователи начнут получать таймауты. Если домен ещё не оформлен или переносите зону, пригодится регистрация доменов.

Проверка публикации и связности

Подтвердить, что запись разошлась, поможет dig AAAA. Проверить доступность по сети можно через ping -6 и curl -6 напрямую к сайту. Для TLS пригодится openssl s_client -connect <host>:443 -6, чтобы увидеть рукопожатие через IPv6.

nginx и IPv6: правильные listen и логи

Современный nginx по умолчанию умеет IPv6: добавьте listen [::]:80 и аналог для 443. В проде обычно оставляют два listen на порт: отдельный для IPv4 и отдельный для IPv6. Параметр ipv6only почти не нужен — используйте явные сокеты на v4 и v6.

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    access_log /var/log/nginx/access.log main;
    error_log  /var/log/nginx/error.log warn;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/ssl/certs/fullchain.pem;
    ssl_certificate_key /etc/ssl/private/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

Если у вас есть обратный прокси или балансировщик, не забудьте указать список доверенных источников для real_ip, включая IPv6‑подсети, чтобы в логах и $remote_addr был адрес клиента, а не прокси.

real_ip_header X-Forwarded-For;
set_real_ip_from 192.0.2.0/24;
set_real_ip_from 2001:db8:1234::/48;
real_ip_recursive on;

Apache и IPv6: Listen и VirtualHost

Для Apache 2.4 достаточно слушать и v4, и v6; виртуальный хост можно объявить как *:80/*:443, чтобы он применился к обоим адресным семействам.

Listen 0.0.0.0:80
Listen [::]:80

Listen 0.0.0.0:443 https
Listen [::]:443 https

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example
    ErrorLog  ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example

    SSLEngine on
    SSLCertificateFile    /etc/ssl/certs/fullchain.pem
    SSLCertificateKeyFile /etc/ssl/private/privkey.pem
</VirtualHost>

Если используете обратный прокси, включите mod_remoteip и добавьте доверенные IPv6‑подсети, чтобы %a в логах отражал реального клиента.

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 192.0.2.0/24
RemoteIPTrustedProxy 2001:db8:1234::/48

Выбираете стек под проект? Посмотрите сравнение веб‑серверов: nginx vs Apache 2025.

Двойной стек nginx/Apache и базовые правила nftables для IPv6

Файрволл для IPv6: минимально безопасный профиль

Ключевая мысль: IPv6 не переносит «дропнуть ICMP целиком». Без ICMPv6 не работают соседское обнаружение (NDP), маршрутизация и MTU‑договорённости. Значит, в политике нужно:

  • Разрешить уже установленные соединения.
  • Разрешить служебный ICMPv6: echo, NDP (Neighbor Solicitation/Advertisement), Router Solicitation/Advertisement, Packet Too Big, Time Exceeded, Parameter Problem.
  • Открыть нужные сервисные порты по TCP/UDP (обычно 80/443 и 22 по SSH).
  • Остальное — дропать с логированием по вкусу.

На современных системах имеет смысл использовать nftables в таблице inet, чтобы одним набором правил закрыть и IPv4, и IPv6. Ниже — срез, фокус на IPv6:

table inet filter {
  sets {
    allowed_tcp_services { type inet_service; elements = { 22, 80, 443 } }
  }

  chains {
    input {
      type filter hook input priority 0;
      policy drop;

      ct state established,related accept
      iif lo accept

      # ICMPv6 базовый набор
      meta l4proto icmpv6 icmpv6 type { echo-request, echo-reply, nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert, nd-router-solicit, packet-too-big, time-exceeded, parameter-problem } accept

      # Разрешить SSH/HTTP/HTTPS на v4 и v6
      tcp dport @allowed_tcp_services accept

      # Остальное — дроп
    }

    forward { type filter hook forward priority 0; policy drop; }
    output  { type filter hook output  priority 0; policy accept; }
  }
}

Если используете UFW, убедитесь, что IPv6 включён в конфиге UFW (IPV6=yes) и перезапустите его. После этого обычные правила будут применяться к обоим семействам.

# Проверить и включить IPv6 в UFW
sudo sed -n 's/^IPV6=.*/&/p' /etc/ufw/ufw.conf
sudo nano /etc/ufw/ufw.conf   # Убедитесь, что IPV6=yes
sudo ufw reload

# Базовые разрешения
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# ICMPv6 UFW обрабатывает политиками, не блокируйте его глобально

Для ip6tables подход аналогичный: разрешить ESTABLISHED/RELATED, пропустить ICMPv6 ключевых типов и открыть сервисные порты. Но в новых развёртках лучше опираться на nftables.

Защита от мелких атак: rate‑limit и TCP‑настройки

Можно ограничить ICMPv6 эхо‑запросы по скорости, чтобы не тратить ресурсы на ping‑флуды, но не трогайте NDP/RA типы. В nftables это правило с limit. Для TCP полезно включить syncookies и разумные очереди — это одинаково для IPv4/IPv6.

# Пример фрагмента для rate-limit echo-request
meta l4proto icmpv6 icmpv6 type echo-request limit rate 10/second burst 20 accept

Полезные sysctl для IPv6 на сервере

Ниже типовой набор для веб‑VDS. Он исходит из предположения, что сервер — не роутер, адрес постоянный, RA не требуется (или уже обработан на этапе конфигурации интерфейса).

# Включить стек IPv6 (на случай, если кто-то пытался отключать)
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

# Не использовать временные адреса на сервере
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0

# Отключить перенаправления
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# Отключить исходящие redirects сервером
net.ipv6.conf.all.send_redirects = 0
net.ipv6.conf.default.send_redirects = 0

# Не форвардим (если вы не роутер)
net.ipv6.conf.all.forwarding = 0

# TCP защитные настройки (общие)
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096

Если ваш адрес выдается через RA/SLAAC и вы хотите принимать анонсы на интерфейсе, accept_ra можно оставить включённым для конкретного интерфейса. На серверах с ручной статикой, наоборот, не полагайтесь на RA и держите маршруты в конфиге сети.

Проверка сервиса по IPv6

Принимайте IPv6 в прод поступательно:

  1. Проверка локально: curl -g -6 http://[<ваш IPv6>]/ и ss -lntp — слушает ли nginx/Apache на [::]:80/443.
  2. Проверка с внешнего узла: ping -6, curl -6, openssl s_client -6 -connect.
  3. Только после этого публикуйте AAAA с пониженным TTL (например, 300 секунд) и увеличьте его через сутки, когда убедитесь, что метрики ошибок не выросли.

Следите за логами. В nginx/Apache адреса клиентов по IPv6 уже отражаются корректно. Для аналитики помните: одно и то же лицо может иметь разные IPv6 префиксы из‑за политик провайдера, поэтому опираться на /128 как на «уникальный идентификатор» не стоит.

TLS по IPv6: нюансы

С точки зрения TLS разницы нет — сертификат привязан к имени хоста, а не к IP. Важно лишь, чтобы фронтенд на [::]:443 обслуживал тот же серверный блок/виртуальный хост, что и IPv4. Для выпуска и автообновления используйте актуальные SSL-сертификаты. Дополнительно укрепите безопасность, включив политики из статьи про заголовки: HTTP security headers.

Типичные ошибки и как их избежать

  • Публикация AAAA до настройки файрволла и веб‑сервера. Итог — таймауты у части клиентов. Рецепт: сначала сервер и сеть, затем DNS.
  • Дроп всего ICMPv6. Итог — ломается NDP/PMTUD, пользователи жалуются на «зависания» и «очень медленно». Рецепт: разрешайте критические типы ICMPv6.
  • Оставили только listen [::]:80 без IPv4 — теряете пользователей старых сетей. Рецепт: держите dual‑stack, если не вынуждены делать только IPv6.
  • Неверный маршрут по умолчанию при /128. Рецепт: используйте link‑local шлюз на нужном интерфейсе.
  • Логи показывают адрес прокси. Рецепт: настройте real_ip в nginx или mod_remoteip в Apache с IPv6‑подсетями.
  • UFW не применяет правила к IPv6. Рецепт: IPV6=yes в конфиге UFW и перезагрузка сервиса.

Чек‑лист релиза IPv6

  • Адреса и маршрут IPv6 добавлены на интерфейс, соединение наружу есть.
  • Файрволл: ESTABLISHED/RELATED пропущены, ICMPv6 базовые типы разрешены, порты 22/80/443 открыты.
  • nginx/Apache слушают [::]:80/443, конфиги протестированы.
  • Системные sysctl применены, временные адреса отключены.
  • AAAA‑записи добавлены с умеренным TTL, PTR настроен по необходимости.
  • Мониторинг проверяет доступность по IPv6, алерты настроены.

После включения держите панели под рукой: доля IPv6, ошибки подключения, рост латентности. Если всё стабильно — поднимайте TTL и считаете релиз состоявшимся. Для оптимизации отдачи статики пригодится разбор кэширующих заголовков: Cache-Control и ETag.

Резюме

Включение IPv6 в проде сводится к трём блокам: адресация и маршрут на сервере, безопасный файрволл с пропуском ключевых ICMPv6, корректная публикация AAAA и настройка веб‑сервера на [::]:80/443. Делайте это последовательно — получите более стабильную доставку трафика, меньше проблем с прокси и быстрее отклик в сетях, предпочитающих IPv6.

Поделиться статьей

Вам будет интересно

IPv6 на сервере: SLAAC vs static, privacy extensions и firewall без сюрпризов OpenAI Статья написана AI (GPT 5)

IPv6 на сервере: SLAAC vs static, privacy extensions и firewall без сюрпризов

Разбираем, как сервер получает IPv6 через SLAAC и почему для продакшена чаще нужен статический адрес. Объясняем privacy extensions ...
MX migration без простоя: dual delivery, TTL, приоритеты и план отката OpenAI Статья написана AI (GPT 5)

MX migration без простоя: dual delivery, TTL, приоритеты и план отката

Перенос почты — это не просто смена MX. В статье — практичный план MX migration без простоя: как заранее снизить DNS TTL, выставит ...
systemd-journald и syslog: хранение, ротация и форвардинг логов в Linux OpenAI Статья написана AI (GPT 5)

systemd-journald и syslog: хранение, ротация и форвардинг логов в Linux

Разбираем, как в Linux устроены логи с systemd-journald и syslog: где хранится journal, как включить Storage=persistent, ограничит ...