Добавление второй подсети в работающий туннель между площадками занимает пять минут в одной схеме и почти весь день в другой. Когда туннель устанавливает маршруты для указанных префиксов, вы добавляете маршрут, и трафик идёт по нему. Когда он согласует одну фиксированную пару селекторов, новый префикс остаётся незащищённым, пока обе стороны не договорятся о подходящей паре. Решают три вещи: что на самом деле описывает конфигурация каждой стороны, сужается ли согласованный трафик до наименьшей подходящей пары и кому принадлежит обратный маршрут для нового диапазона.

Читайте ядро, а не метку состояния

Туннель, сообщающий о соединении, установил хотя бы одну дочернюю ассоциацию, но не обязательно ту, о которой вы думаете. В Linux ядро показывает, что применяется: ip xfrm policy перечисляет пары селекторов, а swanctl --list-sas (или старый ipsec statusall) показывает, о чём договорились стороны, включая селекторы трафика в каждом направлении. Если нового префикса нет ни там, ни там, он не защищён, что бы ни говорил файл конфигурации.

Сравните с таблицей маршрутов. В схеме на основе маршрутов устройство туннеля — следующий переход для защищённых префиксов. В схеме на основе политик часто нет отдельного маршрута к удалённой подсети, только маршрут по умолчанию, потому что трафик выбирает политика, а не таблица.

На основе политик: обе стороны должны указать новый префикс

В терминах strongSwan селектор живёт в local_ts и remote_ts дочерней конфигурации, наследниках leftsubnet и rightsubnet. Новый префикс должен появиться с обеих сторон зеркально: то, что площадка A называет локальным, площадка B называет удалённым. Несовпадение редко даёт чистую ошибку. Стороны сужаются до пересечения, старый префикс продолжает работать, а новый тихо отказывает.

swanctl --load-conns
swanctl --initiate --child <child-name>
swanctl --list-sas
ip xfrm policy

В pfSense или OPNsense это вторая запись Phase 2, связывающая новую локальную подсеть с новой удалённой, и затем применение. Сохраните старую запись; замена перемещает исходную подсеть вместо добавления. Если существующая Phase 2 уже покрывает суперсеть вроде 0.0.0.0/0 или сводный диапазон, не добавляйте рядом более узкую запись: перекрывающиеся селекторы устанавливают конкурирующие политики, и порядок оценки решает победителя.

IKEv1 делает каждую пару подсетей отдельной Phase 2, и сторона, принимающая одну пару за обмен, отбрасывает остальные. IKEv2 может нести несколько пар селекторов в одной дочерней ассоциации, но только если обе реализации их принимают. Список из swanctl --list-sas — истина; то, что вы набрали, — запрос.

На основе маршрутов: маршрут и есть политика

Интерфейс XFRM или устройство VTI несёт трафик согласно таблице маршрутов. Вы направляете новый префикс на устройство на обеих площадках, и применяется состояние, привязанное к трансформации интерфейса. Пары селекторов, которую нужно синхронизировать, нет, поэтому эта схема лучше масштабируется с ростом числа подсетей. Руководство strongSwan по пересылке подробно разбирает сторону ядра.

ip route add 192.168.60.0/24 dev xfrm0
ip route get 192.168.60.10

WireGuard идёт дальше. AllowedIPs — одновременно криптографический белый список и, через wg-quick, запись в таблице маршрутов. Добавьте префикс только на одной стороне — получите рукопожатие, исходящие пакеты и тишину, потому что дальняя сторона отбрасывает пакеты, чей источник не в её списке. Форма wg set заменяет весь список, поэтому перечислите заново уже работавшие префиксы, иначе отрежете их:

wg set wg0 peer <PUBKEY> allowed-ips 192.168.10.0/24,192.168.60.0/24
ip route add 192.168.60.0/24 dev wg0

Вторая команда не является необязательной, если вы использовали wg set вместо wg-quick. Ядро сразу принимает новый список, но никто не добавляет для него маршрут, поэтому локально созданный трафик по-прежнему уходит через шлюз по умолчанию. Это самая частая причина, по которой новая подсеть WireGuard работает с хоста туннеля, а не с ноутбука.

Обратный путь отказывает чаще, чем туннель

Хосты в новой удалённой подсети должны отправлять ответы обратно через шлюз VPN. Когда этот шлюз не является их маршрутизатором по умолчанию, ответ уходит на маршрутизатор LAN, который либо отбрасывает его, либо пересылает в интернет с частным адресом источника. Проверяйте с хоста на дальней стороне, а не со шлюза: ip route get 10.30.20.15 в Linux или Find-NetRoute -RemoteIPAddress 10.30.20.15 в PowerShell покажет следующий переход, который хост действительно использует. Если ответ не является конечной точкой туннеля, добавьте там статический маршрут для нового префикса.

Исходный NAT на площадке без обратного маршрута — законная альтернатива и способ, которым многие развёртывания hub-and-spoke избегают трогать каждый сервер. Примените его и к новому префиксу на шлюзе стороны назначения:

iptables -t nat -A POSTROUTING -s 10.30.20.0/24 -d 192.168.60.0/24 -j MASQUERADE

Цена реальна. Удалённые журналы перестают показывать отдельные адреса источников, а правила межсетевого экрана, привязанные к исходной подсети, сливаются в одно правило для шлюза. Выбирайте это осознанно, а не потому, что не хватало маршрута.

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

Решите тремя вопросами, затем проверьте трафиком

Короткая версия: конфигурация стороны называет префиксы (на основе политик) или трафик маршрутизируется в интерфейс (на основе маршрутов)? Перечисляют ли оба конца новый префикс? Есть ли путь назад из новой подсети в исходный диапазон источников?

Tunnel styleWhere the prefix goesWhat breaks if you skip it
Policy-based IPsecSelector pair on both peersOld subnets work, the new one fails with no clear error
Route-based XFRM or VTIRoute into the device on both sitesPackets routed but not transformed, or the state never matches
WireGuardAllowedIPs on both peers plus a routeHandshake succeeds, replies are dropped
Overlapping supernetAdjust the existing entry insteadA shadowed policy wins or loses by evaluation order

Проверка — место, где большинство изменений закрывают слишком рано. Пинг со шлюза доказывает немногое: шлюз отправляет от себя и часто совпадает с другой политикой, чем хост. Пингуйте с хоста в новой подсети, затем запустите приложение, ради которого делалось изменение, и смотрите на счётчики, а не на значок состояния.

tcpdump -ni any host 192.168.60.10 and (esp or udp port 4500)
ip xfrm state
wg show

В туннеле на основе политик счётчики ip xfrm state должны расти в обоих направлениях; плоские счётчики означают, что пакет маршрутизируется, но не выбирается. В WireGuard wg show показывает передачу по сторонам, а рукопожатие с нулём полученных байт указывает на список дальней стороны или её обратный маршрут.

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

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