Планирование IPv6 для WireGuard-концентратора с двумя площадками: префикс, партнёры, маршруты
Проработайте приватный IPv6-концентратор для двух LAN: выберите префикс, зарезервируйте адреса туннеля, а затем позвольте AllowedIPs выразить, какой партнёр владеет каждой подсетью.
Две LAN, один WireGuard-концентратор и план адресов IPv6, который должен ответить на три отдельных вопроса: какой префикс, какой адрес принадлежит каждому маршрутизатору и какой партнёр владеет какой подсетью. Ошибка в любом из них даёт туннель, который выполняет рукопожатие и ничего не маршрутизирует. План ниже в этом порядке проходит приватный проект двух площадок. Он намеренно не обеспечивает доступ в интернет через IPv6.
Решите, для чего нужен префикс
Уникальный локальный префикс из fd00::/8 — естественный выбор, когда цель — приватная доступность между площадками. Он остаётся стабильным независимо от того, какой провайдер обслуживает каждую площадку, и не анонсируется в глобальной таблице маршрутизации, поэтому не может утечь вашу внутреннюю нумерацию в интернет.
То же свойство — и ограничение. ULA не даёт публичного обратного пути, потому что ни один вышестоящий провайдер не знает, что его нужно маршрутизировать на ваш шлюз. Если требование включает выход в интернет через IPv6, вам нужно выделение от провайдера, который маршрутизирует его к вам, и это отдельное проектное решение с собственным размером префикса.
Не предполагайте, что каждому развёртыванию нужен /48. RFC 6177 отошёл от единственного обязательного размера конечного сайта, и правильный размер зависит от числа сетей, которыми вы будете управлять. Генерируйте ULA процедурой RFC 4193, а не придумывайте префикс, который может использовать и другая организация. Запишите результат в план адресов до настройки любого устройства, потому что префикс, который никто не записал, — это префикс, который кто-то использует повторно.
Разделите префикс на роли
В примере ниже используется fd7c:2e91:4a00::/48, а таблица упорядочена по тому, где записывается каждый блок, а не по площадке. Считайте значения примером и сгенерируйте свои перед любым развёртыванием.
| Where it is written | What appears there | Block used | What it establishes |
|---|---|---|---|
| Hub wg0.conf, interface address | A single host address on the tunnel | fd7c:2e91:4a00:ff00::1/128 | The hub's own tunnel identity |
| Hub wg0.conf, Site A peer | Two ranges in one AllowedIPs line | ::2/128 and :10::/64 | That A owns its tunnel address and its LAN |
| Hub wg0.conf, Site B peer | Two ranges in one AllowedIPs line | ::3/128 and :20::/64 | That B owns its tunnel address and its LAN |
| Site A wg0.conf, interface address | A single host address on the tunnel | fd7c:2e91:4a00:ff00::2/128 | A's identity as the hub sees it |
| Site B wg0.conf, interface address | A single host address on the tunnel | fd7c:2e91:4a00:ff00::3/128 | B's identity as the hub sees it |
Блоки LAN — это /64, потому что обычный SLAAC ожидает 64-битный идентификатор интерфейса. Разделение LAN на меньший блок ломает это допущение на большинстве хостов, а эксплуатационные затраты не стоят экономии адресов в приватном плане. Оба блока LAN берутся из середины /48, оставляя нижний диапазон свободным для последующих площадок.
Адреса туннеля — это административный резерв, а не сеть на канале. Каждый интерфейс получает из него один /128, поэтому ни один хост не предполагает общую подсеть на туннеле, и обнаружение соседей не работает там, где оно не нужно. Держите роли непересекающимися и фиксируйте их в плане адресов организации, чтобы более поздняя площадка не использовала блок повторно.
Дайте каждому маршрутизатору один адрес туннеля
Назначьте по одному /128 на маршрутизатор и сохраните существующие ключи и конечные точки работающего концентратора. Три значения ниже различаются только в части хоста.
Hub: Address = fd7c:2e91:4a00:ff00::1/128
Site A: Address = fd7c:2e91:4a00:ff00::2/128
Site B: Address = fd7c:2e91:4a00:ff00::3/128
Этот /128 описывает единственный адрес, назначенный этому интерфейсу. Он ничего не говорит о том, сколько адресатов партнёр может маршрутизировать, потому что доступность выражается в AllowedIPs, а не в префиксе интерфейса.
Каждому маршрутизатору площадки также нужен адрес в своём блоке LAN и способ его распространять, обычно объявления маршрутизатора для SLAAC. WireGuard не отправляет эти объявления за вас и не объединяет две сети LAN. Маршрутизатор площадки — маршрутизатор в обе стороны.
Поместите владение подсетью в AllowedIPs
Запись партнёра в концентраторе для Площадки A владеет адресом туннеля A и сетью LAN A, и эта пара — всё заявление о владении. Ничто другое в этом разделе партнёра не должно описывать площадку.
AllowedIPs = fd7c:2e91:4a00:ff00::2/128, fd7c:2e91:4a00:10::/64
Запись партнёра для Площадки B владеет соответствующей парой, и симметрия здесь важнее краткости. Прочитайте две строки вместе, и разделение владения станет видно с первого взгляда.
AllowedIPs = fd7c:2e91:4a00:ff00::3/128, fd7c:2e91:4a00:20::/64
Это два отдельных раздела партнёра, а не два списка, конкурирующих за одного партнёра. WireGuard использует AllowedIPs в обоих направлениях: он выбирает партнёра для исходящего адресата и отбрасывает входящий пакет, источник которого не соответствует диапазону, назначенному партнёру, расшифровавшему его. Если отдать весь /48 обоим партнёрам, эта вторая проверка отключится и станет неясно, какая площадка владеет каким блоком. Именно это различие делает неверный адрес источника видимым, а не молча принятым.
Каждой площадке нужны только адресаты, доступные через её партнёра-концентратор: Площадка A перечисляет адрес концентратора, адрес туннеля Площадки B и сеть LAN B, а Площадка B перечисляет обратный набор. Списки намеренно асимметричны, потому что каждый маршрутизатор видит свою сторону топологии. Записывайте оба из плана адресов, а не из конфигурации другой площадки, потому что именно так устаревший диапазон переживает перенумерацию.
С wg-quick эти диапазоны также создают маршруты. При systemd-networkd или ручной настройке добавьте эквивалентные маршруты сами; иначе туннель несёт пакеты, которые ядро никогда в него не отправляет.
Завершите пересылку и проверьте оба направления
Включите пересылку IPv6 на концентраторе и на обоих маршрутизаторах площадок и разрешите необходимые межплощадочные службы в политике пересылки. Держите сообщения ICMPv6 Packet Too Big работоспособными, потому что их отбрасывание ломает обнаружение MTU пути и вызывает задержки больших передач, похожие на сбои приложений. Концентратор, который пересылает без разрешения межсетевого экрана, отбрасывает пакет между маршрутизацией и туннелем. Этот режим отказа стоит знать, потому что туннель остаётся поднятым и гибнут только некоторые потоки.
sysctl net.ipv6.conf.all.forwarding
ip -6 route
ping -6 -c 3 fd7c:2e91:4a00:20::1
Проверьте от хоста на Площадке A к хосту на Площадке B, а затем в обратном направлении. Ping на адрес туннеля концентратора проверяет только первый переход и пройдёт даже при неверных маршрутах LAN. Именно поток от хоста к хосту доказывает план.
Внешнее соединение WireGuard может работать поверх IPv4, пока внутренний трафик — IPv6, и эта независимость полезна при миграции. Если позже добавится глобальный выход IPv6, пересмотрите выделение от провайдера, выбор адреса источника и обратную маршрутизацию как новый шаг проектирования; приватный план выше остаётся действительным для трафика между площадками.