Зачем включать IPv6 на сервере (и почему «и так работает» — не аргумент)
IPv6 — это не «экзотика», а нормальный второй стек, который повышает устойчивость доступа к вашим сервисам. У части провайдеров, мобильных операторов и корпоративных сетей IPv6 либо работает стабильнее, либо маршрутизация до него короче, чем до IPv4.
Но dual-stack — это не «поставил галочку». Появляются отдельные задачи: DNS-записи типа AAAA, отдельный фаервол для IPv6 (например, ip6tables или включённый IPv6 в UFW), а также корректное прослушивание портов веб-сервером (listen [::] в Nginx/Apache). И обязательно — проверка клиентского поведения (Happy Eyeballs), чтобы не получить «иногда тормозит».
Ниже — практический чеклист: от проверки адреса и маршрута до типовых проблем, которые всплывают сразу после публикации AAAA.
Базовая проверка: у VDS есть IPv6 и маршрут наружу
Сначала убедитесь, что IPv6 реально назначен интерфейсу и есть маршрут по умолчанию. Панели управления часто показывают «выдан», но это не значит «работает».
ip -6 addr show
ip -6 route show
В корректной конфигурации обычно есть:
- Глобальный IPv6-адрес на интерфейсе (как правило, помечен
scope global), часто /64 или /128. - Дефолтный маршрут вида
default via ...(иногда через link-local шлюз).
Дальше — минимальная проверка связности по IPv6, без зависимости от DNS:
ping -6 -c 3 2606:4700:4700::1111
ping -6 -c 3 2001:4860:4860::8888
Если пинг не идёт — веб-сервер и DNS настраивать пока бессмысленно: сначала решайте адрес/маршрут/фаервол/политики провайдера.

DNS: AAAA-запись, TTL и типовые ловушки
Чтобы домен открывался по IPv6, нужна AAAA-запись, которая указывает на IPv6-адрес вашего сервера. Важно: IPv6 в DNS пишется без квадратных скобок и без портов — только адрес.
Минимально: для example.com и www.example.com заведите AAAA на один и тот же IPv6 (если у вас один фронтенд). Если фронтов несколько — делайте несколько AAAA, как и с A-записями.
Проверка, что AAAA реально резолвится
dig AAAA example.com +short
dig AAAA www.example.com +short
Если в ответ пусто — запись не создана или ещё не разошлась по кешам. Если адрес есть — проверьте, что это именно ваш адрес и он доступен снаружи.
TTL и раскатка
Для миграций полезно заранее уменьшить TTL (например, до 300–600 секунд), чтобы быстрее переключать трафик. После стабилизации верните TTL на разумные значения (например, 3600–14400), чтобы снизить нагрузку на DNS.
Ловушка №1: AAAA есть, а сервис по IPv6 не слушает
Классическая причина «то открывается, то нет»: у части клиентов IPv6 будет предпочтительнее, а на сервере 80/443 по IPv6 закрыты фаерволом или веб-сервер слушает только IPv4.
Ловушка №2: A и AAAA ведут на разные фронты
Если A указывает на один сервер, а AAAA — на другой (или на старый адрес), пользователи по IPv6 будут видеть другой контент/настройки. Синхронизируйте конфигурации и внимательно сверяйте, куда ведут обе записи.
Happy Eyeballs: почему «иногда тормозит» именно из‑за IPv6
Happy Eyeballs — это поведение клиентов, когда при наличии IPv4 и IPv6 они пробуют оба стека почти параллельно и выбирают тот, который быстрее/успешнее. Это снижает риск «не открылось вообще», но не отменяет проблем кривой конфигурации.
Типичная история: по IPv6 порт 443 формально «доступен», но маршрут нестабилен, есть потери или ломается TLS-рукопожатие. Клиент сначала пытается IPv6, теряет время на таймауты, потом переключается на IPv4 — пользователь видит задержку.
Если публикуете AAAA, IPv6 должен быть не просто «включён», а по качеству сопоставим с IPv4: открытые порты, корректные ответы, рабочий ICMPv6 для PMTU и отсутствие регулярных потерь.
Практика: сначала поднимите и протестируйте доступ по IPv6 «по IP», затем добавляйте AAAA, и только потом включайте редиректы/HTTPS-логику, завязанную на домен.
Nginx: включаем IPv6 корректно (dual-stack)
В Nginx поддержка IPv6 обычно есть из коробки, но слушает он только то, что указано в listen. Для dual-stack почти всегда достаточно добавить отдельный listen на [::].
Минимальный пример server-блока для 80/tcp (IPv4 + IPv6)
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example;
index index.html index.htm;
}
Для HTTPS логика аналогичная: listen 443 ssl; и listen [::]:443 ssl; плюс ваши параметры TLS. Если виртуальных хостов много — убедитесь, что нужный vhost имеет IPv6-listen, иначе часть доменов по IPv6 может попадать в «дефолтный» сервер.
Проверяем, что Nginx реально слушает IPv6
ss -lntp | grep -E ':(80|443)\s'
ss -lntp6 | grep -E ':(80|443)\s'
Нюанс: net.ipv6.bindv6only и «двойное» слушание
В Linux IPv6-сокет иногда может принимать и IPv4 (через IPv4-mapped адреса), а иногда — нет. Это зависит от net.ipv6.bindv6only и поведения приложения. Надёжнее явно указывать два listen: для IPv4 и для IPv6.
Если дальше вы будете «дотягивать» безопасность, пригодятся отдельные настройки заголовков. См. разбор про HTTP security headers в Nginx/Apache.
Apache: IPv6 через Listen и VirtualHost
В Apache IPv6 обычно сводится к корректным директивам Listen. Частый рабочий вариант — слушать отдельно IPv4 и IPv6 на нужных портах.
Пример Listen для dual-stack
Listen 0.0.0.0:80
Listen [::]:80
Аналогично для 443. В большинстве случаев удобнее оставить vhost как <VirtualHost *:80> и <VirtualHost *:443> — Apache применит их ко всем слушающим сокетам. Пример (теги только текстом):
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example
</VirtualHost>
Проверка, что Apache слушает IPv6
apachectl -S
ss -lntp | grep -E ':(80|443)\s'
Если IPv6 не слушает при «правильном» конфиге — проверьте, что IPv6 не отключён в системе через sysctl и что сервис перезагружен после изменений.
Firewall: ip6tables и UFW — не забываем про второй стек
Правила для IPv4 и IPv6 — это разные наборы. Открытый 443 в iptables не означает открытый 443 в ip6tables. На этом месте ломается половина внедрений AAAA.
Вариант 1: ip6tables (быстро понять текущее состояние)
ip6tables -S
ip6tables -L -n -v
Если политика входа DROP — нужны явные разрешения на нужные порты и состояния.
Пример базовой «скелетной» политики: loopback, ESTABLISHED,RELATED, ICMPv6 (важно), SSH, HTTP/HTTPS.
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
ICMPv6 нельзя «просто запретить всё». В IPv6 через ICMPv6 работают критичные механизмы, включая PMTU discovery. Полный запрет ICMPv6 часто приводит к странным зависаниям на HTTPS и обрывам при передаче крупных ответов.
Вариант 2: UFW и поддержка IPv6
Если используете UFW — проверьте, включён ли IPv6 в настройках UFW (параметр IPV6). Быстрая проверка статуса:
ufw status verbose
Дальше правила обычно задаются одинаково и применяются к обоим стекам, если IPv6 включён:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload

Проверка снаружи: порты, TLS и реальное поведение клиента
Проверяйте не только «на сервере всё слушает», но и «снаружи реально подключается». Идеально — с отдельной машины/сети, чтобы исключить локальные маршруты.
Проверка порта по IPv6
nc -6 -vz example.com 80
nc -6 -vz example.com 443
Или сразу по IPv6-адресу:
nc -6 -vz 2001:db8::10 443
Проверка HTTP/HTTPS по IPv6
curl -6 -I http://example.com
curl -6 -I https://example.com
Если curl -6 не подключается, но curl -4 работает — почти всегда проблема в фаерволе, прослушивании портов или маршрутизации именно IPv6.
Типовые проблемы и быстрые диагностики
1) «AAAA добавил — сайт стал открываться медленнее»
Обычно это Happy Eyeballs и проблемы на IPv6. Чаще всего причина одна из следующих:
- 80/443 закрыты в
ip6tables/UFW. - Веб-сервер слушает только IPv4.
- Сломан PMTU из-за некорректно фильтруемого ICMPv6.
- Есть потери/асимметрия маршрута по IPv6.
Начните с curl -6 -I, затем проверьте ss -lntp6 и правила ip6tables -L -n -v.
2) «По IPv6 открывается чужой сайт/дефолтная страница»
Часто это означает, что на IPv6 набор vhost отличается или неправильно выбран default vhost. Проверьте, что нужный server_name обслуживается на сокете [::]:80/[::]:443 и что в каждом vhost прописан IPv6-listen (для Nginx) или нужные Listen (для Apache).
3) «SSH по IPv6 не работает, хотя пинг идёт»
Пинг — это ICMPv6, а SSH — TCP/22. Проверьте, что порт 22 открыт в IPv6-фаерволе и что sshd слушает IPv6. В OpenSSH это зависит от AddressFamily (часто по умолчанию any), но надёжнее проверять фактом через ss -lntp.
Мини-чеклист перед публикацией AAAA
- На интерфейсе есть глобальный IPv6 и дефолтный маршрут.
ping -6до внешних адресов проходит.- Веб-сервер слушает
[::]:80и[::]:443. - В
ip6tables/UFW открыты 80/443 (и 22 при необходимости), ICMPv6 не «задушен». curl -6 -I https://example.comвозвращает ожидаемые заголовки/код.- Только после этого добавляйте
AAAAв DNS и мониторьте ошибки/латентность.
Практика эксплуатации: мониторинг и гигиена IPv6
IPv6 часто включают один раз и забывают — пока не прилетает тикет «у части пользователей тормозит». Чтобы не жить в режиме тушения пожаров:
- Добавьте в мониторинг отдельные проверки по IPv6 (TCP/HTTP/HTTPS), а не только «по домену как получится».
- Смотрите access-логи веб-сервера: по IP клиента легко понять, каким стеком пользовались.
- При миграциях не забывайте про AAAA наравне с A.
Если вы только выбираете площадку под проект, удобнее сразу брать VDS с выдачей IPv6 и понятной сетевой схемой: так меньше сюрпризов при раскатке dual-stack.
В итоге правильно настроенный IPv6 даёт реальную пользу: больше покрытие сетей, меньше зависимость от дефицита IPv4 и более предсказуемое подключение у части аудитории.


