у меня есть сервер лансервер работает в моей частной локальной сети, которая подключена к общедоступному серверу публичный сервер с помощью Wireguard. публичный сервер перенаправляет TCP-соединения на определенные порты на лансервер через соединение Wireguard с использованием iptables ДНКТ правило.
На лансервер, Wireguard настроен как соединение NetworkManager. Он направляет весь интернет-трафик через Wireguard, используя Разрешенные IP-адреса = 0.0.0.0/0, ::/0. Это приводит к установке следующих правил ip на лансервер:
[root@lanserver ~]# ip правило показать
0: из всех локальных поисковых систем
31100: из всех поисковых запросов main submit_prefixlength 0
31101: не во всех поиск fwmark 0xcb2e 52014
32766: из всех основных поисковых запросов
32767: из всех поисковых запросов по умолчанию
[root@lanserver ~]# ip route показать таблицу 52014
По умолчанию dev wg0 proto static scope link metric 50
Эта установка работает правильно. Входящее TCP-соединение с публичный сервер пересылается лансервер используя правило iptables. Ответ отправляется обратно через публичный сервер потому что правило IP 31101 соответствует этому.
Есть одно исключение: когда я пытаюсь открыть TCP-соединение с публичный сервер используя IPv6 с моего персонального компьютера ПК, который также находится внутри моей частной локальной сети, не работает. Проблема, похоже, в том, что оба ПК и лансервер иметь адрес IPv6 в той же общедоступной подсети. публичный сервер перенаправляет соединение на лансервер успешно, но ответ направляется не обратно через соединение Wireguard, а напрямую ПК из-за правила IP 31100.
Как я могу убедиться, что все ответы на соединения, поступающие через интерфейс Wireguard на лансервер также отправляются обратно через интерфейс Wireguard, независимо от того, находится ли их исходный IP-адрес в локальной подсети?
Я могу думать о решениях в следующих направлениях:
- Отключить IPv6 на
лансервер, из-за чего он не находится в той же подсети, что и ПК. Не очень хорошее решение.
- Использовать
СНАТ на публичный сервер для порта вперед. Неприемлемое решение, поскольку некоторым службам за перенаправленными портами необходимо знать истинный IP-адрес источника.
- Явно упомяните локальную подсеть IPv6 в
Разрешенные IP-адреса узла Wireguard. Это не работает, потому что подсеть IPv6 меняется каждые 24 часа.
- Добавьте пользовательское правило IP, которое каким-то образом соответствует всем соединениям, входящим через
WG0 и использует таблицу маршрутизации 52014 для них. Я не уверен, как именно указать такое правило. Также проблема в том, что номер таблицы маршрутизации меняется каждый раз при перезапуске соединения Wireguard. Правильным местом для создания такого правила, вероятно, будет PostUp script, но NetworkManager, похоже, не позволяет указать его.