Ceva foarte frecvent în gestionarea serverelor este redirecționarea traficului.
Să presupunem că avem un server cu anumite servicii rulate, dar din orice motiv schimbăm unul dintre aceste servicii (Nu știu, de exemplu pop3, care este portul 110) către alt server. Lucrul normal și cel mai frecvent ar fi să schimbați pur și simplu IP-ul din înregistrarea DNS, cu toate acestea, dacă cineva a folosit IP-ul în loc de subdomeniu, acesta va fi afectat.
Ce sa fac? ... simplu, redirecționați traficul primit de acel server prin acel port către alt server cu același port.
Cum începem să redirecționăm traficul?
Primul lucru este că trebuie să fi activat transmiterea pe server, pentru aceasta vom pune următoarele:
echo "1" > /proc/sys/net/ipv4/ip_forward
Puteți utiliza și această altă comandă, în cazul în care cea anterioară nu funcționează pentru dvs. (mi s-a întâmplat așa pe un CentOS):
sysctl net.ipv4.ip_forward=1
Apoi vom reporni rețeaua:
service networking restart
În distribuțiile RPM precum CentOS și altele, ar fi:
service nertwork restart
Acum vom trece la ceea ce este important, spuneți serverului iptables ce să redirecționați:
iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>
Cu alte cuvinte, și urmând exemplul pe care l-am menționat, să presupunem că dorim să redirecționăm tot traficul pe care îl primește serverul nostru prin portul 110 către alt server (ex: 10.10.0.2), care va primi în continuare traficul respectiv prin 110 (este același serviciu):
iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110
Serverul 10.10.0.2 va vedea că toate pachetele sau cererile provin de la adresa IP a clientului, în cazul în care doresc să înoate cererile, adică al doilea server vede că solicitările ajung cu IP-ul primului server (și în pe care aplicăm redirecționarea), ar fi, de asemenea, să punem această a doua linie:
iptables -t nat -A POSTROUTING -j MASQUERADE
Câteva întrebări și răspunsuri
În exemplu, am folosit același port în ambele ocazii (110), totuși pot redirecționa traficul de la un port la altul fără probleme. De exemplu, să presupunem că vreau să redirecționez traficul de la portul 80 la 443 pe un alt server, pentru aceasta ar fi:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443
Asta este iptables, pot folosi toți ceilalți parametri pe care îi cunoaștem, de exemplu, dacă dorim doar să redirecționăm traficul de la un anumit IP, ar fi adăugarea -s … De exemplu, voi redirecționa numai traficul care vine de la 10.10.0.51:
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Sau o întreagă rețea (/ 24):
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443
De asemenea, putem specifica interfața de rețea cu -i :
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Sfarsit!
Așa cum am spus deja, este iptables, puteți aplica ceea ce este deja cunoscut, astfel încât serverul să facă exact ceea ce doriți să facă 😉
Salutări!
Putem face acest lucru și dintr-un firewall care permite redirecționarea porturilor, nu? (aplicarea regulilor corespunzătoare).
Da, desigur, până la urmă un firewall precum Pfsense sau altele, folosește iptables din spate.
Pentru a fi exact, pfsense nu folosește iptables, ci pf, amintiți-vă că este un bsd în interior.
Oh, bine, răul meu!
Vă mulțumesc foarte mult pentru sfat 🙂
Am câteva îndoieli:
1 - Schimbarea este permanentă? sau se pierde la repornirea serverului?
2 - Am mai multe instanțe (să zicem A, B și C) pe aceeași subrețea. În cazul A, aplic regula pentru a direcționa traficul către un IP extern și încercând cu bucle din instanțele B și C, totul face minuni. Problema este că din instanța A nu funcționează. Am încercat să folosesc atât interfața IP, cât și interfața loopback și nici una nu funcționează:
$ iptables -t nat -A PREROUTING -p tcp –port 8080 -j DNAT –pentru destinație xxxx: 8080
$ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –to-destination xxxx: 8080
$ curl ip-aaaa: 8080 / hello_world
curl: (7) Nu s-a putut conecta la portul 8080 ip-aaaa: Conexiunea a fost refuzată
$ curl localhost: 8080 / hello_world
curl: (7) Nu s-a putut conecta la portul localhost 8080: Conexiunea a fost refuzată
Ai vreo idee care ar putea fi problema?
Da, schimbarea se pierde la repornire, va trebui să utilizați iptables-save & iptables-restore sau ceva de genul acesta pentru a evita acest lucru.
Nu prea am înțeles ce vrei să faci, instanța A?
Am un server care acceptă doar conexiuni de la un anumit ip (server A), nu pot sau vreau să adaug mai multe IP-uri la lista albă (pentru probleme de scalabilitate), așa că vreau să treacă tot traficul către serverul extern respectivul server (A).
Din punct de vedere practic, am configurații globale care definesc ce IP să folosească pentru fiecare serviciu, așa că în acest caz este ceva de genul "toți cei care doresc să utilizeze serviciul extern trebuie să utilizeze IP A"
Acest lucru a fost realizat cu succes folosind metoda din acest articol, dar am întâmpinat problema că, atunci când îl aplic, serverul A nu poate accesa serviciul folosind propriul său IP (dar toate celelalte servere o fac).
Până în prezent, cel mai bun lucru pe care l-am găsit a fost să adaug maparea în fișierul / etc / hosts al serverului A, arătând spre IP extern, suprascriind setarea globală.
Foarte bine, dacă am un alt server de mail, aș putea redirecționa traficul de la portul 143 de la server1 la server2 și e-mailurile vor ajunge la mine pe server2, nu?
În ceea ce priveşte
În teorie da, funcționează așa. Sigur, trebuie să aveți serverul de e-mail instalat corect pe server2 🙂
Genul de postări pe care ne place să le citim, mulțumesc!
Articol excelent, am un proiect în care lucrez și am vrut să vă pun o întrebare, există switch-uri industriale cu funcție NAT (presupun că folosesc IPTables mai jos), pentru a traduce o adresă IP fără a face modificări echipamentului, un exemplu, am un Server 10.10.2.1 care comunică cu computerele 10.10.2.X și prin comutator este programat astfel încât un computer care are o adresă 192.168.2.4 să fie de fapt văzut de pe server ca 10.10.2.5, a tradus acea adresă IP pentru a fi văzută De pe celelalte computere cu adresa respectivă, vreau să o fac de pe un server cu Ubuntu sau altă distribuție, care ar fi regulile iptables?
Informații foarte bune mulțumesc ^ _ ^
Bună ziua.
Am o problemă la încercarea de a face o redirecționare. Explic:
Am un server proxy în Ubuntu, cu 2 plăci de rețea:
eth0 = 192.168.1.1 este conectat la restul rețelei locale.
eth1 = 192.168.2.2 este conectat la router.
Am nevoie de tot ce vine prin eth0 pentru a trece prin eth1 și, de asemenea, prin proxy (folosesc Squid, al cărui port implicit este 3128) și nu găsesc cheia în configurația IPTABLES.
Nu am nevoie de restricții de niciun fel, ci doar că o înregistrare rămâne în jurnalul adreselor web vizitate.
Sper că mă puteți ajuta, deoarece este o sarcină destul de greoaie, care mă îngrijorează de câteva zile.
Mulţumesc.
Prietene, sunt foarte nou pentru alte servere, habar n-am, dar înțeleg subiectul și învăț repede, întrebarea mea este următoarea Am 2 servere serv_1 și serv_2 pe care le-am conectat la același intranet, în aceste servere am un propriu cloud configurat Aș dori să fac următoarele:
că o anumită gamă de ips, de exemplu rangeip_1, atunci când plasează un IP de acces la owncloud (ipowncloud) este direcționată către serv_1 și dacă este un alt rangeip_2 plasat, același ipowncloud este direcționat către serv_2, pentru ca cele 2 servere să fie localizate în două orașe diferite și intervalele ip sunt diferite, dar toate sunt pe aceeași rețea, aceasta ar fi prima parte, a doua ar fi clar este să sincronizezi aceste 2 servere astfel încât să fie oglinzi sau să mă sfătuiască acest lucru pentru a optimiza lățimea band, te rog, dacă îmi vei explica cum să o faci pas cu pas, nu modul super programator = (
Bună, scuzați-mă, am un comutator responsabil de comunicarea tuturor dispozitivelor care alcătuiesc rețeaua mea, iar după aceasta un firewall și în cele din urmă ieșirea de pe Internet, ceea ce se întâmplă este că aș dori ca redirecționarea să fie dată în și nu trebuie să ajungă la firewall decât dacă serviciul solicitat este internet.
Folosind această metodă, ați putea redirecționa HTTPS către HTTP?
Bună, poate că este cam târziu, dar am vrut să te întreb, cum ar trebui să fac ca calmarul să nu modifice adresa IP a clientului când vreau să mă conectez la un server web din aceeași rețea?
Nu mă trata rău pentru că am întrebat. Se poate face acest lucru în Windows?
Aceste informații mi-au fost utile. Ca întotdeauna, puteți avea încredere în voi, atunci când nu găsesc ceva în limba engleză, de obicei ajung să caut în spaniolă, în acele ocazii aproape că vin mereu pe acest site. Mulțumesc.
Am un router 4G care este un client al unei rețele pe care nu o administrez (evident, sunt client)... acest router este o poartă către acea rețea la distanță prin OpenVPN. În plus, respectivul router îndeplinește funcția de portforwarding pentru a accesa portul 80 al serverului uneia dintre acele subrețele din domeniu.
Aceasta a fost declarația pe care a trebuit să o pun în router ca regulă personalizată pentru firewall „-t nat -A POSTROUTING -j MASQUERADE”
Multumesc pentru ajutor!