Маршрутизация траффика wireguard
У меня есть VPS c выделенным IP - На нем установлен wireguard
В локальной сети дома есть сервер, на нем докер и web приложения
В данный момент весь трафик (домашнего сервера) идет через туннель WG VPS, но я хочу чтобы основной шлюз (домашнего сервера) был шлюз моего домашнего интернета (192.168.1.1.)
При этом я хочу иметь доступ по домену, (привязанному к ip VPS), к моему домашнему серверу Подскажите как это можно сделать?
Приложу примитивную схему
VPS
[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = 51820
PrivateKey = key
PostUp = iptables -I INPUT -p udp --dport 51820 -j ACCEPT
PostUp = iptables -I FORWARD -i ens3 -o wg0 -j ACCEPT
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostUp = ip6tables -I FORWARD -i wg0 -j ACCEPT
PostUp = ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D INPUT -p udp --dport 51820 -j ACCEPT
PostDown = iptables -D FORWARD -i ens3 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PostDown = ip6tables -D FORWARD -i wg0 -j ACCEPT
PostDown = ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PreUp = iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 80 -j DNAT --to-destination 10.66.66.2:80
PostDown = iptables -t nat -D PREROUTING -i ens3 -p tcp --dport 80 -j DNAT --to-destination 10.66.66.2:80
PreUp = iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j DNAT --to-destination 10.66.66.2:443
PostDown = iptables -t nat -D PREROUTING -i ens3 -p tcp --dport 443 -j DNAT --to-destination 10.66.66.2:443
### Client home server
[Peer]
PublicKey =key
PresharedKey = key
AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128
Home server
[Interface]
PrivateKey = key
Address = 10.66.66.2/32,fd42:42:42::2/128
#DNS = 192.168.1.1,8.8.8.8
PreUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0
########
PostUp = iptables -t nat -A POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADE
PostUp = iptables -I FORWARD -i wlp2s0 -o %i -s 172.0.0.0/0 -d 10.66.66.0/24 -j ACCEPT # разрешат компьютерам сети отправлять пакеты VPN-клиентам
PostUp = iptables -I FORWARD -i %i -o wlp2s0 -s 10.66.66.0/24 -d 172.0.0.0/0 -j ACCEPT # разрешат компьютерам сети получать пакеты от VPN-клиентов
PostDown = iptables -D FORWARD -i wlp2s0 -o %i -s 172.0.0.0/0 -d 10.66.66.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i %i -o wlp2s0 -s 10.66.66.0/24 -d 172.0.0.0/0 -j ACCEPT
[Peer]
PublicKey = key
PresharedKey = key
Endpoint = 123.123.123.123:51820
AllowedIPs = 0.0.0.0/0,::/0
PersistentKeepalive = 25
Я нашел решение! Оно оказалось простым и описано в:
https://www.procustodibus.com/blog/2022/09/wireguard-port-forward-from-internet/
Проблема была в том что я тестировал с телефона и веб приложения не открывались. Нужно было очистить кэш браузера или открыть в приватном режиме!
Конфигурация домашнего сервера теперь выглядит следующим образом:
[Interface]
PrivateKey = key
Address = 10.66.66.2/32
PreUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0
Table = 123
PreUp = ip rule add from 10.66.66.2 table 123 priority 456
PostDown = ip rule del from 10.66.66.2 table 123 priority 456
[Peer]
PublicKey = key
PresharedKey = key
Endpoint = 123.123.123.123:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
При таком подходе вы сможете подключиться к веб-приложению на частном сервере с любого узла в Интернете, используя имя хоста и порт публичного сервера (например, curl public.example.com:2000). Веб-приложение на частном сервере будет видеть оригинальный IP-адрес источника, но также сможет корректно отправлять ответы обратно через публичный сервер. Весь остальной трафик частного сервера, включая трафик, исходящий с самого частного сервера, будет продолжать использовать основную таблицу маршрутизации сервера, не затронутую конфигурацией WireGuard.