TL;DR: Como posso obter o IP do cliente conectado a um VPS hospedado remotamente para ser o IP que é encaminhado/natted, via iptables, para um servidor de jogos rodando em minha casa?
Eu tenho um servidor de jogos Rust que estou hospedando em minha casa. Eu quero que isso seja público, mas não quero necessariamente dar meu endereço IP para todos. Então estou alugando um pequeno VPS que pretendo usar basicamente como proxy reverso. Atualmente, estou usando o nginx para encaminhar o tráfego por uma VPN de servidor clinet, que funciona bem. No entanto, no servidor do jogo, o IP de cada jogador é o endereço do túnel do VPS, não o IP do cliente real. Eu tentei usar proxy_pass $remote_addr:28015 transparancy; proxy_responses 0
na minha configuração do nginx, nenhuma alteração. Então eu mudei para fazê-lo via iptables.
Eu posso fazer funcionar 99% do jeito que eu quero, fazendo exatamente isso:
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 28015 -j NAT --to-destination my_ip:28015
iptables -t nat -A PREROUTING -p udp --dport 28015 -j NAT --to-destination my_ip:28015
iptables -t nat -A PREROUTING -p tcp --dport 28016 -j NAT --to-destination my_ip:28016
iptables -t nat -A PREROUTING -p udp --dport 28016 -j NAT --to-destination my_ip:28016
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp -d my_ip --dport 28015 -m state --state NOVO, ESTABELECIDO, RELACIONADO -j ACEITAR
iptables -A FORWARD -p ucp -d my_ip --dport 28015 -m state --state NOVO, ESTABELECIDO, RELACIONADO -j ACEITAR
ufw desativar
ufw ativar
vps reboot \
O que isso faz é basicamente o mesmo que o nginx, onde funciona bem, mas todos têm apenas o ip público do VPS (observe que a LAN e o endereço IP público do VPS são os mesmos). Se eu omitir a máscara, não funciona.
Algumas informações sobre a configuração:
VPS tem uma única interface: eth0
VPS está rodando Ubuntu 20.04
Na minha casa, o modem está em modo passthru para pfsesne. No pfsense, tenho regras de encaminhamento de porta para passar 28015/28016 tcp/udp para gameserver
.
Nota lateral: não sei por que o nginx não funcionou para isso. Era quase como se o nginx não estivesse fazendo nada com a proxy_pass $remote_addr
diretiva.