Маршрутизация пакетов от одного клиента WireGuard к другому с использованием iptables

Вопрос или проблема

Вот краткое изложение того, что я хочу достичь:
Телефон (192.168.1.245) -> Raspberry Pi 1 (wg0 10.8.0.3, wlan0 192.168.1.174) -> VPS (wg0 10.8.0.1 VPN сервер) -> Raspberry Pi 2 (wg0 10.8.0.110, wlan0 192.168.0.8) -> Интернет
Я хочу, чтобы соединения, установленные телефоном, использовали Raspberry Pi 1 в качестве шлюза. Пакеты должны быть перенаправлены на Raspberry Pi 2 через сеть 10.8.0.0/24. Затем они должны быть NATированы в интернет, чтобы телефон думал, что у него есть публичный IP-адрес Raspberry Pi 2 (wlan0 является WAN-интерфейсом).
Сначала я думал, что мне нужны iptables, и попробовал следующее:
PREROUTING
-i wlan0 -s 192.168.1.0/24 -j DNAT –to-destination 10.8.0.110
FORWARD
-i wlan0 -s 192.168.1.0/24 -d 10.8.0.110/32 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT
-i wg0 -m state –state RELATED,ESTABLISHED -j ACCEPT
POSTROUTING
-o wg0 -d 10.8.0.110/32 -j SNAT –to-source 10.8.0.3

Для Raspberry Pi 1.
У VPS были следующие настройки:
FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

Но потом я понял, что эти пакеты приходят на 10.8.0.110, думая, что это конечный пункт назначения, поэтому я получал отказ в соединении, когда тестировал что-то вроде telnet google.com 443.
Затем я попробовал следующее для Raspberry Pi 1:
FORWARD
-i wlan0 -o wg0 -j ACCEPT
-i wg0 -o wlan0 -m state –state RELATED,ESTABLISHED -j ACCEPT

и для VPS:
FORWARD
-i wg0 -s 192.168.1.0/24 -o wg0 -j ACCEPT
-i wg0 -o wg0 -m state –state RELATED,ESTABLISHED -j ACCEPT

И эти пакеты также не доходят до Raspberry Pi 2.
С помощью GPT4 я проверил, что могу использовать маршрутизацию на основе политики, добавив IP-правила и маршруты. Я понимаю, что пакеты, которые приходят на Raspberry Pi 1 по 192.168.1.0/24, должны быть перенаправлены непосредственно на 10.8.0.110, не изменяя адрес назначения.
GPT4 предложил следующее:
# Создать новую таблицу маршрутизации
echo “200 custom” >> /etc/iproute2/rt_tables

# Добавить правило для использования этой таблицы для трафика с 192.168.1.0/24
ip rule добавление from 192.168.1.0/24 lookup custom

# Добавить маршрут в пользовательскую таблицу для перенаправления трафика на 10.8.0.110
ip route add default via 10.8.0.110 dev wg0 table custom

Это не сработало, и по какой-то причине сделало соединение ssh Raspberry Pi 1 очень медленным.
Вот маршруты Raspberry Pi 1:
default via 192.168.1.1 dev wlan0 proto dhcp src 192.168.1.174 metric 600
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.3
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-352622acd722 proto kernel scope link src 172.18.0.1
172.19.0.0/16 dev br-e7d4e060a024 proto kernel scope link src 172.19.0.1
172.20.0.0/16 dev br-b97d3a35bbf0 proto kernel scope link src 172.20.0.1
192.168.0.0/24 via 192.168.1.1 dev wlan0 proto static metric 600
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.174 metric 600

На данный момент я не уверен, что попробовать, так как я не эксперт в сетях. Спасибо заранее за советы.
PS: На Raspberry Pi 1 и VPS работают контейнеры Docker, для Docker настроены правила iptables. Я думаю, что это не должно мешать.

Ответ или решение

Подробное руководство по маршрутизации пакетов между клиентами WireGuard с использованием iptables и Policy Based Routing

В этой статье мы подробно рассмотрим процесс маршрутизации сетевых пакетов между клиентами WireGuard, используя iptables и Policy Based Routing. Рассмотрим сценарий, в котором телефон (192.168.1.245) будет подключен через Raspberry Pi 1 к удаленному серверу VPN (VPS), а затем будет осуществляться маршрутизация через Raspberry Pi 2 (10.8.0.110). Целью является обеспечить, чтобы пакеты от телефона направлялись через Raspberry Pi 1 к Raspberry Pi 2 и затем в интернет, при этом источником пакетов будет IP-адрес Raspberry Pi 2.

Сетевой план

  1. Клиент: Телефон (192.168.1.245) подключается к Raspberry Pi 1 (wg0 10.8.0.3, wlan0 192.168.1.174).
  2. VPN Сервер: VPS (wg0 10.8.0.1) – принимает пакеты от Raspberry Pi 1 и передает их дальше.
  3. Клиент: Raspberry Pi 2 (wg0 10.8.0.110, wlan0 192.168.0.8) – получает пакеты через VPN и осуществляет выход в интернет.

Шаг 1: Конфигурация iptables на Raspberry Pi 1

На Raspberry Pi 1 вам нужно настроить iptables, чтобы он корректно маршрутизировал пакеты от телефона к Raspberry Pi 2:

# Очистка текущих правил iptables
iptables -F
iptables -t nat -F
iptables -X

# Прием пакетов от клиента по wlan0 и маршрутинг в wg0
iptables -A FORWARD -i wlan0 -o wg0 -j ACCEPT
iptables -A FORWARD -i wg0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# NAT для исходящих пакетов
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

Шаг 2: Конфигурация iptables на VPS

На VPS необходима следующая конфигурация iptables:

# Политика по умолчанию
iptables -P FORWARD ACCEPT

# Принятие пакетов от WireGuard
iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT

Шаг 3: Настройка Policy Based Routing на Raspberry Pi 1

Для реализации Policy Based Routing вам необходимо создать новую таблицу маршрутизации и настроить правила:

  1. Откройте файл для редактирования:
sudo nano /etc/iproute2/rt_tables
  1. Добавьте новую таблицу:
200 custom
  1. Добавьте правила для новой таблицы:
ip rule add from 192.168.1.0/24 lookup custom
ip route add 10.8.0.0/24 dev wg0 table custom

Шаг 4: Проверьте маршруты и соединения

После настройки убедитесь, что все маршруты корректны. Вы можете использовать команду ip route для проверки маршрутов:

ip route

Также рекомендуется проверить соединение между устройствами с помощью команды ping:

ping 10.8.0.110  # С Raspberry Pi 1 на Raspberry Pi 2
ping 192.168.0.8  # С Raspberry Pi 1 на интернет

Шаг 5: Проверка состояния подключения

Если у вас возникают проблемы с соединением или задержками (как приводилось в вашем описании), вам следует убедиться, что:

  • Установлены все необходимые пакеты для поддержки WireGuard.
  • Конфигурация сети Raspberry Pi 1 и VPS не конфликтует с существующими настройками Docker.
  • Убедитесь, что firewall (iptables) не блокирует необходимые порты и протоколы.

Заключение

Маршрутизация пакетов между клиентами WireGuard может быть сложной задачей и требует точной настройки маршрутов и соответствующих правил iptables. Приведенные шаги помогут вам правильно настроить передачу пакетов от телефона через Raspberry Pi 1 и VPS к Raspberry Pi 2. Если у вас возникают дополнительные проблемы, рекомендуется просмотреть логи и статистику сетевого трафика для диагностики.

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

Оцените материал
Добавить комментарий

Капча загружается...