Краткий ответ
В Ubuntu постоянный IPv6-адрес задаётся в YAML-файле в каталоге /etc/netplan/: под сетевым интерфейсом в строке addresses указывается адрес с длиной префикса, в разделе routes указывается шлюз с назначением ::/0, затем изменение проверяется командой netplan try и закрепляется через netplan apply. После этого ip -6 addr и ping -6 покажут, что адрес поднят и исходящий трафик идёт.
Команды одинаковы для серверных Ubuntu 20.04, 22.04 и 24.04: во всех трёх сетью управляет netplan. В примерах используется блок 2001:db8::/32, зарезервированный для документации (RFC 3849): адрес сервера 2001:db8:1234:5678::10/64, шлюз 2001:db8:1234:5678::1, интерфейс eth0. На своём сервере подставьте адрес, префикс и шлюз, которые выдал провайдер.
Что нужно знать перед настройкой?
Понадобятся три значения: выделенный вам IPv6-адрес или блок, длина префикса и адрес шлюза. VDS WeServer работают с IPv4 и IPv6; на VDS с IPv6-подсетью в первых трёх тарифах выделяется /64, в старших тарифах блок /48 или /64. Если шлюза нет в данных о сдаче сервера, не угадывайте, а запросите его в поддержке. С неверным шлюзом адрес появится на интерфейсе, но сервер не сможет выйти наружу.
Подключитесь по SSH под root или пользователем с правами sudo. По возможности заходите по IPv4: сессия по IPv6 может оборваться, пока вы меняете настройки IPv6. Если у провайдера есть консольный доступ, заранее выясните, где он находится: через него вы попадёте на сервер после неудачной сетевой настройки.
Где лежит файл netplan и как узнать имя интерфейса?
Команда ls /etc/netplan/ покажет файлы конфигурации. На серверах из облачных образов это обычно 50-cloud-init.yaml, при ручной установке встречаются 00-installer-config.yaml или 01-netcfg.yaml. Имя интерфейса узнайте через ip -br link: строка в состоянии UP, кроме lo, например eth0, ens3 или enp1s0, и есть интерфейс внешней сети.
Если файл называется 50-cloud-init.yaml, прочитайте комментарий в его начале. cloud-init может перезаписать файл при перезагрузке, и добавленные строки IPv6 пропадут. Чтобы этого не случилось, создайте файл /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg со строкой network: {config: disabled}. Перед правкой сделайте копию текущего файла: cp /etc/netplan/50-cloud-init.yaml /root/50-cloud-init.yaml.bak.
Как написать файл netplan для статического IPv6-адреса?
Откройте существующий файл в nano или vim и добавьте настройки IPv6 под тот же интерфейс. Если описать интерфейс заново во втором файле, результат будет зависеть от порядка слияния, а один файл проще читать. YAML чувствителен к отступам: табуляцию не используйте, только пробелы. На сервере, который получает IPv4 по DHCP, готовый файл построчно выглядит так (число в скобках означает, сколько пробелов стоит в начале строки):
- network: (0)
- version: 2 (2)
- ethernets: (2)
- eth0: (4)
- dhcp4: true (6)
- addresses: (6)
- - "2001:db8:1234:5678::10/64" (8)
- routes: (6)
- - to: "::/0" (8)
- via: "2001:db8:1234:5678::1" (10)
- nameservers: (6)
- addresses: ["2001:4860:4860::8888", "2606:4700:4700::1111"] (8)
Зачем нужны эти строки и почему не стоит использовать gateway6?
Список addresses содержит адреса для интерфейса вместе с длиной префикса. Пишите адрес в кавычках: значения с двоеточиями обычно работают и без них, но кавычки исключают неверное прочтение значения в YAML. Если IPv4 на сервере задан статически, его адрес находится в том же списке, а IPv6-адрес добавляется новой строкой.
Маршрут ::/0 в разделе routes указывает, через какой шлюз уходит весь IPv6-трафик. Ключ gateway6 из старых инструкций объявлен устаревшим в версиях netplan, которые поставляются с Ubuntu 22.04. Он ещё читается, но при каждом запуске netplan выводит предупреждение, поэтому в новых настройках используйте routes.
Блок nameservers необязателен. Если сервер уже разрешает DNS-имена через IPv4, к IPv6-адресам можно подключаться и без него. Два адреса в примере принадлежат публичным DNS-резолверам; если провайдер рекомендует свой DNS, укажите его.
Как применить настройки и не потерять SSH-сессию?
Сохранив файл, действуйте по порядку:
- Выполните chmod 600 /etc/netplan/50-cloud-init.yaml, чтобы файл читал только root. Иначе новые версии netplan предупреждают «Permissions … are too open».
- Проверьте файл командой netplan generate. Пустой вывод означает, что синтаксис верен; ошибки выводятся с номером строки и столбца.
- Примените настройки временно через netplan try. Команда ждёт 120 секунд и возвращает старую конфигурацию, если не нажать Enter. За это время убедитесь из второго терминала, что подключение работает, и подтвердите изменение клавишей Enter.
- В некоторых конфигурациях netplan try сообщает, что не может выполнить откат. Тогда используйте netplan apply, но сначала убедитесь, что у вас есть консольный доступ.
Что делать, если шлюз находится вне вашей подсети?
В некоторых сетях шлюз лежит за пределами префикса, выданного серверу. Например, адрес выдан как /128 или шлюз находится в другом /64. Ядро тогда не знает, как добраться до шлюза, и маршрут не добавляется; при попытке добавить его вручную через ip -6 route add вы получите ошибку «Nexthop has invalid gateway».
Решение: добавьте в запись маршрута строку on-link: true на одном уровне с via. Она сообщает ядру, что шлюз находится на том же физическом канале. Для link-local шлюза вроде fe80::1 on-link не нужен, потому что link-local адреса всегда находятся на канале самого интерфейса. Какой случай подходит вашей сети, сверьте с данными от провайдера.
Как добавить несколько IPv6-адресов из блока?
Если нужно несколько адресов, перечислите каждый отдельной строкой в addresses, например 2001:db8:1234:5678::11/64 и 2001:db8:1234:5678::12/64, и примените через netplan try. Этого достаточно, чтобы выдать отдельные IPv6-адреса разным сайтам или сервисам на веб-сервере.
Сотни или тысячи адресов вписывать в netplan неудобно, к тому же каждый адрес добавляет трафик обнаружения соседей (NDP). При таком объёме уточните у провайдера, маршрутизируется ли блок на ваш сервер (routed) или выдан на канале (on-link): от этого зависит подходящий способ. Разница между /48 и /64 и логика префиксов разобраны в статье о том, что такое подсеть IPv6.
Как проверить, что настройка IPv6 работает?
- ip -6 addr show dev eth0: адрес должен отображаться со scope global. Если рядом стоит tentative или dadfailed, есть проблема; смотрите список ошибок ниже.
- ip -6 route show default: должна быть строка вида default via 2001:db8:1234:5678::1 dev eth0.
- ping -6 -c 4 2606:4700:4700::1111: проверяет исходящий IPv6 без участия DNS.
- curl -6 -sI https://example.com: если пришла строка со статусом HTTP, записи AAAA разрешаются и веб-соединения по IPv6 проходят.
- С другой машины убедитесь, что сервер доступен снаружи: ssh -6 user@2001:db8:1234:5678::10 или ping -6.
Ошибки IPv6 в netplan и их решение
- netplan generate пишет «Invalid YAML» или «inconsistent indentation». Причина: символ табуляции или неровные пробелы. Решение: перейдите к строке из сообщения и выровняйте отступ пробелами по строкам того же уровня.
- ping -6 выдаёт «connect: Network is unreachable». Причина: нет маршрута IPv6 по умолчанию. Решение: проверьте раздел routes и строку ::/0; если ip -6 route show default ничего не выводит, шлюз не добавлен.
- Адрес есть на интерфейсе, но ping падает с «Destination unreachable: Address unreachable». Причина: неверный адрес шлюза или шлюз вне префикса. Решение: сверьте шлюз с данными провайдера и, если он вне префикса, добавьте on-link: true.
- ip -6 addr показывает у адреса dadfailed. Причина: тот же адрес уже занят другим устройством в сети. Решение: выберите другой адрес из блока; если ошибка повторяется, сообщите провайдеру.
- На интерфейсе вообще нет IPv6-адресов, даже начинающихся с fe80. Причина: IPv6 отключён в системе. Решение: если sysctl net.ipv6.conf.all.disable_ipv6 выводит 1, удалите соответствующую строку из /etc/sysctl.conf или /etc/sysctl.d/ и выполните sysctl --system; если в строке GRUB есть ipv6.disable=1, уберите его, выполните update-grub и перезагрузитесь.
- После перезагрузки IPv6-адрес пропал. Причина: cloud-init перезаписал файл netplan. Решение: создайте файл 99-disable-network-config.cfg и заново впишите строки IPv6.
Частые вопросы
Можно ли вместо статического адреса использовать DHCPv6 или автонастройку? Если сеть рассылает router advertisement или предоставляет DHCPv6, адрес можно получать автоматически через dhcp6: true. На сервере, где важно точно знать используемый адрес, статическая настройка предсказуемее. Какой способ поддерживает сеть, уточните у провайдера.
Оборвёт ли netplan apply мою SSH-сессию? Если вы добавили только строки IPv6, сессия по IPv4 обычно не прерывается. Ошибка в настройках IPv4 может разорвать соединение, поэтому надёжнее начинать с netplan try и держать консольный доступ под рукой.
Используют ли netplan Debian и AlmaLinux? Debian в зависимости от образа работает с ifupdown (/etc/network/interfaces) или с netplan; если каталог /etc/netplan пуст, настройки находятся в ifupdown. AlmaLinux и Rocky Linux управляют сетью через NetworkManager, и IPv6-адрес там задаётся командой nmcli.
Меняется ли настройка фаервола после включения IPv6? При IPV6=yes в /etc/default/ufw ufw применяет правила и к IPv6. Если вы пишете правила ip6tables сами, не блокируйте ICMPv6 целиком: обнаружение соседей работает через ICMPv6, и без него IPv6-связь не поднимется. Подробности в руководстве по первичной настройке безопасности нового VDS.
Писать адрес с /64 или /128? Указывайте длину префикса, которую выдал провайдер. Если блок выдан как /64, адрес задаётся с /64, и при шлюзе в том же блоке дополнительные настройки не нужны. С /128 шлюз оказывается вне префикса, и понадобится on-link: true.
