Рейтинг:0

Отправлять ответ обратно через то же устройство для соединений, входящих через Wireguard

флаг us

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

Поэкспериментировав с различными вариантами, я решил отказаться от NetworkManager и вместо этого напрямую использовать wg-quick. На сервере Fedora это было довольно просто, и мне нужно было всего лишь удалить соединение NetworkManager с помощью nmcli с wg0 и включите сервис wg-quick, используя systemctl включить --now wg-quick@wg0 (который читает конфиг из /etc/wireguard/wg0.conf). Переход на wg-quick имеет следующие преимущества:

  • могу указать на заказ PostUp команды для более сложной настройки маршрутизации
  • Номер таблицы маршрутизации Wireguard кажется постоянным на 51820, хотя я не смог найти никакой документации по этому поводу. Это упрощает настройку пользовательских правил IP.

Затем я использовал PostUp командовать WG0.conf установить дополнительные правила IP, которые гарантировали бы, что любой трафик Wireguard также будет отвечать через Wireguard. Для этого есть два варианта:

Вариант 1: сопоставление исходного IP-адреса

Правила ip сопоставляются с пакетами Wireguard на основе их исходных IP-адресов (которые автоматически устанавливаются на IP-адрес, на который изначально пришел запрос):

[Интерфейс]
Адрес = 10.139.192.4/24
Адрес = fd52:30a4:f9e7:647a::4/64
PostUp = ip -4 правило добавлено из 10.139.192.4 поиск 51820
PreDown = ip -4 правило del от 10.139.192.4 поиск 51820
PostUp = ip -6 правило добавлено из fd52:30a4:f9e7:647a::4 lookup 51820
PreDown = ip -6 правило del из fd52:30a4:f9e7:647a::4 поиск 51820

Вариант 2: fwmark

Некоторые правила iptables настроены на установку отметка на посылки, поступающие через WG0:

iptables -t mangle -A INPUT -j CONNMARK -i wg0 --set-mark 1
ip6tables -t mangle -A INPUT -j CONNMARK -i wg0 --set-mark 1
iptables -t mangle -A ВЫВОД -j CONNMARK -m connmark --mark 1 --restore-mark
ip6tables -t mangle -A ВЫВОД -j CONNMARK -m connmark --mark 1 --restore-mark

Тогда это отметка соответствует правилу IP:

PostUp = ip -4 правило добавить fwmark 1 поиск 51820
PreDown = ip -4 правило поиска fwmark 1 51820
PostUp = ip -6 правило добавить fwmark 1 поиск 51820
PreDown = ip -6 правило поиска fwmark 1 51820

Подробнее об этом решении можно узнать здесь.

Ответить или комментировать

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