Puncte:0

„Dați” IP-ul public al unei interfețe unei alte gazde cu IP local

drapel in

Am o mașină (care rulează openSUSE Leap 15.3) cu mai multe adrese IP publice, care servește drept gateway pentru câteva gazde suplimentare. Trebuie să fac ca unul dintre IP-urile publice de pe gateway să se comporte ca și cum ar aparține uneia dintre mașinile conectate la acesta (traficul este transmis în mod transparent).

Ale mele iptables-salvare ieșirea în prezent este după cum urmează (sunt incluse unele reguli Docker irelevante, dar părțile sensibile sunt redactate):

# Generat de iptables-save v1.8.7
*filtru
:INPUT ACCEPT [9747976:4527721149]
:ACCEPTAȚI ANTERIOR [12638879:4423560060]
: ACCEPT IEȘIRE [8913992:2531503118]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-UN FORWARD -j DOCKER-UTILIZATOR
-A ÎNAINTE -j DOCKER-ETAPA DE IZOLARE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,STABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A ÎNTÂMPRE -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-IZOLARE-ETAPA-1 -j RETURNARE
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-IZOLARE-ETAPA-2 -j RETURNARE
-UN DOCKER-USER -j RETURN
COMMIT
# Efectuat
# Generat de iptables-save v1.8.7
*nat
:ACCEPTAREA PRE-ROUTARE [480085:188100350]
:INPUT ACCEPT [62951:4107383]
: ACCEPT IEȘIRE [150:9857]
: POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -d <REDACTED_FORWARDING_IP>/32 -i eth0 -j DNAT --to-destination 10.125.0.2
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-O IEȘIRE! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTOUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Efectuat

Singurele părți relevante ale acesteia, din câte știu eu, sunt:

-A PREROUTING -d <REDACTED_FORWARDING_IP>/32 -i eth0 -j DNAT --to-destination 10.125.0.2
-A POSTROUTING -j MASQUERADE

Aceasta are încă o serie de probleme:

  • Când mașina internă inițiază o conexiune de ieșire, IP-ul său este NAT ca adresa principală a gateway-ului, nu adresa pe care încerc să i-o dau.
  • Când se primesc conexiuni, acestea par să provină de la IP-ul local al gateway-ului, nu de la IP-ul original (ar trebui să existe o modalitate de ocolire, deoarece acesta este gateway-ul implicit).
  • Dacă un serviciu ascultă 0.0.0.0 pe gateway, conexiunile pe acel port nu sunt redirecționate, ele merg la acel serviciu.

Am încercat să împletesc răspunsurile la alte întrebări precum:

Dar, din cauza lipsei mele de experiență semnificativă în iptables, nu am putut să-mi rezolv problemele sau le-am rezolvat pe unele doar pentru ca altele să apară.

Poate cineva să sugereze câteva reguli pentru a obține acest efect? Sau poate există o modalitate de a face acest lucru fără iptables?

Nikita Kipriyanov avatar
drapel za
Vă rugăm să atașați o ieșire completă „iptables-save” la întrebare. Toate problemele ar putea avea legătură cu regulile tale SNAT configurate. De asemenea, descrieți modul în care faceți conexiuni care afișează problemele 2 și 3 (care este adresa sursă, ce este interfața de intrare). Bănuiesc că SNATing prea mult, în timp ce potrivirile cu regulile DNAT ar putea fi mai puțin restrictive.
user9123 avatar
drapel in
@NikitaKipriyanov Am atașat ieșirea `iptables-save` așa cum a fost solicitat. Toate conexiunile trec prin gateway-ul afișează problemele 2 și 3. Ele ajung la gateway pe `eth0:0`, interfața cu IP-ul pe care încerc să-l redirec. În orice caz, soluția mea este probabil foarte greșită din cauza lipsei mele de experiență menționată mai sus, așa că probabil că cel mai bine este să nu bazez răspunsurile pe ea. În mare parte, l-am atașat pentru a arăta că am încercat să fac asta și eu.
Puncte:1
drapel za

Când mașina internă inițiază o conexiune de ieșire, IP-ul său este NAT este adresa principală a porții, nu adresa pe care încerc să o fac da-o.

Acest lucru ar trebui rezolvat cu:

iptables -t nat -I POSTROUTING 1 -s 10.125.0.2 -o eth0 -j SNAT --to-source <FORWARD_IP>

Este adăugat în față, așa că se va declanșa mai întâi, va detecta că pachetul provine din acest sistem și îl va traduce în IP-ul specificat, în loc să aleagă o adresă din interfață.

Când se primesc conexiuni, acestea par să provină de la IP-ul local al gateway-ului, nu IP-ul original (ar trebui să existe o cale de ocolire că, deoarece aceasta este gateway-ul implicit).

Această problemă este legată de următoarea regulă SNAT:

iptables -t nat -A POSTROUTING -j MASQUERADE

Este cale prea lat. Tu faci SNAT Tot în fiecare direcție, care nu este eficientă și nici sigură. Se potrivește cu toate, inclusiv cu pachetele dvs. DNATed. Ele sunt mai întâi traduse de destinație în adresă privată, apoi sursa lor este tradusă prin această regulă în adresă selectată dintr-o interfață privată unde este atribuită adresa 10.x.x.x.

Bănuiesc că încercați să acoperiți toate interfețele publice și toate rețelele private cu o singură regulă. Deși există liste de adrese în Linux (seturi de IP), nu există liste de interfețe, așa că nu este posibil să faceți acest lucru corect doar cu o singură regulă.

Filtrați-l cu macar adresa sursei (de ex. care adrese către sursă-traducere):

iptables -t nat -A POSTROUTING -s 10.125.0.0/24 -j MASQUERADE

Dacă aveți mai multe rețele private, adăugați mai multe reguli de acest fel.

Cred că este mai bine să creați o regulă individuală pentru fiecare interfață publică, astfel încât pachetele care trec prin interfața privată nu ar putea niciodată să fie traduse la sursă, indiferent de adresa sursă pe care o au, de ex. iptables -t nat -A POSTROUTING -s 10.125.0.0/24 -o eth0 -j MASQUERADE și așa mai departe. În acest fel, pachetele de la 10.x.x.x la 172.x.x.x nu vor fi traduse nici ele, iar serviciile dumneavoastră din ambele rețele își vor vedea IP-ul celuilalt direct, lăsând totuși posibilitatea de a le filtra selectiv în lanțul de filtre FORWARD.

Dacă un serviciu ascultă pe 0.0.0.0 pe gateway, conexiunile sunt activate acel port nu este redirecționat, ei merg la acel serviciu.

Și, în sfârșit, nu înțeleg pe deplin acest aspect.Am intrebat in comentariu, nu mi-ai raspuns. Ce conexiuni, de unde, care este IP-ul sursă?

Prelucrarea DNAT are loc înainte de decizia de rutare, de aceea lanțul se numește „PREROUTING”. Nu verifică niciodată dacă există un proces local care ascultă pe acel port. Singura modalitate prin care serviciul local are șansa de a răspunde este ca pachetul să treacă lanțul INPUT. Pentru aceasta, codul de rutare trebuie să decidă că este destinat mașinii locale, așa că trebuie să nu fie tradus deloc sau să fie tradus într-o adresă atribuită de acest sistem.

Cu regulile actuale, pachetele trimise din rețelele private către IP-urile publice ar trebui nu fi tradus, pentru că nu vin prin eth0. Deci, acestea urmează să fie deservite de serviciile locale. Dar acest lucru nu depinde de dacă serviciul local rulează sau nu; dacă nu este, veți avea „conexiunea refuzată”.

Dacă aveți nevoie de pachete din LAN la <FORWARD_IP> pentru a fi traduse după aceeași regulă DNAT, renunțați-l -i eth0 Meci:

iptables -A PREROUTING -d <REDACTED_FORWARDING_IP>/32 -j DNAT --to-destination 10.125.0.2

Cu toate acestea, sunt împotriva unei reguli atât de ample. După părerea mea, este mai bine să ai reguli DNAT cât mai stricte, așa că mai bine filtrezi după proto-uri (tcp/udp) și porturile serviciilor pe care le rulezi pe 10.125.0.2. Dacă acesta este un server web, redirecționați numai tcp/80 și tcp/443, astfel: iptables -A PREROUTING -d <REDACTED_FORWARDING_IP>/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.125.0.2.

Care este problema? Spune, verifici ceva cu ping-ul. Acest rezultat ping va depinde de această stare internă a sistemului, este sistemul pe care îl faceți ping în realitate. Asta creează confuzie. Acesta nu este comportamentul pe care majoritatea administratorilor de sistem se așteaptă să îl vadă atunci când pun ping la un router. Așa că mai bine lăsați ping să primească un răspuns de către gazdă.

user9123 avatar
drapel in
Vă mulțumesc foarte mult pentru răspunsul detaliat și îmi pare rău pentru întârziere, tocmai am avut șansa de a încerca soluția dvs. Sunt încântat să spun că toate problemele sunt rezolvate, ceea ce mă face foarte fericit, deoarece acest lucru mi-a provocat o supărare semnificativă. În ceea ce privește partea 3, după ștergerea regulilor paravanului de protecție și setarea lor conform răspunsului dvs., acest lucru pare să nu mai fie cazul. Și eu eram foarte confuz cu privire la motivul pentru care ar fi asta, dar poate că epuizarea mea din cauza regulilor firewall-ului m-a învins și testarea mea a fost greșită. Mulțumesc încă o dată, m-ai ajutat enorm :D

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.