Configurar correctamente iptables para dos capas de reenvío de puertos: servidor externo conectado al servidor local a través de VPN

Configurar correctamente iptables para dos capas de reenvío de puertos: servidor externo conectado al servidor local a través de VPN

Tenía un servidor de Minecraft ejecutándose en un VPS (Debian 10), pero el VPS era demasiado débil para manejarlo, así que quería usar un servidor local más robusto para ejecutarlo (Ubuntu 22.04). El VPS aloja un servidor OpenVPN y el servidor local se conecta como el único cliente. El VPS está en 10.8.0.1 y el servidor local está en 10.8.0.6 (192.168.1.185 en la red local).

Utilicé reglas de iptables para reenviar paquetes VPN tun0 en 10.8.0.6:25565 a la IP del servidor local. Esto funciona bien: puedo consultar el servidor de Minecraft desde el VPS. Luego configuré el mismo conjunto de reglas (con las IP relevantes intercambiadas, por supuesto) en el VPS para reenviar conexiones desde vps_external_ip:25565 a 10.8.0.6:25565. Esta regla reenvía los paquetes hasta el servidor local, pero la conexión siempre se agota. Lo extraño es que ni las conexiones que funcionan desde VPS -> servidor local ni externas -> VPS -> servidor local aumentan los contadores de paquetes de ninguna de las reglas de POSTROUTING MASQUERADE, pero sí lo hacen para las reglas de PREROUTING. Hay conexiones TCP/UDP que simplemente se agotan cuando se accede al VPS en eth0:25565, no hay errores de conexión rechazada.

El reenvío de IPV4 está habilitado en ambas máquinas y lo intenté con UFW deshabilitado, pero no tuve suerte.

Configuré una regla de registro en NAT POSTROUTE de ambos servidores, pero no estoy muy seguro de cómo solucionar el problema porque no pude encontrar ninguna.

Salida de registro POSTROUTE (iptables -t nat -I POSTROUTING -j LOG --log-prefix "NAT:" --log-level 7)

##### VPS
Apr 23 20:52:02 vpskernel: [1552376.122382] NAT1:IN= OUT=tun0 SRC=<my ip> DST=10.8.0.6 LEN=48 TOS=0x08 PREC=0x20 TTL=114 ID=21284 DF PROTO=TCP SPT=1806 DPT=25565 WINDOW=64240 RES=0x00 SYN URGP=0

#### Local server
<could not find any relevant logs grepping /var/log/kern.log for NAT1 and there were no logs at all for tun0>

Utilicé /etc/ufw/before.rules para cada servidor para configurar las reglas de iptables.
VPS /etc/ufw/before.rules:

# START OPENVPN RULES
# NAT table rules
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# END OPENVPN RULES

-A PREROUTING -i eth0 -d <vps external IP> -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A PREROUTING -i eth0 -d <vps external IP> -p udp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A POSTROUTING -s 10.0.0.0/8 ! -d 10.0.0.0/8 -j MASQUERADE
COMMIT

Servidor local /etc/ufw/before.rules:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -d 10.8.0.6 -p tcp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
-A PREROUTING -i tun0 -d 10.8.0.6 -p udp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
# setup routing
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
COMMIT

Las reglas PREROUTING están funcionando, pero los contadores de reglas POSTROUTING no aumentan.

Ejecuté tcpdump en 25565 para depurar. Veo que entran los paquetes, pero no veo ningún retorno en ninguna interfaz cuando me conecto externamente. Cuando hago una consulta directamente desde el VPS, veo que el servidor local responde en tun0. Parece que el problema es que el servidor local está intentando responder directamente a mi IP en en01 en lugar del VPS en tun0, pero no estoy seguro de cómo solucionarlo.

VPS tcpdump:

# eth 0
21:43:39.972647 IP my_ip.2729 > vps_ip.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0
# tun0
21:43:39.972739 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0

tcpdump del servidor local:

#tun0
21:43:39.972566 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1356,nop,nop,sackOK], length 0

#en01
21:43:39.972618 IP 10.8.0.6.25565 > my_ip.2729: Flags [S.], seq 2141764446, ack 1483515508, win 64240, options [mss 1460,nop,nop,sackOK], length 0

Respuesta1

Finalmente lo descubrí. La mayoría de las guías de reenvío de puertos en línea tenían una regla POSTROUTING que no funciona para OpenVPN (o para mi situación). En lugar de permitir IP locales como origen con un destino que no fuera una IP local, tuve que crear la regla de posenrutamiento para que cualquier cosa que no fuera una IP local se reescribiera como una IP VPS tun0.

VPS /etc/ufw/before.rules (s y d intercambiados):
-A POSTROUTING -d 10.0.0.0/8 ! -s 10.0.0.0/8 -j MASQUERADE -t nat

Además, la regla POSTROUTING sólo era necesaria en el VPS.

información relacionada