у меня есть сервер лансервер
работает в моей частной локальной сети, которая подключена к общедоступному серверу публичный сервер
с помощью 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, похоже, не позволяет указать его.