O regulă NAT care trebuia să dea unui grup de clienți VPN propria adresă publică stă la zero pachete, în timp ce același grup continuă să iasă cu sursa greșită. Regula de obicei nu greșește adresa; greșește interfața. -o eth0:0 indică un dispozitiv care nu există, pentru că eth0:0 este o etichetă atașată unei adrese pe eth0. Uitarea la contoare este cea mai rapidă cale de a confirma acest lucru, iar corecția este mai mică decât sugerează investigația.

Verifică ce nume dă nucleul dispozitivului

Citește cele două vederi separat înainte de a schimba ceva:

ip link show
ip address show dev eth0
ip route get 203.0.113.20

Lista legăturilor arată interfețe. Lista adreselor poate arăta o a doua adresă IPv4 care poartă eticheta eth0:0, iar dispozitivul acelei adrese este încă eth0. Manualul de adrese al iproute2 tratează eticheta ca un nume al adresei, nu ca o a doua legătură, și exact această distincție stă la baza întregii probleme.

Istoria explică confuzia. Vechea ifconfig eth0:0 sintaxă chiar arăta ca o interfață nouă, iar scripturile din acea epocă încă se referă la una. Pe un sistem actual, aliasul este o etichetă pe o adresă, iar nimic din calea de rutare sau netfilter nu îl tratează ca un punct de ieșire separat.

Verifică la ce s-a potrivit de fapt regula

Citește contoarele împreună cu lista de reguli, nu din memorie:

iptables -t nat -L POSTROUTING -v -n --line-numbers

O regulă al cărei contor de pachete rămâne la zero în timp ce curge trafic potrivit nu este evaluată, iar o condiție de interfață de ieșire care numește eth0:0 este o cauză obișnuită. Dispozitivul de ieșire ales de rută este eth0, așa că o condiție care caută alt nume nu devine niciodată adevărată, indiferent ce adresă sursă a ales nucleul.

Schimbă condiția pe dispozitivul real și lasă eticheta în afara ei. Dacă trebuie să distingi două grupuri de clienți care împart acel dispozitiv, distinge-le după prefixul sursei, nu după un nume de interfață care nu poate exista. Două reguli cu potriviri -s care nu se suprapun sunt lizibile și testabile; o regulă cu un dispozitiv fictiv nu este nici una, nici alta. Dă fiecărei reguli un comentariu care numește grupul, pentru că peste șase luni prefixul singur nu va spune nimănui de ce este acolo.

Verifică ruta care a ales dispozitivul

NAT-ul de postrouting rulează după ce ruta a ales deja o interfață de ieșire, deci interfața din regulă trebuie să fie cea aleasă de rută. Întreabă nucleul direct cu ip route get pentru o adresă reprezentativă de client și citește atât dispozitivul, cât și sursa pe care o raportează.

Dacă răspunsul numește eth0, partea de interfață a regulii este lămurită. Dacă numește un dispozitiv de tunel, pachetul nu ajunge niciodată la regula pe care o editezi, iar căutarea se mută la tabela de rutare și la prioritățile ei. O regulă care nu se potrivește niciodată pentru că pachetul a ieșit în altă parte arată în ieșirea contoarelor la fel ca o regulă cu un dispozitiv scris greșit. Confirmă care dintre cele două cazuri îl ai înainte de a edita ceva, pentru că al doilea cere o schimbare de rutare, nu de text.

Alege deliberat sursa tradusă

Odată ce dispozitivul este corect, adresa sursă este o decizie separată. Acesta este doar un grup IPv4 ilustrativ și o adresă de exemplu:

iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
  -j SNAT --to-source 203.0.113.20

Scrierea unei adrese în --to-source nu face pe nimeni să o ruteze înapoi la tine. Furnizorul din amonte sau proprietarul adresei trebuie să livreze răspunsurile pentru acea adresă către acest host, iar adresa trebuie să fie una pe care ești autorizat să o folosești. Dacă nu este, regula se va potrivi și va traduce, iar răspunsurile vor merge tot în altă parte.

Schimbarea adresei sursă nu este același lucru cu schimbarea legăturii din amonte. Când cerința reală este o altă cale fizică, politica de rutare trebuie să selecteze mai întâi acea cale; apoi SNAT rescrie sursa pe dispozitivul pe care l-a ales politica. Mai multe etichete pe eth0 nu oferă nici ruta, nici autorizația.

Verifică cu o conexiune pe care tocmai ai deschis-o

Deschide o conexiune nouă de client în loc să o refolosești pe cea existentă. Urmărirea conexiunilor păstrează traducerea înregistrată la începutul fluxului, așa că o sesiune veche poate continua să folosească adresa sursă anterioară și poate face o regulă nouă corectă să pară stricată. Urmărește contorul cum crește, apoi observă sursa tradusă pe fir sau la capătul îndepărtat.

Pentru mai multe grupuri care împart o interfață, dă fiecăruia o potrivire explicită de sursă și propria adresă de traducere, ține-le în configurația administrată a firewall-ului și notează ordinea în care sunt evaluate. Apoi consemnează ce ai verificat: dispozitivul din ip route get, contorul care s-a mișcat și sursa pe care a văzut-o partea îndepărtată. Acea consemnare răspunde raportului următor fără a repeta confuzia cu aliasul.

Articole similare