Cómo reenviar tráfico en varios puertos a través de una VPN Wireguard usando iptables/ufw

Cómo reenviar tráfico en varios puertos a través de una VPN Wireguard usando iptables/ufw

Tengo 2 máquinas ejecutando ubuntu 22.04, las llamaremos servidor y proxy. El proxy es un vps con una IP pública estática y el servidor se ejecuta detrás de un nat. Quiero enrutar todo el tráfico en algunos puertos del proxy al servidor.

He configurado un VPN Wireguard entre los 2 y ambos pueden hacer ping entre sí, si enrosco la dirección VPN del servidor desde el proxy obtengo la respuesta html correcta y configuro nginx en el proxy (que no es el final previsto). solución porque me gustaría enrutar otros servicios que no son http/https) me permite pasar proxy a la IP vpn y una vez más obtener la respuesta HTML correcta.

Pero no he podido configurar el reenvío usando iptables/ufw. Esta es mi configuración de protección de cables que incluye las reglas de enrutamiento de iptables en la interfaz activa.

Apoderado:

[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

Servidor:

[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

Al ejecutar sudo iptables-save -c se devuelve lo siguiente

# 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

La cantidad de paquetes y bytes [4:208]aumenta cada vez que intento acceder al proxy a través del navegador web.

Respuesta1

He estado luchando para que funcione un reenvío de puertos similar a través de Wireguard a un servicio detrás de un NAT. Mi configuración es similar a la tuya, pero hay dos cambios que debes intentar para que funcione.

En primer lugar, descubrí que además de la regla DNAT, necesitaba una regla SNAT. Podrías intentar algo como esto:

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

En segundo lugar, creo que deberías usar PostUp/PreDown aquí en lugar de PreUp/PostDown. Las reglas de enrutamiento no parecen aplicarse si la interfaz aún no está activa cuando ejecuta iptables, por lo que PostUp se asegura de que la interfaz esté en su lugar primero.

En conjunto, y simplificando un poco mediante el uso de multipuerto, puede probar la siguiente configuración en el proxy:

[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

Espero no haber cometido ningún error tipográfico; es mejor comprobarlo con atención.

información relacionada