TL;DR: Cum pot face ca IP-ul clientului să se conecteze la un VPS găzduit de la distanță să fie IP-ul care este redirecționat/nat, prin iptables, către un server de joc care rulează la mine acasă?
Am un server de jocuri Rust pe care îl găzduiesc acasă. Vreau ca asta să fie public, dar nu vreau neapărat să dau adresa mea IP tuturor. Așa că închiriez un VPS mic care intenționează să îl folosească practic ca proxy invers. În prezent, folosesc nginx pentru a redirecționa traficul printr-un VPN cu server clinet, care funcționează bine. Cu toate acestea, pe serverul de joc, IP-ul fiecărui jucător este cel al adresei de tunel a VPS-ului, nu IP-ul clientului real. Am incercat sa folosesc proxy_pass $remote_addr:28015 transparență; proxy_responses 0
în configurația mea nginx, nicio schimbare. Așa că am trecut apoi să o fac prin iptables.
Pot să funcționeze 99% așa cum vreau, făcând exact asta:
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 stare --state NOU, INSTABILIT, RELATED -j ACCEPT
iptables -A FORWARD -p ucp -d my_ip --dport 28015 -m stare --state NOU,STABILIT,LEGAT -j ACCEPT
ufw dezactivare
ufw activare
repornire vps \
Ceea ce face acest lucru este practic același cu nginx, unde funcționează bine, dar toată lumea are doar ip-ul public al VPS-ului (rețineți că LAN-ul și adresa IP publică a VPS-ului sunt aceleași). Daca omit masqurade, nu merge.
Câteva informații despre configurare:
VPS are o singură interfață: eth0
VPS rulează Ubuntu 20.04
La mine acasă, modemul este în modul passthru către pfsesne.Pe pfsense am reguli de redirecționare a porturilor pentru a transmite 28015/28016 tcp/udp la server de jocuri
.
Notă marginală:
Nu sunt sigur de ce nginx nu a funcționat pentru asta. Era aproape ca și cum nginx nu făcea nimic cu proxy_pass $adresă_la distanță
directivă.