Как перенаправить трафик на различные порты через Wireguard VPN с помощью iptables/ufw

Как перенаправить трафик на различные порты через Wireguard VPN с помощью iptables/ufw

У меня есть 2 машины с Ubuntu 22.04, назовем их сервером и прокси. Прокси — это vps со статическим публичным IP, а сервер работает за NAT. Я хочу направить весь трафик на некоторые порты прокси на сервер.

Я настроил Wireguard VPN между этими двумя устройствами, и они оба могут пинговать друг друга. Если я ввожу curl-адрес VPN-сервера с прокси-сервера, я получаю правильный HTML-ответ, а настройка nginx на прокси-сервере (что не является окончательным решением, поскольку я хотел бы маршрутизировать другие службы, которые не являются http/https) позволяет мне выполнить proxy_pass на IP-адрес VPN и снова получить правильный HTML-ответ.

Но я не смог настроить переадресацию с помощью iptables/ufw. Это моя конфигурация Wireguard, которая включает правила маршрутизации iptables на интерфейсе up.

Прокси:

[Interface]
# Proxy with static ip
Address = 10.250.0.1/32
ListenPort = 23456
PrivateKey = {private key}
# packet forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# port forwarding
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.250.0.2
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.250.0.2
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.250.0.2
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.250.0.2
      
[Peer]
# main_server behind nat
PublicKey = {pub key}
AllowedIPs = 10.250.0.2/32

Сервер:

[Interface]
Address = 10.250.0.2/32
ListenPort = 23456
PrivateKey = {priv key}

[Peer]
PublicKey = {pub key}
Endpoint = {proxy server ip}:23456
AllowedIPs = 10.250.0.0/16
PersistentKeepalive = 25

Запуск sudo iptables-save -c возвращает следующее

# Completed on Wed Aug 24 17:01:57 2022
# Generated by iptables-save v1.8.7 on Wed Aug 24 17:01:57 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
[0:0] -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.250.0.2
[4:208] -A PREROUTING -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.250.0.2
COMMIT

Количество пакетов и байтов [4:208]увеличивается каждый раз, когда я пытаюсь получить доступ к прокси через веб-браузер.

решение1

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

Во-первых, я обнаружил, что в дополнение к правилу DNAT мне нужно правило SNAT. Вы можете попробовать что-то вроде этого:

iptables -t nat -A POSTROUTING -d 10.250.0.2 -o wg0 -p tcp --dport 80 -j SNAT --to-source 10.250.0.1

Во-вторых, я думаю, что вам следует использовать PostUp/PreDown здесь вместо PreUp/PostDown. Правила маршрутизации, похоже, не применяются, если интерфейс еще не запущен, когда вы запускаете iptables, поэтому PostUp сначала обеспечивает, чтобы интерфейс был на месте.

Обобщая все это и немного упрощая с помощью многопортов, вы можете попробовать следующую конфигурацию на прокси-сервере:

[Interface]
# Proxy with static ip
Address = 10.250.0.1/32
ListenPort = 23456
PrivateKey = {private key}
# packet forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# port forwarding
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to- destination 10.250.0.2
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to- destination 10.250.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.250.0.2 -o wg0 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 10.250.0.1
PreDown = iptables -t nat -D POSTROUTING -d 10.250.0.2 -o wg0 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 10.250.0.1
  
[Peer]
# main_server behind nat
PublicKey = {pub key}
AllowedIPs = 10.250.0.2/32

Надеюсь, я не допустил никаких опечаток. Лучше внимательно все перепроверить.

Связанный контент