Рейтинг:2

Объединение серверов WireGuard в цепочку: можно пинговать оба от клиента, но не может получить доступ к Интернету. Проблема с IP-маршрутизацией?

флаг cn

Я пытаюсь настроить VPN с цепочкой / двойным переходом, при которой весь клиентский трафик проходит через 2 сервера, прежде чем попасть в Интернет:

Клиент – Сервер1 – Сервер2 – Общедоступный Интернет

Все пиры находятся в этих частных блоках адресов: 10.103.213.0/24 (IPv4) и fd6f:9403:2887:9cd6:10:103:213:0/112 (IPv6). Ниже приведены конфигурации пиров и действующие правила IPTables. (Пожалуйста, обратите также внимание на имена файлов конфигурации, если это имеет значение.)


Конфигурация сервера2

Файл: /etc/wireguard/wg0.conf

# Сервер2

[Интерфейс]
Приватный ключ = SERVER2_PRIVATE_KEY
Адрес = 10.103.213.2/24, fd6f:9403:2887:9cd6:10:103:213:2/112
ListenPort = 53701
Сохранение конфигурации = ложь

# КЛИЕНТЫ

[Узел] # Сервер1
Публичный ключ = SERVER1_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
# — разрешить трафик от клиента (10.103.213.11/32) через Сервер1 (10.103.213.1/32), разрешить оба
Разрешенные IP-адреса = 10.103.213.0/24, fd6f:9403:2887:9cd6:10:103:213:0/112

Конфигурация брандмауэра. команды:

ufw разрешить 53701/udp комментарий «WireGuard VPN»

iptables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
iptables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ

iptables -t nat -A POSTROUTING -s 10.103.213.0/24 -o enp8s0 -j ​​MASQUERADE
ip6tables -t nat -A POSTROUTING -s fd6f:9403:2887:9cd6:10:103:213:0/112 -o enp8s0 -j ​​MASQUERADE

Конфигурация сервера 1

Файл: /etc/wireguard/wg0.conf

# Сервер1

[Интерфейс]
Приватный ключ = SERVER1_PRIVATE_KEY
Адрес = 10.103.213.1/24, fd6f:9403:2887:9cd6:10:103:213:1/112
ListenPort = 53701
Сохранение конфигурации = ложь

# КЛИЕНТЫ

[Узел] # Сервер2
Публичный ключ = SERVER2_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
Конечная точка = SERVER2_PUBLIC_IP:53701
Разрешенные IP-адреса = 10.103.213.2/32, fd6f:9403:2887:9cd6:10:103:213:2/128
#PersistentKeepalive = 25

[Узел] # ПК
Публичный ключ = CLIENT_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Разрешенные IP-адреса = 10.103.213.11/32, fd6f:9403:2887:9cd6:10:103:213:11/128

Конфигурация брандмауэра. команды:

ufw разрешить 53701/udp комментарий «WireGuard VPN»

iptables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
iptables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ

Конфигурация клиента

# КЛИЕНТ: ПК

[Интерфейс]
Приватный ключ = CLIENT_PRIVATE_KEY
Адрес = 10.103.213.11/24, fd6f:9403:2887:9cd6:10:103:213:11/112
DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1

[Узел] # Сервер1
Публичный ключ = SERVER1_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Конечная точка = SERVER1_PUBLIC_IP:53701
Разрешенные IP-адреса = 0.0.0.0/0, ::0/0
#PersistentKeepalive = 25

Теперь, как я уже сказал, я могу пропинговать Server1 (10.103.213.2) и Сервер2 (10.103.213.1) от Клиента (10.103.213.11) в частной (WireGuard) сети, когда VPN включен на всех одноранговых узлах, но я не могу получить доступ к Интернету.

Я знаю, что мне не хватает некоторых столь необходимых IP-маршрутов или правил IPTables, но, несмотря на попытки найти решение, которое я могу понять в течение нескольких дней у меня не было успеха. Я вижу, что у меня мало надежды, если я не прочитаю книгу о сетях/брандмауэрах Linux.

На данный момент я надеюсь, что кто-то может помочь мне с решением вместе с объяснением того, что мы делаем и почему, чтобы я мог лучше понять и делать заметки.

Большое спасибо!


ПРИМЕЧАНИЯ:

  • Если мне не хватает какой-либо полезной информации, пожалуйста, спросите, и я буду рад ее получить.

  • Клиент работает под управлением macOS. Сервер 1 и сервер 2 работают под управлением Debian 11 «Bullseye». Просто к вашему сведению, если это актуально.

  • На Server1 и Server2 установлены Unbound и настроены для локального разрешения DNS. Вот почему вы видите DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1 в конфигурации клиента. Если бы не это, я бы использовал там IP-адреса CloudFlare или Google.

  • Кто-то из #wireguard IRC предложил мне попробовать добавить Таблица = 123 под [Интерфейс] в конфигурации WireGuard Server1. а затем запустить команду ip правило добавить iif wg0 таблица 123. Это не сработало, и я тоже не мог понять, что он должен делать (я не мог разобраться в справочных страницах или технических деталях).

  • Из прочитанного я пришел к выводу, что iptables и уфв можно использовать вместе, за исключением того, что нужно быть осторожным при использовании iptables-постоянный. Вам нужно бежать netfilter-постоянное сохранение даже после бега уфв команды для сохранения правил брандмауэра при перезагрузке даже если статус ufw говорит, что они на месте. Если по какой-то причине вы перезагрузитесь перед сохранением, удалите правила UFW и добавьте их снова, а затем запустите netfilter-постоянное сохранение.

iBug avatar
флаг um
Смешивать UFW и iptables мне не кажется хорошей идеей.
флаг cn
@iBug IDK, я прочитал об этом и в значительной степени пришел к выводу, что их можно использовать вместе, за исключением того, что вы должны быть осторожны при использовании iptables-persistent (`netfilter-persistent save` даже после запуска `ufw ` команды). Никаких других вопросов.
Рейтинг:1
флаг cn

Добрые люди в #проволока IRC-канал на Libera.Chat выручил меня!

Проблемы с моей конфигурацией. были следующими:

  • В конфигурации Server1 есть Server2 с Разрешенные IP-адреса только IP-адресов Server2. Это не позволит "Интернет". Это должно быть 0.0.0.0/0, ::0/0.

  • Интерфейс WireGuard Server1 должен быть настроен для добавления маршрутов (для всех записей в Разрешенные IP-адреса) в пользовательскую таблицу IP-маршрутизации (назовем ее Wireguard2x) вместо главный Таблица. Затем добавьте правило политики IP, в котором говорится, что трафик с входным интерфейсом (iif) WG0 перейдите к пользовательской таблице, что также означает, что другие виды трафика обычно используют маршрут по умолчанию.


Исправленная конфигурация

Конфигурация сервера2

Файл: /etc/wireguard/wg0.conf

# Сервер2

[Интерфейс]
Приватный ключ = SERVER2_PRIVATE_KEY
Адрес = 10.103.213.2/24, fd6f:9403:2887:9cd6:10:103:213:2/112
ListenPort = 53701
Сохранение конфигурации = ложь

# КЛИЕНТЫ

[Узел] # Сервер1
Публичный ключ = SERVER1_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
# — разрешить трафик от клиента (10.103.213.11/32) через Сервер1 (10.103.213.1/32), разрешить оба
Разрешенные IP-адреса = 10.103.213.0/24, fd6f:9403:2887:9cd6:10:103:213:0/112

Конфигурация брандмауэра. команды:

ufw разрешить 53701/udp комментарий «WireGuard VPN»

iptables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
iptables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ

iptables -t nat -A POSTROUTING -s 10.103.213.0/24 -o enp7s0 -j ​​MASQUERADE
ip6tables -t nat -A POSTROUTING -s fd6f:9403:2887:9cd6:10:103:213:0/112 -o enp7s0 -j ​​MASQUERADE

Конфигурация сервера 1

Файл: /etc/wireguard/wg0.conf

# Сервер1

[Интерфейс]
Приватный ключ = SERVER1_PRIVATE_KEY
Адрес = 10.103.213.1/32, fd6f:9403:2887:9cd6:10:103:213:1/128
ListenPort = 53701
Таблица = wireguard2x
# ✓ следует устанавливать только в том случае, если в системе установлены resolvconf или openresolv, в противном случае пусть система использует значения по умолчанию
# ✓ не требуется, если настроено локальное разрешение DNS
# DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1
Сохранение конфигурации = ложь

# КЛИЕНТЫ

[Узел] # Сервер2
Публичный ключ = SERVER2_PUBLIC_KEY
PresharedKey = SERVER1_PRESHARED_KEY
Конечная точка = SERVER2_PUBLIC_IP:53701
Разрешенные IP-адреса = 0.0.0.0/0, ::0/0
#PersistentKeepalive = 25

[Узел] # ПК
Публичный ключ = CLIENT_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Разрешенные IP-адреса = 10.103.213.11/32, fd6f:9403:2887:9cd6:10:103:213:11/128

Конфигурация брандмауэра. команды:

ufw разрешить 53701/udp комментарий «WireGuard VPN»

iptables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
iptables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -i wg0 -j ПРИНЯТЬ &&
ip6tables -A ВПЕРЕД -o wg0 -j ПРИНЯТЬ

эхо 123 wireguard2x >> /etc/iproute2/rt_tables
IP-правило добавить таблицу iif wg0 wireguard2x

Конфигурация клиента

# КЛИЕНТ: ПК

[Интерфейс]
Приватный ключ = CLIENT_PRIVATE_KEY
Адрес = 10.103.213.11/32, fd6f:9403:2887:9cd6:10:103:213:11/128
DNS = 10.103.213.1, fd6f:9403:2887:9cd6:10:103:213:1

[Узел] # Сервер1
Публичный ключ = SERVER1_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Конечная точка = SERVER1_PUBLIC_IP:53701
Разрешенные IP-адреса = 0.0.0.0/0, ::0/0
#PersistentKeepalive = 25

ПРИМЕЧАНИЯ:

  • Вы можете увидеть все правила маршрутизации политики, действующие в данный момент, с помощью этой команды: список IP-правил или же IP-правило

  • Просмотрите таблицы маршрутизации, например, с помощью ip route показать таблицу wireguard2x или же Таблица списка IP-маршрутов wireguard2x.

  • Чтобы очистить кеш маршрута: сброс кэша IP-маршрута

  • Дальнейшее чтение: Расширенная маршрутизация и управление трафиком в Linux (LARTC) HOWTO

  • Вы можете контролировать поток сетевого трафика клиента — если в Linux, используя судо iptraf-ng; на macOS с помощью судо ифтоп. (Для запуска на клиенте.)

    • Я обнаружил, что запуск сложно разобрать из-за слишком большого количества живых изменений. Так что мне предложили попробовать маршрут получить 192.0.2.0 (который показывает используемый интерфейс, например, интерфейс: утун2), а затем работает ifconfig <интерфейс> (например., ifconfig utun2) на macOS. Последний должен отображать частный IP-адрес клиента (однорангового узла WireGuard), например, 10.103.213.11, подтверждая, что трафик идет через интерфейс WG. Это немного, но это начало.

    • ОБНОВЛЕНИЕ: трассировка гениален для этого! Например, трассировка 8.8.8.8. (Совет шляпы Криспусу Камау.)

  • завиток ipinfo.io чтобы проверить свой IP-адрес с включенным VPN. (Для запуска на клиенте.)

СВЯЗАННЫЕ С:

Рейтинг:0
флаг cn

(На основе превосходного исследования Криспуса Камау. Вайргард VPN учебники для Типичная установка и Цепная установка, кажется, у меня может быть решение (непроверенный!) в формате, который показывает, как можно работать с несколько необычными/сложными настройками, или, по крайней мере, дает вам представление. Большое спасибо СК!)

С помощью: https://github.com/iamckn/chained-wireguard-ansible


Как это работает:

  • Клиент (vpn0) 10.200.200.0/24 (WG0) - Посредник (ворота0) 10.100.100.0/24 (WG0) Ворота (WG0) ▪ Общедоступный Интернет

  • Предполагается, что Unbound настроен как на посреднике, так и на шлюзе для локального разрешения DNS.

Конфигурация ворот

Настройте интерфейс VPN шлюза (WG0).

Файл: /etc/wireguard/wg0.conf

# СЕРВЕР

[Интерфейс] # Ворота
Приватный ключ = GATE_PRIVATE_KEY
Адрес = 10.100.100.1/24
ListenPort = 53701
Сохранение конфигурации = ложь

# КЛИЕНТЫ

[Первый] # Посредник
Публичный ключ = MIDDLEMAN_PUBLIC_KEY
PresharedKey = MIDDLEMAN_PRESHARED_KEY
Разрешенные IP-адреса = 10.0.0.0/8

Конфигурация брандмауэра. команды:

# Отслеживание VPN-соединения
## Отследить входную цепочку
iptables -A INPUT -m conntrack --ctstate СВЯЗАННО,УСТАНОВЛЕНО -j ПРИНЯТЬ
## Следить за цепочкой переадресации
iptables -A FORWARD -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ

# Разрешить входящие соединения WireGuard/VPN-трафик на прослушиваемом порту
iptables -A INPUT -p udp -m udp --dport 53701 -m conntrack --ctstate NEW -j ПРИНЯТЬ

# Разрешить как TCP, так и UDP рекурсивный DNS-трафик
iptables -A INPUT -s 10.100.100.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ПРИНЯТЬ
iptables -A INPUT -s 10.100.100.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ПРИНЯТЬ

# Разрешить пересылку пакетов, которые остаются в VPN-туннеле
iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ПРИНЯТЬ

# Настраиваем НАТ
iptables -t nat -A POSTROUTING -s 10.100.100.0/24 -o enp7s0 -j ​​MASQUERADE

Поднимите интерфейс VPN шлюза и включите автоматический перезапуск службы WireGuard при загрузке:

wg-быстро wg0
systemctl включить wg-quick@wg0

Конфигурация посредника

Настройте интерфейс посредника, обращенный к воротам (ворота0). Здесь посредник выступает в роли клиента.

Файл: /etc/wireguard/gate0.conf

[Интерфейс] # Посредник
Приватный ключ = MIDDLEMAN_PRIVATE_KEY
Адрес = 10.100.100.2/32
DNS = 10.100.100.1
Сохранение конфигурации = ложь

# РАВНИКИ

[Узел] # Ворота
Публичный ключ = GATE_PUBLIC_KEY
PresharedKey = MIDDLEMAN_PRESHARED_KEY
Конечная точка = GATE_PUBLIC_IP:53701
Разрешенные IP-адреса = 0.0.0.0/0
#PersistentKeepalive = 21

Настройте клиентский интерфейс посредника (WG0). Здесь посредник выступает в роли сервера.

Файл: /etc/wireguard/wg0.conf

# СЕРВЕР

[Интерфейс] # Посредник
Приватный ключ = MIDDLEMAN_PRIVATE_KEY
Адрес = 10.200.200.1/24
ListenPort = 53701
Сохранение конфигурации = ложь

# КЛИЕНТЫ

[Узел] # ПК
Публичный ключ = CLIENT_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Разрешенные IP-адреса = 10.200.200.2/32

Конфигурация брандмауэра. команды:

iptables -A INPUT -m conntrack --ctstate СВЯЗАННО,УСТАНОВЛЕНО -j ПРИНЯТЬ
iptables -A FORWARD -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ

iptables -A INPUT -p udp -m udp --dport 53701 -m conntrack --ctstate NEW -j ПРИНЯТЬ

iptables -A INPUT -s 10.200.200.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ПРИНЯТЬ
iptables -A INPUT -s 10.200.200.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ПРИНЯТЬ

iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ПРИНЯТЬ

iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o enp41s0 -j ​​MASQUERADE

# Настроить NAT цепочки VPN
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -j SNAT --to-source 10.100.100.2

Настройте маршрутизацию политики на посреднике для маршрутизации трафика от клиента к шлюзу.

echo "1 посредник" >> /etc/iproute2/rt_tables

# Перенаправляем весь трафик на гейт
ip route add 0.0.0.0/0 dev gate0 table middleman

# ИЛИ пересылать трафик только на 4.2.2.2 (например), на гейт
#ip route add 4.2.2.2/32 dev gate0 table middleman

IP-правило добавления от посредника поиска 10.200.200.0/24

Поднимите интерфейсы WireGuard посредника и включите автоматический перезапуск службы WireGuard при загрузке:

wg-быстро до ворот0
systemctl включить wg-quick@gate0

wg-быстро wg0
systemctl включить wg-quick@wg0

Конфигурация клиента

Файл: /etc/wireguard/vpn0.conf

[Интерфейс]
Приватный ключ = CLIENT_PRIVATE_KEY
Адрес = 10.200.200.2/32
DNS = 10.200.200.1

# РАВНИКИ

[Первый] # Посредник
Публичный ключ = MIDDLEMAN_PUBLIC_KEY
PresharedKey = CLIENT_PRESHARED_KEY
Конечная точка = MIDDLEMAN_PUBLIC_IP:53701
Разрешенные IP-адреса = 0.0.0.0/0
#PersistentKeepalive = 21

Наконец, активируйте WireGuard на клиенте.

Рейтинг:0
флаг us

ответ its_me отлично работает для меня. Ниже приведены некоторые изменения, которые я внес для автоматизации создания/удаления таблицы маршрутов, iptables и правил ip. Автоматизация происходит, когда интерфейс wireguard поднимается и опускается. Обратите внимание, что в этой конфигурации я не использую ipv6 или ufw:

Сервер1:

# Добавляем таблицу маршрутов для этого интерфейса
PreUp = эхо 1 wireguard2x >> /etc/iproute2/rt_tables
# Добавьте правило ip, чтобы указать этому интерфейсу новую таблицу маршрутов
PreUp = ip rule add iif %i table wireguard2x
# Настраиваем iptables
PostUp = iptables -A FORWARD -i %i -j ПРИНЯТЬ
PostUp = iptables -A FORWARD -o %i -j ПРИНЯТЬ

# Удаляем iptables
PostDown = iptables -D FORWARD -i %i -j ПРИНЯТЬ
PostDown = iptables -D FORWARD -o %i -j ПРИНЯТЬ
# Найти и удалить правило ip
PostDown = ip правило | grep "из всех iif %i" | вырезать -d: -f1 | xargs -L1 приоритетное правило IP-адреса
# Удалить таблицу ip
PostDown = sed -i '/wireguard2x/d' /etc/iproute2/rt_tables

Сервер2:

PostUp = iptables -A FORWARD -i %i -j ПРИНЯТЬ
PostUp = iptables -A FORWARD -o %i -j ПРИНЯТЬ
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ПРИНЯТЬ
PostDown = iptables -D FORWARD -o %i -j ПРИНЯТЬ
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
флаг cn
Да, я знаю о PostUp и PostDown в конфигурации WG. Мне просто нравится, чтобы все мои правила брандмауэра (включая правила системы и других приложений) находились в одном месте, и поэтому я предпочитаю добавлять их вручную.
Aman Juman avatar
флаг ng
@computerguy1 Я попробовал вашу конфигурацию, и она может подключиться к Server-II, но в итоге потеряла доступ по SSH к Server-I. Более того, я не могу подключиться к серверу-I с помощью любого клиента WireGuard.

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

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