Две LAN, один WireGuard-концентратор и план адресов IPv6, который должен ответить на три отдельных вопроса: какой префикс, какой адрес принадлежит каждому маршрутизатору и какой партнёр владеет какой подсетью. Ошибка в любом из них даёт туннель, который выполняет рукопожатие и ничего не маршрутизирует. План ниже в этом порядке проходит приватный проект двух площадок. Он намеренно не обеспечивает доступ в интернет через IPv6.

Решите, для чего нужен префикс

Уникальный локальный префикс из fd00::/8 — естественный выбор, когда цель — приватная доступность между площадками. Он остаётся стабильным независимо от того, какой провайдер обслуживает каждую площадку, и не анонсируется в глобальной таблице маршрутизации, поэтому не может утечь вашу внутреннюю нумерацию в интернет.

То же свойство — и ограничение. ULA не даёт публичного обратного пути, потому что ни один вышестоящий провайдер не знает, что его нужно маршрутизировать на ваш шлюз. Если требование включает выход в интернет через IPv6, вам нужно выделение от провайдера, который маршрутизирует его к вам, и это отдельное проектное решение с собственным размером префикса.

Не предполагайте, что каждому развёртыванию нужен /48. RFC 6177 отошёл от единственного обязательного размера конечного сайта, и правильный размер зависит от числа сетей, которыми вы будете управлять. Генерируйте ULA процедурой RFC 4193, а не придумывайте префикс, который может использовать и другая организация. Запишите результат в план адресов до настройки любого устройства, потому что префикс, который никто не записал, — это префикс, который кто-то использует повторно.

Разделите префикс на роли

В примере ниже используется fd7c:2e91:4a00::/48, а таблица упорядочена по тому, где записывается каждый блок, а не по площадке. Считайте значения примером и сгенерируйте свои перед любым развёртыванием.

Where it is writtenWhat appears thereBlock usedWhat it establishes
Hub wg0.conf, interface addressA single host address on the tunnelfd7c:2e91:4a00:ff00::1/128The hub's own tunnel identity
Hub wg0.conf, Site A peerTwo ranges in one AllowedIPs line::2/128 and :10::/64That A owns its tunnel address and its LAN
Hub wg0.conf, Site B peerTwo ranges in one AllowedIPs line::3/128 and :20::/64That B owns its tunnel address and its LAN
Site A wg0.conf, interface addressA single host address on the tunnelfd7c:2e91:4a00:ff00::2/128A's identity as the hub sees it
Site B wg0.conf, interface addressA single host address on the tunnelfd7c:2e91:4a00:ff00::3/128B'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, пересмотрите выделение от провайдера, выбор адреса источника и обратную маршрутизацию как новый шаг проектирования; приватный план выше остаётся действительным для трафика между площадками.

Похожие статьи