Как настроить IPv6 без серверов и головной боли
Дисклеймер: всё ниженаписанное это результат самостоятельных раскопок и опытов и может содержать теоретические ошибки. Также в статье не будет описания протокола IPv6, т.к. в сети много статей на тему, начиная с Википедии. Целесообразность перехода каждый оценивает сам за себя, никто никого не агитирует. Подразумевается, что старый IPv4 остается нетронутым и работает параллельно c IPv6 для совместимости в режиме dual-stack.
В данной статье расписаны действия в следующем окружении:
- провайдер дом.ру (не реклама)
- роутер Keenetic Air KN-1611
- компьютеры на Arch Linux и Windows 11, сетевой принтер Epson, смартфоны Apple и Android
Итак, сперва выяснилось, что указанный провайдер (как и все остальные) выдают IPv6-адреса только при подключении по протоколу PPPoE. Но у меня когда-то давно было настроено простое IPoE-подключение, и внезапно оказалось, что обратная самостоятельная перенастройка роутера на PPPoE не работает, пароль не принимается! Пришлось обратится в чат-бот поддержки, и там вопрос решили за 15 минут настройкой опции DHCP. После перенастройки со стороны провайдера роутер получил "серый" адрес из другой подсети.
После перенастройки роутера на PPPoE нужно убедиться, что компонента "Протокол IPv6" загружена и подключена:
... и далее, в настройках подключения PPPoE включить всего одну галочку:
И на этом как бы всё, роутер получил IPv6 адрес и сеть с префиксом 64, а это, на минуточку, целых 18446744073709551616 штук белых адресов, все они ваши и платить за них не надо. Подключенные к домашней сети устройства тоже начали получать белые IPv6-адреса из назначенной сети.
Небольшое пояснение: все физические интерфейсы по стандарту получают по два IPv6 адреса. Первый, начинающийся с 2000 по 3fff - это "белые" адреса (сеть 2000::/3). Второй адрес начинается с fe80 (сеть fe80::/10) - это аналог 169.254.0.0/16 и в отличии от IPv4 он обязательно назначается самим устройством как второй адрес; и еще одна особенность - на несколько интерфейсов назначается один общий такой адрес.
Но с IPv6 в домашней сети есть одна проблема - разрешение имен. Длинный адрес, во-первых, запомнить крайне трудно, во-вторых эти адреса динамические, а в третьих они самоназначаются с помощью протокола SLAAC, т.е. интеграции с DNS на роутере и вообще ни с чем не будет. При включенной выше галочке роутер всего лишь становится прозрачным маршрутизатором для фреймов, помеченных как протокол IPv6, никакого NAT нет, нагрузка на железо минимальная (в чем и состоит одно из преимуществ данного протокола).
Предвижу опасения по поводу белых адресов в локалке, поэтому сразу успокою - прозрачность маршрутизации IPv6 в роутерах Keenetic односторонняя на исходящее соединение, т.к. по умолчанию включен IPv6 firewall. Скорее всего и остальные производители делают точно так же, для вашей безопасности.
Разрешение имен
Для решения проблем с именами в небольших локалках довольно давно существует старое решение от компании Apple, под названием Zeroconf, он же Bonjour, которое давно стало популярным и за пределами экосистемы Apple, особенно у производителей техники. Это стандарт для упрощения настройки в малых сетях. Все устройства в сети по стандарту Zeroconf имеют имена вида name.local и регистрируются самостоятельно, используя локальное наименование устройства с добавлением домена local. Если кто помнит, это некий аналог NETBIOS, но поверх сети IP.
Далее описание настройки для разных устройств:
Всякое разное железо
- Поддержка Bonjour включена почти во все принтеры из коробки, поэтому с моим старым Epson вообще ничего делать не пришлось - он был полностью готов к работе в новой сети.
- Для поддержки Zeroconf в самом роутере установил компоненту "Служба mDNS", и на этом тоже всё.
- iPhone, Android - поддержка из коробки.
Компьютеры Windows
Реализация от компании Apple для Windows известна как Bonjour. Она входит в состав программы iTunes. При желании, в сети легко можно найти установщик Bonjour64.msi из этого пакета, если вам не нужен сам iTunes. Достаточно его установить, настройка не требуется. Для проверки набираете в консоли команду ping по имени компьютера с "хвостиком" .local. Для "чистоты" разрешения имен можно настроить параметры DNS сетевого интерфейса таким образом:
Компьютеры Linux
С Linux, как всегда, чуть посложнее. Реализация Zeroconf для Linux называется Avahi. Пример настройки Avahi приведен для Arch, другие дистрибутивы настраиваются в принципе аналогично со своим менеджером пакетов.
$ sudo pacman -S avahi nss-mdns
$ sudo systemctl enable avahi-daemon.service
$ sudo nano /etc/nsswitch.conf
отредактировать строку:
hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
$ sudo systemctl start avahi-daemon.service
Для проверки результата сделать ping.
Виртуализация (QEMU/KVM)
Какую-либо документацию, как настроить ipv6 passtrough в KVM, не нашёл, поэтому делаем через NAT. (да, для IPv6 NAT тоже существует!).
В IPv6 в качестве "серых" по стандарту в настоящее время используется сеть fc00::/7 (аналог 10.0.0.0/8). В примере настройки ниже встроенный DHCP будет раздавать вашим ВМ адреса в сети fd00:: с более узким префиксом /64 начиная с адреса fd00:7777:7777:7777::100 до fd00:7777:7777:7777::1ff
<network>
<name>ipv6</name>
<bridge name="virbr1" stp="on" delay="0"/>
<uuid>bce34e7b-fb41-4b9b-a3c3-82d01a183a2c</uuid>
<forward mode="nat">
<nat ipv6='yes'>
<port start='1024' end='65535'/>
</nat>
</forward>
<mac address="52:54:00:ed:e0:9b"/>
<domain name="ipv6"/>
<ip family="ipv6" address="fd00:7777:7777:7777::1" prefix="64">
<dhcp>
<range start="fd00:7777:7777:7777::100" end="fd00:7777:7777:7777::1ff"/>
</dhcp>
</ip>
</network>
Как открыть IPv6-порт внешнему миру (Keenetic)
К сожалению, на момент написания статья полноценная настройка IPv6 недоступна из веб-консоли роутеров Keenetic, и для открытия портов нужно подключаться через telnet. Так как белые адреса каждый раз раздаются рандомные, то для простоты все настройки производятся по MAC-адресу физического адаптера сервера, на который пробрасывается порт.
Пример открытия порта 8080 для указанного MAC-адреса:
(config)>ipv6 static tcp PPPoE0 50:2f:0e:00:37:39 8080
Сервер nginx
С конфигурационным файлом по умолчанию nginx не слушает протокол IPv6. Нужно добавить еще один listen:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
...
}
Сервер transmission-daemon
Отредактировать файл настроек, находящийся в /var/lib/transmission/.config/transmission-daemon/settings.json
{
...
"bind-address-ipv6": "::";
"rpc-bind-address": "::";
...
}
Заключение
После успешного внедрения IPv6 настоятельно рекомендую проверить с помощью любого онлайн-сервиса ваши адреса на предмет открытых портов!