Puncte:0

Iptables Port-forwarding păstrând IP-ul clientului

drapel fr

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ă.

Puncte:0
drapel us

Nu puteți face acest lucru cu IPTables. Pentru ca redirecționarea bidirecțională a pachetelor să funcționeze corect, adresa IP sursă a pachetelor trimise de la VPS-ul dvs. trebuie să conțină adresa VPS. În caz contrar, pachetele de răspuns nu ar fi trimise către VPS, care le transmite clienților.

Aveți nevoie de suport pentru protocolul de nivel 7 pentru a transmite adresa IP originală către aplicația dvs. În HTTP / HTTPS, acest lucru se face după cum urmează:

  1. Proxy-ul invers nginx funcționează pe VPS-ul dvs.
  2. Proxy-ul invers adaugă antet X-Forwarded-For: <clienttip> pentru a solicita trimite la serverul de origine.
  3. Serverul Origin citește antetul și îl folosește ca adresă IP a clientului în loc să folosească adresa IP asociată cu socket-ul TCP.

O altă posibilitate este să utilizați proxy SOCKS între VPS și serverul de origine. Proxy SOCKS încapsulează traficul de la client și adaugă metadate suplimentare, cum ar fi adresa IP a clientului.

AAron avatar
drapel fr
Serverul de joc este tot traficul UDP. Funcționează `X-Forwarded-For` și pentru fluxurile UDP?
drapel us
Dacă aveți implementat un protocol de nivel 7 care are semantică similară HTTP cu anteturi etc., atunci da. Dar dacă implementați un protocol de aplicație personalizat pe deasupra UDP, atunci acel protocol trebuie să suporte acest mecanism și, de asemenea, trebuie să implementați proxy-ul pentru acel protocol. Din moment ce ați menționat folosirea nginx `proxy_pass`, am presupus că utilizați protocolul similar HTTP.
AAron avatar
drapel fr
Adică, din câte știu eu, este UDP standard de mlaștină, singurul lucru pe care îl fac cu el este să-l redirecționez în altă parte.În nginx.conf meu, după paranteza de închidere pentru blocul de server implicit, am asta: `stream { Server { asculta 28015 udp; proxy_pass my_ip:28015; proxy_bind $remote_addr:$port_la distanță transparent; răspunsuri_proxy 0; } }`
drapel us
OK, atunci acesta este proxy-ul bytestream pe care nginx îl oferă. Acesta este un concept de releu de nivel 4 și nu are funcționalitatea pe care o căutați. Mi se pare că singurele voastre opțiuni sunt să comutați la lucrul prin HTTP,/HTTPS sau să implementați funcționalități în protocolul UDP care permite unui proxy personalizat să adauge IP-ul clientului la mesajele de protocol. De asemenea, trebuie să implementați proxy-ul personalizat. Cu toate acestea, deoarece aceasta este o funcționalitate comună, există probabil cadre de protocol care au această funcționalitate.
AAron avatar
drapel fr
Nginx are funcționalitatea pe care o caut?
AAron avatar
drapel fr
Vreau să clarific că nu fac propria mea implementare a protocolului, nu este jocul meu, ci doar un joc cu opțiuni pentru a găzdui un server dedicat pe cont propriu. Deci, dacă funcționalitatea nu există în UDP și/sau nginx cu unul sau mai multe module compilate, atunci efectiv nu este posibil.
drapel us
Protocolul de aplicație trebuie să susțină funcționalitatea. nginx poate acționa doar ca un proxy bytestream, nu poate implementa nicio funcționalitate suplimentară ca aceasta.
AAron avatar
drapel fr
Bine, se pare că mă voi ocupa fie că IP-urile sunt aceleași și mă voi ocupa de interdicțiile bazate pe IP pe VPS; sau doar mușcă glonțul și găzduiește totul într-un VPS la distanță. Am opțiunea de a face un tunel VPN de la vps la serverul de jocuri, dacă asta face diferența. Transparența IP nu este posibilă *deloc* cu iptables, sau pur și simplu nu în cazul meu de utilizare? Am citit articole care discută despre cum ar fi regulile de redirecționare la ambele capete, dar le-am cam acoperit, deoarece nu credeam că se aplică. Cu siguranță ajung la punctul în care sucul nu merită totuși stors.
drapel us
IPTables operează numai pe stratul 3 și 4 al stivei de rețea și nu există niciun mecanism pentru a avea o astfel de transparență a adresei IP pe care o căutați. Stratul de aplicație trebuie să implementeze această caracteristică. Probabil că nici un tunel VPN nu ajută.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.