Eu tinha um servidor minecraft rodando em um VPS (Debian 10), mas o VPS era muito fraco para lidar com isso, então eu queria usar um servidor local mais robusto para executá-lo (Ubuntu 22.04). O VPS hospeda um servidor OpenVPN e o servidor local se conecta como único cliente. O VPS está em 10.8.0.1 e o servidor local está em 10.8.0.6 (192.168.1.185 na rede local).
Usei regras de iptables para encaminhar pacotes VPN tun0 em 10.8.0.6:25565 para o IP do servidor local. Isso está funcionando bem: posso consultar o servidor Minecraft a partir do VPS. Em seguida, configurei o mesmo conjunto de regras (com IPs relevantes trocados, é claro) no VPS para encaminhar conexões de vps_external_ip:25565 para 10.8.0.6:25565. Esta regra encaminha os pacotes até o servidor local, mas a conexão sempre expira. O estranho é que nem as conexões funcionando de VPS -> servidor local nem externas -> VPS -> servidor local aumentam os contadores de pacotes de qualquer regra POSTROUTING MASQUERADE, mas sim para as regras PREROUTING. As conexões TCP/UDP simplesmente atingem o tempo limite ao atingir o VPS em eth0:25565, não há erros de conexão recusada.
O encaminhamento IPV4 está habilitado em ambas as máquinas e tentei com o UFW desabilitado, sem sorte.
Configurei uma regra de log no NAT POSTROUTE de ambos os servidores, mas não tenho certeza de como corrigir o problema, pois não consegui encontrar nenhuma.
Saída de log 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>
Usei /etc/ufw/before.rules para cada servidor para configurar as regras do 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
As regras PREROUTING estão funcionando, mas os contadores das regras POSTROUTING não estão aumentando.
Executei o tcpdump em 25565 para depurar. Vejo os pacotes chegando, mas não vejo nenhum retorno em nenhuma interface ao conectar externamente. Ao consultar diretamente do VPS, vejo o servidor local responder em tun0. Parece que o problema é que o servidor local está tentando responder diretamente ao meu IP em en01 em vez de ao VPS em tun0, mas não tenho certeza de como consertar isso.
TCPdump VPS:
# 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 do 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
Responder1
Finalmente descobri. A maioria dos guias de encaminhamento de porta on-line tinha uma regra POSTROUTING que não funciona para OpenVPN (ou para minha situação). Em vez de permitir IPs locais como origem com um destino que não fosse um IP local, tive que fazer a regra de pós-routeamento para qualquer coisa que não fosse um IP local para ser reescrito como um IP VPS tun0.
VPS /etc/ufw/before.rules (s e d trocados):
-A POSTROUTING -d 10.0.0.0/8 ! -s 10.0.0.0/8 -j MASQUERADE -t nat
Além disso, a regra POSTROUTING só era necessária no VPS.