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.
Você não pode fazer isso com IPTables. Para que o encaminhamento de pacotes bidirecional funcione corretamente, o endereço IP de origem dos pacotes enviados de seu VPS deve conter o endereço VPS. Caso contrário, os pacotes de resposta não seriam enviados ao VPS, que os encaminha aos clientes.
Você precisa de suporte ao protocolo de camada 7 para retransmitir o endereço IP original para seu aplicativo. Em HTTP/HTTPS, isso é feito da seguinte forma:
X-Forwarded-For: <clientip>
à solicitação que envia ao servidor de origem.Outra possibilidade é usar o proxy SOCKS entre o VPS e o servidor de origem. O proxy SOCKS encapsula o tráfego do cliente e adiciona metadados adicionais, como o endereço IP do cliente.