IPv6 — шестая версия протокола IP с 128-битными адресами. Это решение проблемы исчерпания IPv4. IPv6-адрес выглядит так: 2001:db8::1 — восемь групп из четырёх шестнадцатеричных цифр.
Сравнение IPv4 и IPv6
| Параметр | IPv4 | IPv6 |
|---|---|---|
| Длина адреса | 32 бита | 128 бит |
| Кол-во адресов | ~4.3 млрд | 340 × 10^36 |
| Запись | 192.168.1.1 | 2001:db8::1 |
| NAT | Необходим | Не нужен |
| DHCP | Обязателен | SLAAC (автонастройка) |
| IPSec | Опционально | Встроен |
Чтение IPv6-адресов
# Полная форма
2001:0db8:0000:0000:0000:0000:0000:0001
# Сокращённая (убираем ведущие нули, :: = группы нулей)
2001:db8::1
# Loopback (аналог 127.0.0.1)
::1
# Все адреса (аналог 0.0.0.0)
::
# Примеры с сервисами
::ffff:192.168.1.1 # IPv4-mapped IPv6 address
Настройка IPv6 через Netplan (Ubuntu 22.04+)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp6: false
addresses:
- "2001:db8:1::/64" # ваш IPv6-блок от провайдера
routes:
- to: "::/0"
via: "fe80::1" # IPv6-шлюз провайдера
nameservers:
addresses:
- "8.8.8.8"
- "2001:4860:4860::8888" # Google DNS IPv6
sudo netplan apply
Проверка IPv6-связности
# Ping IPv6
ping6 google.com
ping6 2001:4860:4860::8888
# Показать IPv6-адреса
ip -6 addr show
# Таблица маршрутизации IPv6
ip -6 route show
# Traceroute по IPv6
traceroute6 google.com
Настройка UFW для IPv6
# Включить IPv6 в UFW
# /etc/default/ufw
IPV6=yes
# Разрешить SSH по IPv6
ufw allow in on eth0 to any port 22 proto tcp
sudo ufw reload
:: (all).Частный случай: IPv6-only VPS
Некоторые бюджетные тарифы выдают только IPv6-адрес, без IPv4 вовсе. Исходящие соединения к IPv4-хостам такой сервер устанавливает через NAT64-шлюз провайдера и DNS64-резолвер, который подставляет синтетические IPv6-адреса для доменов, у которых есть только A-запись.
# Проверить, действительно ли сервер IPv6-only
ip -4 addr show | grep inet
# Если строк с inet (IPv4) нет вовсе — исходящий IPv4-трафик идёт только через NAT64
# Указать публичный DNS64-резолвер, если провайдер не подставил свой
nameserver 2001:67c:2b0::4
На таком сервере часть legacy-сервисов, жёстко проверяющих исходящий IPv4-адрес отправителя, может отказывать в соединении — это стоит уточнить у провайдера до заказа тарифа.
Типичные ошибки IPv6 на VPS
| Симптом | Причина |
|---|---|
| connect: Network is unreachable при ping6 | IPv6-адрес не назначен интерфейсу вовсе, либо маршрут по умолчанию для ::/0 не настроен в секции routes |
| RTNETLINK answers: File exists | Адрес уже назначен интерфейсу автоматически через SLAAC и добавляется повторно вручную той же командой |
| sysctl: cannot stat .../disable_ipv6 | IPv6 полностью отключён на уровне ядра параметром ipv6.disable=1 в GRUB — sysctl не находит соответствующий файл в /proc |
| ip -6 addr показывает только fe80::... | Провайдер не выдал глобальный /64-блок или блок не прописан в netplan; link-local адрес существует всегда, даже без реальной IPv6-связности |
| Сайт не открывается по IPv6, хотя ping6 проходит | Веб-сервер явно забиндлен на IPv4-адрес вместо :: (all), нужно сменить адрес прослушивания в конфиге |
Когда IPv6 пока не нужен
- Провайдер VPS ещё не выдаёт IPv6-блок на тариф — без адреса от провайдера настраивать нечего, нужно запрашивать отдельный /64 в поддержке
- Аудитория сайта почти полностью сидит в IPv4-сетях — это видно по логам веб-сервера; включение IPv6 не даст ощутимого эффекта, но добавит поверхность для файрвол-правил
- Используются сторонние сервисы, которые ещё не поддерживают IPv6 (некоторые платёжные шлюзы, legacy API) — для исходящих соединений к ним всё равно нужен IPv4, дуал-стек их не заменяет
- Нет времени продублировать все firewall-правила под IPv6 — незакрытые порты по IPv6 при включённом дуал-стеке создают ложное чувство защищённости, если правила писались только под iptables и IPv4
Проверка результата
Настройка IPv6 тесно связана с базовыми сетевыми понятиями и именем сервера — см. статьи про адресацию IPv4 и про смену hostname. Для веб-сервера дополнительно проверьте настройки в статье про настройку Nginx — слушает ли он на ::.
# Убедиться, что сервер отвечает по IPv6 снаружи
curl -6 -I https://example.com
# Проверить, что порт 80 слушается и на IPv6-сокете тоже —
# в выводе должна быть строка с [::]:80, а не только 0.0.0.0:80
ss -tlnp | grep ':80'