- Вопрос или проблема
- Ответ или решение
- Подробное руководство по маршрутизации пакетов между клиентами WireGuard с использованием iptables и Policy Based Routing
- Сетевой план
- Шаг 1: Конфигурация iptables на Raspberry Pi 1
- Шаг 2: Конфигурация iptables на VPS
- Шаг 3: Настройка Policy Based Routing на Raspberry Pi 1
- Шаг 4: Проверьте маршруты и соединения
- Шаг 5: Проверка состояния подключения
- Заключение
Вопрос или проблема
Вот краткое изложение того, что я хочу достичь:
Телефон (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.
Сетевой план
- Клиент: Телефон (192.168.1.245) подключается к Raspberry Pi 1 (wg0 10.8.0.3, wlan0 192.168.1.174).
- VPN Сервер: VPS (wg0 10.8.0.1) – принимает пакеты от Raspberry Pi 1 и передает их дальше.
- Клиент: 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 вам необходимо создать новую таблицу маршрутизации и настроить правила:
- Откройте файл для редактирования:
sudo nano /etc/iproute2/rt_tables
- Добавьте новую таблицу:
200 custom
- Добавьте правила для новой таблицы:
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. Если у вас возникают дополнительные проблемы, рекомендуется просмотреть логи и статистику сетевого трафика для диагностики.
Не забудьте, что настройка сетевых правил требует аккуратности, и важно периодически проверять и тестировать вашу конфигурацию для обеспечения стабильной работы сети.