Descrierea Iptables. Elementele de bază ale iptables folosind Debian ca exemplu prin ochii unui copil. Asigurarea accesului la servicii din rețeaua locală

Fiecare computer conectat la rețea este în pericol potențial. Există o mulțime de amenințări în rețea, de la programe care vor încerca să pătrundă în sistem în orice fel, până la hackeri care doresc să obțină acces la computerul de care au nevoie. Iar software-ul instalat pe computer poate conține vulnerabilități necunoscute și necorectate, care pot deveni o gaură de securitate.

Dacă acest lucru nu este foarte relevant pentru computerele de acasă, deoarece acestea sunt conectate la rețea prin routere și NAT, care le ascund de rețea externă, atunci pentru servere acest lucru este mai relevant ca niciodată. ÎN sistem de operare Linux are un firewall iptables foarte flexibil și de încredere încorporat în nucleu.

Cu ajutorul acestui program sistemul este protejat de intruziunile externe, redirecționarea portului și multe alte acțiuni cu trafic. Dar dezavantajul său este că este puțin greu de configurat. Acest articol va analiza configurarea iptables pentru manechine. Sper că după aceasta îl vei putea folosi cu încredere capabilități de bază iptables.

Subsistemul iptables și Netfilter au fost încorporate în nucleul Linux de ceva timp. Toate pachetele de rețea care trec prin computer, sunt trimise de computer sau sunt destinate computerului, sunt direcționate de kernel prin filtrul iptables. Acolo, aceste pachete pot fi verificate și apoi pentru fiecare verificare, dacă este trecută, se realizează acțiunea specificată în el. De exemplu, pachetul este transmis nucleului pentru trimitere programul țintă, sau aruncate.

Tipuri de pachete

Toate pachetele sunt împărțite în trei tipuri: de intrare, de ieșire și de trecere. Sosite sunt cele care au fost trimise către acest computer, cele de ieșire sunt cele trimise de pe acest computer în rețea. Și pachetele de trecere sunt pachete care pur și simplu trebuie să fie redirecționate în continuare, de exemplu dacă computerul tău acționează ca un router.

În consecință, în filtrul iptables, toate pachetele sunt împărțite în trei lanțuri similare:

  • Intrare- procesează pachetele și conexiunile primite. De exemplu, dacă orice utilizator extern încearcă să se conecteze la computerul dvs. prin ssh sau orice site web vă trimite conținutul acestuia la cererea browserului. Toate aceste pachete vor ajunge în acest lanț;
  • redirecţiona- acest lanț este folosit pentru trecerea conexiunilor. Aceasta include pachetele care sunt trimise către computerul dvs., dar nu sunt destinate acestuia, sunt pur și simplu trimise prin rețea la destinație. După cum am spus deja, acest lucru se observă pe routere sau, de exemplu, dacă computerul dvs. distribuie wifi;
  • ieșire- Acest lanț este folosit pentru pachete și conexiuni de ieșire. Aceasta include pachetele care au fost create atunci când ați încercat să faceți ping la un site sau când vă lansați browserul și încercați să deschideți orice site.

Dar dacă credeți că puteți închide complet lanțul de intrare pentru a crește securitatea, atunci vă înșelați foarte mult. Când rețeaua funcționează, sunt utilizate atât lanțurile de intrare, cât și de ieșire. De exemplu, încercați să faceți ping, datele sunt trimise prin ieșire, dar răspunsul vine prin intrare. Același lucru se întâmplă atunci când navigați pe site-uri web și alte activități. Dar lanțul înainte poate să nu fie folosit deloc dacă computerul nu este un router. Deci configurarea iptables trebuie făcută cu mare atenție.

Reguli și acțiuni

Înainte de a trece la crearea unei liste de reguli iptables, trebuie să luați în considerare modul în care funcționează și ce sunt. Pentru fiecare tip de pachet, puteți seta un set de reguli care vor fi verificate pe rând pentru conformitatea cu pachetul, iar dacă pachetul se potrivește, atunci i se va aplica acțiunea specificată în regulă. Regulile formează un lanț, deci input, output și forward se numesc lanțuri, lanțuri de reguli. Pot exista mai multe acțiuni:

  • ACCEPT- permiteți pachetului să treacă mai departe de-a lungul lanțului de reguli;
  • CĂDERE BRUSCA- scoateți pachetul;
  • RESPINGE- respingeți coletul, va fi trimis un mesaj expeditorului că coletul a fost respins;
  • BUTURUGA- faceți o înregistrare despre pachet în fișierul jurnal;
  • COADĂ- trimiteți pachetul către aplicația utilizator.

Regulile pot verifica orice potrivire, de exemplu, după ip, după portul destinatar sau expeditor, antetele pachetelor și multe altele. Dacă un pachet nu se potrivește cu niciuna dintre reguli, atunci i se aplică acțiunea implicită, de obicei ACCEPT.

Când ne-am dat seama de reguli, ne putem întoarce la lanțuri. Pe lângă cele enumerate mai sus, există două lanțuri suplimentare de reguli:

  • prerutare- pachetul intră în acest lanț înainte de a fi procesat de iptables, sistemul nu știe încă unde va fi trimis, la intrare, ieșire sau redirecționare;
  • postrutare- toate pachetele de trecere care au trecut deja prin lanțul înainte merg aici.

Dar asta nu este tot. Avem și tabele iptables, cu care ar fi indicat să ne ocupăm.

tabele ipatables

Deasupra lanțurilor de reguli din iptables există un alt nivel de abstractizare, iar acestea sunt tabele. Există mai multe tabele în sistem și toate au set standard lanțuri de intrare, înainte și ieșire. Tabelele sunt concepute pentru a efectua diverse acțiuni asupra pachetelor, cum ar fi modificarea sau filtrarea. Acum acest lucru nu este atât de important pentru tine și va fi suficient să știi că filtrarea pachetelor iptables se realizează în tabelul de filtre. Dar le vom privi pe toate:

  • brut- concepute pentru a lucra cu ambalaje brute înainte ca acestea să fie procesate;
  • calandru- destinat modificarii pachetelor;
  • nat- oferă funcționalitate nat dacă doriți să folosiți computerul ca router;
  • filtru- tabelul principal pentru filtrarea pachetelor, utilizat implicit.

Aproape totul cu teoria, acum să ne uităm la utilitate Linie de comanda iptables, care este folosit pentru a gestiona sistemul iptables.

Utilitar Iptables

Subsistemul iptables și netfilter sunt încorporate în nucleu, dar un set de utilitare pentru gestionarea tuturor acestora nu este întotdeauna furnizat împreună cu sistemul. Pentru a instala utilitarul pe Ubuntu, tastați:

sudo apt install iptables

Și pe distribuțiile bazate pe Fedora, instalarea iptables se face puțin diferit:

sudo yum instalează iptables

Odată ce instalarea iptables este finalizată, puteți trece la configurare, dar să ne uităm mai întâi la sintaxa utilitarului. De obicei comanda are așa ceva forma generala:

-t lanț de acțiuni de masă Opțiuni suplimentare

Acum să ne uităm la parametrii iptables, tabelul indică tabelul cu care se lucrează, acest parametru poate fi ratat, acțiunea este acțiunea necesară, de exemplu, creați sau ștergeți o regulă și Opțiuni suplimentare descrie acțiunea și regula care trebuie efectuată.

Rămâne să luați în considerare principalele acțiuni pe care iptables vă permite să le efectuați:

  • -A- adăugați o regulă la lanț;
  • -CU- verifica toate regulile;
  • -D- ștergeți regula;
  • -Eu- introduceți o regulă cu numărul dorit;
  • -L- afișați toate regulile din lanțul curent;
  • -S- afișați toate regulile;
  • -F- ștergeți toate regulile;
  • -N- creați un lanț;
  • -X- ștergeți lanțul;
  • -P- setați acțiunea implicită.

Opțiuni suplimentare pentru reguli:

  • -p- specificați protocolul, unul dintre tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp,
    mh;
  • -s- specificați adresa IP a dispozitivului care trimite pachetul;
  • -d- indicați adresa IP a destinatarului;
  • -i- interfata de retea de intrare;
  • -o- interfata de retea de iesire;
  • -j- selectați o acțiune dacă regula se potrivește.

Acum puteți continua să vă uitați la exemple despre cum este configurat iptables.

Exemple de configurare Iptables

Vom analiza câteva exemple de bază, astfel încât să puteți consolida ceea ce ați citit mai sus.

Lista regulilor

Mai întâi să ne uităm la cum să vizualizați regulile iptables, opțiunea -L este suficientă pentru asta:

De asemenea, puteți specifica lanțul dorit pentru a afișa regulile numai pentru acesta:

iptables -L INPUT

Reguli de compensare

Nu puteți dezactiva pur și simplu iptables prin oprirea serviciului de actualizare a regulilor iptables prin systemd sau chiar prin eliminarea setului de utilitare de configurare. Subsistemul funcționează la nivel de kernel și nu depinde de ceea ce ați instalat acolo. Prin urmare, dacă faceți ceva greșit, va trebui să ștergeți regulile. Pentru a face acest lucru, rulați:

Sau doar pentru un anumit lanț:

sudo iptables -F Intrare

Permiteți-mi să vă reamintesc că toate aceste acțiuni sunt efectuate pentru tabelul implicit - filtru.

Reguli implicite

După cum am spus deja, dacă nicio regulă nu corespunde unui pachet, atunci i se aplică acțiunea implicită. Poate fi specificat folosind opțiunea -p:

sudo iptables -p INTRARE ACCEPT
$ sudo iptables -p ACCEPT IEȘIRE
$ sudo iptables -p FORWARD DROP

În acest exemplu, permitem lanțurile INPUT și OUTPUT, dar dezactivăm FORWARD.

Blocarea pachetelor

Pentru a bloca pachetele, putem folosi acțiunea DROP, putem filtra pachetele care trebuie blocate după multe criterii, de exemplu, protocol, adresă IP, mască de rețea, port și multe altele.

Iată cum va arăta comanda, care vă permite să adăugați o regulă iptables pentru a bloca toate pachetele primite din 10.10.10.10:

sudo iptables -A INPUT -s 10.10.10.10 -j DROP

Și acum pachetele de ieșire la aceeași adresă:

Blocarea intervalului IP se face într-un mod similar. Pentru a face acest lucru, trebuie să utilizați masca de rețea 10.10.10.0/24. Acestea vor fi toate adresele începând de la 10.10.10.0 până la 10.10.10.255:

sudo iptables -A INPUT -s 10.10.10.0/24 -j DROP

Sau o versiune extinsă a măștii:

sudo iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

De asemenea, puteți bloca toate conexiunile ssh de intrare:

sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

După cum puteți vedea, adăugarea unei reguli iptables este foarte simplă.

Stergerea regulilor

Ștergerea regulilor iptables se face în același mod ca și crearea altora noi, doar că în loc de opțiunea A trebuie să utilizați opțiunea D. Mai întâi, uitați-vă la lista de reguli:

De exemplu, iată cum puteți șterge regula iptables care a fost creată a doua:

sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

De asemenea, puteți șterge complet iptables rulând comanda cu opțiunea -F:

De câteva ori am dat peste faptul că chiar și oamenii inteligenți în general o fac absolut greșeli de neiertat. De exemplu, deschid portul pe care rulează baza de date către întregul Internet. Acest lucru se întâmplă adesea începătorilor DevOps care au scris cod toată viața, iar acum responsabilitățile lor includ și configurarea serverelor. Există tutoriale bune pe Internet despre configurarea de bază a paravanului de protecție în Linux și alte *nix, dar adesea acestea sunt foi de pe multe ecrane. Deci, sper că acest tutorial mai concis va fi de folos cuiva.

Important! Este foarte ușor să dai firewall greșit la o mașină atât de mult încât nu o mai poți accesa. Mai ales se referă găzduire în cloud. De exemplu, dacă în AWS închideți toate porturile de la 1024 la 65536, din anumite motive mașina se dovedește a fi închisă după o repornire totul in general porturi. Dacă sunteți găzduit în cloud, configurați firewall mai bun prin interfața web oferită de găzduire.

O mică notă despre terminologie. Firewall-ul încorporat în nucleul Linux se numește Netfilter, iar iptables este un utilitar pentru gestionarea acestui firewall. Mulți oameni cred în mod eronat că firewall-ul se numește iptables. Este gresit. Spunând ceva de genul „Filtrez pachetele folosind iptables”, le arăți altora ignoranța ta.

În general, ce fel de probleme pot fi rezolvate folosind Netfilter:

  • Permite/interzice traficul de intrare către porturi specifice prin protocoale specifice (IPv4/IPv6, TCP/UDP) de la adrese specificate (IP, MAC) sau subrețele;
  • Totul este la fel pentru traficul de ieșire;
  • Puteți, de exemplu, să ignorați complet toate pachetele ICMP;
  • Configurarea NAT, vezi articolul despre un router bazat pe Raspberry Pi;
  • Am auzit că guru adevărați știu cum să configureze protecția împotriva DDoS și a forței brute și să limiteze accesul la rețea aplicatii specifice, utilizatori sau grupuri și să facă alte lucruri nebunești;

Voi observa că utilitarul iptables personal mi s-a părut extrem de incomod la început în comparație cu ipfw din FreeBSD. Din fericire, după ce am lucrat cu el de ceva timp, toate aceste multe steaguri precum -A, -D, -j și altele devin familiare, așa că aveți răbdare. Să ne uităm la comenzile de bază.

Afișați toate regulile:

iptables -L -n

Este posibil să observați că Netfilter are niște „lanțuri” - cel puțin INPUT, OUTPUT și FORWARD. Eu personal am și un lanț DOCKER pe aparat. Pentru prima dată, vă puteți gândi la primele două ca fiind tot traficul de intrare și respectiv de ieșire și uitați temporar de restul. Sunt șanse mari să nu ai deloc nevoie de ele.

Eliminați toate regulile:

iptables -F

Modificați politica (comportamentul implicit) al lanțului:

iptables -P INPUT DROP
iptables -P INTRARE ACCEPT

Interziceți accesul de la gazdă/subrețea:

iptables -A INPUT -s 123.45.67.89 -j DROP
iptables -A INPUT -s 123.45.0.0/ 16 -j DROP

De asemenea, puteți utiliza nume de domenii:

iptables -A INPUT -s example.ru -j DROP

Interzicerea conexiunilor de ieșire:

iptables -A OUTPUT -d 123.45.67.89 -j DROP

Puteți folosi negații în reguli:

iptables -O INTRARE! -s 123.45.67.89 -j DROP

Ștergerea unei reguli după numărul ei din lanț:

iptables -D INTRARE 1

Eliminarea unei reguli pe baza a ceea ce face:

iptables -D INPUT -s 123.45.67.89 -j DROP

Opțiunea -p specifică protocolul. Puteți utiliza all, icmp, tcp, udp sau numărul de protocol din /etc/protocols. Steag - -sport indică portul din care a fost trimis pachetul și - -dport specifică portul de destinație:

iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INTRARE -p tcp --dport 80 -j ACCEPT

Inserarea unei reguli la începutul unui lanț:

iptables -I INTRARE...

Sau puteți specifica o anumită poziție:

iptables -I INTRARE 3...

iptables-save > /etc/ iptables.rules

Restabiliți regulile:

iptables-restore< / etc/ iptables.rules

Acum să ne uităm la câteva exemple practice. Acesta este, de exemplu, cum arată emularea netsplit într-un test care verifică comportamentul unei aplicații care utilizează Akka Cluster:

rulați(nodul 1, s „iptables -A INPUT -s $node2 -j DROP”)
rulați(nodul 1, s „iptables -A INPUT -s $node3 -j DROP”)
rulați(nodul 1, s „iptables -A OUTPUT -d $node2 -j DROP”)
rulați(nodul 1, s „iptables -A OUTPUT -d $node3 -j DROP”)

Restaurarea are loc exact în același mod, doar steagul -A este înlocuit cu steagul -D.

Alt exemplu. Trebuie să aflați ce porturi ascultă pe aparat și să le închideți pe cele inutile. Intrăm în mașină și spunem:

netstat -tuwpln

Exemplu de ieșire:

Conexiuni la internet active (numai servere)
Proto Recv-Q Trimitere-Q Adresă locală Adresă străină Stat PID/Nume program
tcp 0 0 0.0.0.0:80 0.0.0.0:* ASCULTĂ 3210/nginx
tcp 0 0 0.0.0.0:4369 0.0.0.0:* ASCULTĂ 1789/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCULTĂ 797/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 990/postgres

Nginx și SSHd se uită la Internet, acest lucru este normal. PostgreSQL ascultă doar interfața locală, deci nu există probleme nici cu aceasta. Dar epmd iese în evidență (puteți verifica cu telnet de pe o altă mașină), iar acest lucru nu este bun. Puteți închide doar portul 4369. Cum să faceți acest lucru a fost arătat mai sus. Sau puteți merge și mai departe și puteți refuza toate conexiunile din exterior la portul 81 și mai vechi.

Un firewall de încredere este unul dintre cele mai importante aspecte protecția oricărui sistem de operare modern. Majoritate distribuții Linux conțin mai multe instrumente firewall diferite. Acest ghid este dedicat unuia dintre cele mai populare - iptables.

Deci, iptables este firewall-ul standard inclus în majoritatea distribuțiilor Linux în mod implicit (nftables este dezvoltat pentru a-l înlocui). De fapt, iptables este interfața cu utilizatorul pentru a controla sistemul netfilter, care la rândul său controlează stiva de rețea Linux. iptables compară fiecare pachet primit cu un set de reguli stabilite și apoi decide ce să facă cu el în continuare.

Discuția a fost despre cum funcționează exact iptables. Acest articol se concentrează pe exemple practice care demonstrează creația set de bază reguli pentru servere Ubuntu 14.04.

Comenzi de bază pentru iptables

Această secțiune conține comenzi de bază cu care puteți crea set complex reguli și gestionați interfața iptables ca întreg.

Tine minte: comenzile iptables trebuie rulate cu privilegii de root. Aceasta înseamnă că trebuie să faceți una dintre următoarele:

  • autentificare ca utilizator root;
  • utilizați su sau sudo -i pentru a extinde shell-ul rădăcină;
  • porniți toate comenzile cu sudo (modul recomandat în Ubuntu).

ÎN acest manual Se aplică ultima opțiune.

Deci, mai întâi trebuie să vă uitați la lista de reguli actuale pentru iptables. Pentru a face acest lucru, utilizați steag-ul -L:

sudo iptables -L
INTRARE în lanț (politica ACCEPT)


target prot opt ​​sursă destinație
Ieșire în lanț (politica ACCEPT)
target prot opt ​​sursă destinație

După cum puteți vedea, lista conține trei lanțuri implicite (INPUT, OUTPUT și FORWARD), fiecare dintre ele având o politică implicită (activată acest moment acesta este ACCEPT). De asemenea, puteți vedea numele coloanelor. Dar această listă nu include regulile în sine, deoarece Ubuntu nu vine cu un set implicit de reguli.

Folosind marcatorul -S, această listă poate fi vizualizată într-un format diferit care reflectă comenzile necesare pentru a activa regulile și politicile:

sudo iptables -S
-P ACCEPT INTRARE
-P ÎNTÂMPRE ACCEPT
-P ACCEPT IEȘIRE

Pentru a replica configurațiile, trebuie doar să tastați sudo iptables la începutul fiecărei linii de rezultat. (În funcție de configurațiile dvs., această procedură poate fi puțin mai complexă atunci când vă conectați de la distanță; dacă regulile care permit conexiunea curentă nu au fost încă setate, nu ar trebui să setați politica DROP.)

Pentru a reseta regulile curente (dacă există), tastați:

sudo iptables -F

Din nou, pe în această etapă Politica implicită este foarte importantă deoarece nu va fi modificată de comanda anterioară, chiar dacă toate regulile vor fi eliminate din lanțuri.

Înainte de a reseta regulile pentru o conexiune la distanță, trebuie să vă asigurați că politica ACCEPT este setată în lanțurile INPUT și OUTPUT. Acest lucru se face astfel:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

După ce ați creat reguli care permit conexiuni la distanță, puteți seta politica DROP. Deci, să trecem la crearea regulilor.

Crearea regulilor iptables

După cum am menționat mai sus, acest tutorial se concentrează pe lucrul cu lanțul INPUT, deoarece este responsabil pentru traficul de intrare. În primul rând, trebuie să luăm în considerare regula deja menționată - regula care permite conexiunea SSH curentă.

Arata cam asa:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Desigur, poate părea incredibil de complicat la început; Pentru a înțelege această regulă, familiarizați-vă cu componentele sale:

  • -O INTRARE: steag -A adaugă ( adăuga) regulă până la capătul lanțului. Această parte a comenzii îi spune iptables să adauge o regulă la sfârșitul lanțului INPUT.
  • -m contratrack: pe lângă un set de funcții de bază, iptables are și un set de extensii, sau module, care sunt responsabile pentru caracteristici suplimentare firewall. Această parte comanda indică faptul că utilizatorul are nevoie de acces la funcțiile modulului conttrack. Acest modul permite comenzilor să decidă ce să facă cu un pachet în funcție de relația acestuia cu conexiunile anterioare.
  • --ctstate: una dintre comenzile disponibile la apelarea modulului conntrack. Această comandă vă permite să urmăriți relația dintre pachete și alte pachete vizualizate anterior. Este setat la ESTABLISHED (care acceptă pachete care fac parte dintr-o conexiune existentă) și RELATED (acceptă pachete care sunt asociate cu o conexiune deja stabilită). Această parte a regulii este responsabilă pentru sesiunea SSH curentă.
  • jACCEPT: Specifică acțiunea (țintă) de efectuat asupra unui pachet care se potrivește cu regula. În acest caz, iptables va accepta pachete care îndeplinesc criteriile anterioare.

Această regulă trebuie plasată la început pentru a se asigura că conexiunile existente se potrivesc cu regulile, sunt acceptate și ies din lanț fără a ajunge la regulile DROP.

Prin solicitarea unei liste de reguli, puteți vedea modificările:

sudo iptables -L
INTRARE în lanț (politica ACCEPT)
target prot opt ​​sursă destinație
ACCEPTĂ toate -- oriunde oriunde ctstate RELATED,STABLISHED
Lanț FORWARD (politica ACCEPT)
target prot opt ​​sursă destinație
Ieșire în lanț (politica ACCEPT)
target prot opt ​​sursă destinație

Familiarizându-se cu sintaxă de bază, creați mai multe reguli care acceptă conexiunea.

Acceptarea altor conexiuni importante

Anterior, iptables a primit o comandă pentru a nu reseta toate conexiunile curente, dar și pentru a accepta toate conexiunile legate de acestea. Acum trebuie să creați reguli care acceptă conexiuni care nu îndeplinesc criteriile de mai sus.

Lăsați două porturi deschise: Port SSH(Acest ghid folosește portul implicit 22; dacă valoare dată a fost schimbat, nu uitați să introduceți noua valoare); În plus, să presupunem că pe acest computer serverul web rulează implicit pe portul 80 (nu adăugați această regulă dacă nu este cazul).

Deci, liniile pe care trebuie să le utilizați pentru a crea astfel de reguli arată astfel:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

După cum puteți vedea, ele sunt foarte asemănătoare cu prima regulă; poate au si mai multe structură simplă. Opțiuni noi:

  • ptcp: Această opțiune permite trecerea pachetelor care utilizează TCP (un protocol orientat pe flux care este utilizat de majoritatea aplicațiilor, deoarece oferă o comunicare fiabilă).
  • dport: Această opțiune este disponibilă când se utilizează steag-ul -p tcp. Ea arată portul de intrare, cu care portul pachetului trebuie să se potrivească. Prima regulă permite pachetele TCP destinate portului 22, iar a doua regulă acceptă traficul TCP destinat portului 80.

Acum trebuie să creăm o altă regulă ACCEPT pentru a ne asigura că serverul funcționează conform așteptărilor. De obicei, serviciile comunică prin schimbul de pachete; Pentru a face acest lucru, ei folosesc o interfață pseudo-ring de rețea - așa-numitul dispozitiv loopback, care direcționează traficul înapoi către sursa sa și nu către alte computere.

Adică, dacă serviciul 1 trebuie să comunice cu serviciul 2 care ascultă conexiunile pe portul 4555, atunci serviciul 1 trimite un pachet la portul 4555 utilizând un dispozitiv loopback. Acest comportament trebuie permis pentru că este o condiție importantă operatiune adecvata multe programe.

Pentru a face acest lucru, adăugați următoarea regulă:

sudo iptables -I INTRARE 1 -i lo -j ACCEPT

Este puțin diferit de regulile anterioare; uita-te mai atent la el:

  • euINTRARE 1: Indicatorul -I îi spune iptables să insereze o regulă. Acest steag este diferit de steag -A (care pur și simplu adaugă regula la sfârșitul lanțului); specifică lanțul în care trebuie adăugată regula și locația regulii în ea. ÎN în acest caz,, regula trebuie introdusă chiar la începutul lanțului INPUT, în urma căruia toate regulile se vor muta o poziție. Această regulă ar trebui plasată la începutul lanțului, deoarece este una dintre regulile principale și nu ar trebui să depindă de celelalte.
  • iuite: această componentă Regulile permit pachete care utilizează interfața lo („lo” este un alt nume pentru dispozitivul de loopback). Aceasta înseamnă că orice pachet care utilizează această interfață, trebuie acceptat.

Pentru a vizualiza regulile curente, utilizați steag-ul -S, deoarece steag-ul -L nu scoate anumite informații (de exemplu, interfața la care este legată regula, ceea ce este foarte important în cazul ultimei reguli):

sudo iptables -S
-P ACCEPT INTRARE
-P ÎNTÂMPRE ACCEPT
-P ACCEPT IEȘIRE
-A INTRARE -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,STABLISHED -j ACCEPT
-A INTRARE -p tcp -m tcp --dport 22 -j ACCEPT
-A INTRARE -p tcp -m tcp --dport 80 -j ACCEPT

Crearea regulilor DROP

Deci, momentan, au fost create 4 reguli care acceptă pachete pe baza anumitor criterii. Cu toate acestea, serverul nu blochează în prezent niciun alt pachet oricum.

Dacă un pachet trece prin lanțul INPUT și nu se potrivește cu niciuna dintre cele patru reguli, se va executa politica implicită (ACCEPT), care va accepta pachetul într-un fel sau altul. Acum trebuie schimbat.

Acest lucru se poate face în două moduri, care au diferențe destul de semnificative.

Prima modalitate este de a edita politica implicită a lanțului INPUT; pentru a face acest tip:

sudo iptables -P INPUT DROP

Această politică va monitoriza și va elimina toate pachetele care nu se potrivesc cu niciuna dintre regulile lanțului INPUT. O consecință a acestui tip de design este că va scăpa pachetele chiar și după ce regulile în sine au fost resetate.

Desigur, acest lucru crește nivelul de securitate al serverului; totuși, acest lucru poate avea consecințe grave dacă utilizatorul nu are altă modalitate de a se conecta la server. Cel mai adesea, furnizorii de găzduire oferă o consolă web pentru a se conecta la server în caz de probleme probleme similare. Această consolă funcționează ca o consolă virtuală conexiune locală, deci iptables nu va răspunde.

Puteți solicita serverului să resetați automat conexiunea dacă regulile sunt șterse. Acest lucru va face serverul mai sigur și mai dificil de accesat. Acest lucru înseamnă, de asemenea, că puteți introduce reguli la sfârșitul lanțului și toate pachetele nedorite vor fi eliminate.

O abordare alternativă este adăugarea unei reguli la sfârșitul lanțului care aruncă toate pachetele care nu se potrivesc, menținând în același timp politica ACCEPT.

Pentru a returna politica ACCEPT în lanțul INPUT, tastați:

sudo iptables -P INPUT ACCEPT

Acum puteți adăuga o regulă la sfârșitul acestui lanț care va elimina toate pachetele care nu se potrivesc:

sudo iptables -A INPUT -j DROP

În condiții normale de funcționare, rezultatul va fi exact același cu utilizarea politicii DROP. Această regulă elimină fiecare pachet care ajunge la el, împiedicând pachetele care nu se potrivesc cu regulile să ajungă la server.

Practic, a doua abordare este folosită atunci când este necesar să se păstreze politica ACCEPT care acceptă trafic. Adică, chiar dacă toate regulile sunt resetate, utilizatorul poate accesa în continuare mașina în rețea. Această abordare vă permite să efectuați acțiunile implicite fără a fi nevoie să modificați politica care va fi aplicată lanțului gol.

Desigur, acest lucru înseamnă și că orice regulă care trebuie adăugată la sfârșitul lanțului trebuie să fie înaintea regulii de resetare. Acest lucru se poate face fie prin eliminarea temporară a regulii de resetare:

sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT new_rule
sudo iptables -A INPUT -j DROP

sau prin introducerea unei noi reguli la sfârșitul lanțului (dar înainte de regula de resetare), specificând numărul liniei. Pentru a introduce o regulă pe rândul 4, tastați:

sudo iptables -I INPUT 4 new_rule

Dacă există multe reguli, calcularea manuală a numărului de linii este destul de problematică; în acest caz, iptables poate numerota liniile:

sudo iptables -L --line-numbers
Lanț INPUT (politică DROP)

1 ACCEPT pe toate -- oriunde oriunde
2 ACCEPTĂ toate -- oriunde oriunde ctstate RELATED,STABLISHED
3 ACCEPT tcp -- oriunde oriunde tcp dpt:ssh
4 ACCEPT tcp -- oriunde oriunde tcp dpt:http
Lanț FORWARD (politica ACCEPT)
num target prot opt ​​sursă destinație
Ieșire în lanț (politica ACCEPT)
num target prot opt ​​sursă destinație

Acest lucru vă permite să verificați dacă regula a fost introdusă pe linia corectă.

Se salvează setările iptables

În mod implicit, toate regulile nesalvate rămân în vigoare până la următoarea repornire a serverului; Imediat după repornire, regulile nesalvate se vor pierde.

În unele cazuri, acest lucru este util deoarece permite utilizatorilor care s-au blocat accidental să obțină acces la server. Cu toate acestea, în majoritatea cazurilor, este încă mai convenabil să salvați regulile și să le încărcați când serverul pornește.

Acest lucru se poate face în mai multe moduri; cel mai simplu este să folosești pachetul iptables-persistent, care poate fi descărcat de pe Depozitul Ubuntu Mod implicit:

sudo apt-get update
sudo apt-get install iptables-persistent

În timpul instalării, pachetul va specifica dacă regulile actuale trebuie să fie salvate pentru utilizare ulterioară. descărcare automată; Dacă regulile actuale au fost testate (permițând conexiuni SSH) și îndeplinesc toate cerințele, acestea pot fi salvate.

Când instalarea este finalizată, va apărea serviciu nou numit iptables-persistent, care va rula când serverul este repornit și va relua regulile instalate.

Rezultate

Acest ghid vă ajută să configurați firewall-ul în funcție de cerințele utilizatorului. Desigur, există mult mai multe utilități similare, iar unele dintre ele pot fi mai ușor de utilizat; cu toate acestea, iptables este unul dintre cele mai bune instrumente, fie doar pentru că demonstrează unele dintre structurile de bază ale netfilter și este inclus în multe sisteme.

Etichete: ,

Introducere și istorie

Netfilter - firewall(aka firewall, aka firewall, aka firewall...) a fost integrat în kernel-ul Linux începând cu versiunea 2.4. Netfilter este controlat de utilitar iptables(Pentru IPv6 - ip6tables). Inainte de netfilter/iptables a fost Ipchains, care a fost inclus în nucleele Linux 2.2. Înainte de ipchains în Linux a existat așa-numitul ipfw (paravan de protecție IPV4), portat de la BSD. Utilitar de management - ipfwadm. Proiectul netfilter/iptables a fost fondat în 1998. Autorul este Rusty Russell (el a condus și dezvoltările anterioare). În 1999, s-a format Netfilter Core Team (abreviat coreteam). Firewall-ul dezvoltat a fost denumit oficial netfilter. În august 2003, Harald Welte a devenit șeful coreteamului.

Proiecte ipchainsȘi ipfwadm a schimbat funcționarea stivei de protocoale Kernel-urile Linux, pentru că înainte de apariție netfilter Nu exista nicio prevedere în arhitectura kernelului pentru adăugarea de module suplimentare de gestionare a pachetelor. iptables păstrat ideea principală ipfwadm- o listă de reguli constând din criterii și o acțiune care este efectuată dacă pachetul îndeplinește criteriile. ÎN ipchains a fost introdus un nou concept - capacitatea de a crea noi lanțuri de reguli și de a transfera pachete între lanțuri, iar în iptables conceptul a fost extins la patru tabele (în netfilter modern - mai mult de patru), delimitând lanțurile de reguli după sarcină: filtrare, NAT și modificare a pachetelor. De asemenea, iptables a extins capacitățile Linux de detectare a stării, permițând crearea de firewall-uri care funcționează la nivel de sesiune.

Arhitectura Netfilter/iptables

Cerințe preliminare ()

După cum am menționat mai sus, pentru ca Netfilter să funcționeze, aveți nevoie de versiunea kernel-ului 2.6 (sau cel puțin 2.3.15). În plus, dacă este necesar, setările CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (tabel de filtrare), CONFIG_IP_NF_NAT (tabel nat), CONFIG_BRIDGE_NETFILTER, precum și numeroase module suplimentare: CONFIG_IP_NF_CONNTRACK (urmărire conexiuni), CONFIG_IP_NF_FTP (modul de ajutor pentru urmărire conexiuni FTP), CONFIG_IP_NF_MATCH_* ( tipuri suplimentare modele de potrivire a pachetelor: LIMIT, MAC, MARK, MULTIPORT, TOS, TCPMSS, STATE, UNCLEAN, OWNER), CONFIG_IP_NF_TARGET_* (acțiuni suplimentare în reguli: REJECT, MASQUERADE, REDIRECT, LOG, TCPMSS), CONFIG_IP_NF_COMPAT_IPCHAINSBINF, CONFIG_IP_NF_COMPAT_IPCHAINSBNFins, CONFIG_IPCHAINSBINF_IN și CONFIG_BRIDGE_EBT_* pentru lucrul în modul bridge, altele CONFIG_IP_NF_* și CONFIG_IP6_NF_*. De asemenea, este util să specificați CONFIG_PACKET.

Așa cum se vede, masa natȘi calandru poate modifica destinatarul sau expeditorul unui pachet de rețea. Acesta este motivul pentru care pachetul de rețea este verificat de mai multe ori pe tabelul de rutare.

Mecanism de detectare a stării (conntrack)

Mai sus, în text, conceptul de „definiție de stat” a fost menționat de mai multe ori, merită un subiect separat de discuție, dar, totuși, voi aborda pe scurt; această întrebareîn postarea curentă. În general, mecanismul de determinare a stărilor (aka mașină de stări, aka conn ecție urmări ing, aka contratrack) face parte din filtrul de pachete și vă permite să determinați cărei conexiuni/sesiuni îi aparține un pachet. Contratrack analizează starea tuturor pachetelor cu excepția celor marcate ca NOTRACK în tabel brut. Pe baza acestei stări se determină pachetul căruia îi aparține nou conexiune (stare NOU), deja stabilit conexiune (stare STABILIT), adiţional la unul deja existent ( LEGATE DE), sau la " altcuiva" (nedetectabil) conexiune (stare INVALID). Starea pachetului este determinată prin analiza antetelor pachetului TCP transmis. modulul conttrack vă permite să implementați un firewall la nivel de sesiune (al cincilea). Pentru a controla acest mecanism, utilizați utilitarul contrar, precum și parametrul utilitar iptables: -m contratrack sau -m stare(învechit). conntrack stochează stările conexiunilor curente în nucleu. Acestea pot fi vizualizate în fișierul /proc/net/nf_conntrack (sau /proc/net/ip_conntrack) .

Pentru a preveni transformarea gândurilor în mush, cred că această scurtă informație va fi suficientă pentru a înțelege mai multe materiale.

Gestionarea regulilor de filtrare a rețelei Netfilter (folosind comanda iptables)

utilitarul iptables este o interfață pentru control firewall netfilter. Această comandă vă permite să editați reguli de tabel, tabele și lanțuri. Cum am spus deja - fiecare regulă este o înregistrare/șir care conține o selecție de pachete de rețea și pachete care se potrivesc cu o anumită regulă. comanda iptables Necesită drepturi root pentru a funcționa.

În general, formatul comenzii este următorul:

Iptables [-t ]

Toți parametrii între paranteze drepte - opțional. Implicit este tabel de filtrare, dacă trebuie să specificați un alt tabel, atunci ar trebui să utilizați cheia -t indicând Nume. După ce este indicat numele tabelului care definește acțiunea ( De exemplu: inserați o regulă sau adăugați o regulă la sfârșitul lanțului sau ștergeți o regulă). stabilește parametrii de selecție. indică ce acțiune trebuie efectuată dacă criteriile de selecție din regulă se potrivesc ( De exemplu: transmiteți pachetul unui alt lanț de reguli, „aruncați” pachetul, emiteți un mesaj de eroare către sursă...).

Mai jos sunt comenzile și parametrii utilitarului iptables:

Parametru Descriere Exemplu
Echipe
--adăugați (-A) Adăugați regula specificată la sfârșitul listei în lanțul specificat și tabelul specificat. iptables -A FORWARD criterii -j acțiune
--sterge (-D) Îndepărtează regula(rile) specificată(e) de număr(e) sau regulă(e). Primul exemplu șterge toate regulile cu numerele 10,12 din toate lanțurile, din tabelele de filtrare, al doilea exemplu șterge regula specificată din tabelul Mangle din lanțul PREROUTING. iptables -D 10.12
iptables -t mangle -D criterii PREROUTING -j acțiune
--rename-chain (-E) Schimbați numele lanțului. iptables -E OLD_CHAIN ​​​​NEW_CHAIN
--flush (-F) Șterge toate regulile tabelului curent. Pentru toate pachetele care se referă la conexiuni deja stabilite, aplicați acțiunea terminalului ACCEPT - skip iptables -F
--inserați (-I) Inserează regula specificată în locația specificată de număr. iptables -I FORWARD 5 criterii -j acțiune
--list (abreviat -L) Vizualizați regulile existente (fără a specifica în mod explicit tabelul - este afișat tabelul de filtrare al tuturor lanțurilor). iptables -L
--politică (-P) Setează politica implicită pentru lanțul dat. iptables -t mangle -P PREROUTING DROP
--înlocuiește (-R) Înlocuiește regula specificată de număr cu cea specificată în criterii. iptables -R POSROUTING 7 | criterii -j acţiune
--delete-chain (-X) Eliminați TOATE lanțurile create manual (păstrați doar INPUT, OUTPUT, FORWARD, PREROUTING și POSTROUTING standard). iptables -X
--zero (-Z) Resetează contoarele datelor transmise în lanț. iptables -Z INPUT
Opțiuni
--numeric (-n) Nu rezolvă adresele și protocoalele în timpul ieșirii.
--line-numere Specificați numerele de regulă în ieșire (poate fi utilizat împreună cu -L). iptables -L --line-numbers
--ajutor (-h) unde am fi fara ea?
-t masa Specifică numele tabelului pe care trebuie efectuată acțiunea. Exemplul resetează tabelul nat în toate lanțurile. iptables -t nat -F
--verbos (-v) Concluzie detaliată. iptables -L -v

Criterii (parametri) pentru selectarea pachetelor de rețea ale comenzii iptables

Criterii de selectare a pachetelor de rețea sunt împărțite în secret în mai multe grupe: Criterii generale, Criterii implicite, Criterii explicite. pot fi folosite în orice regulă, nu depind de tipul de protocol și nu necesită încărcarea modulelor de extensie. (aș numi-o negeneral), acele criterii care se încarcă implicit și devin disponibile, de exemplu, la specificarea unui criteriu general --protocol tcp|udp|icmp. Înainte de utilizare, trebuie să vă conectați extindere suplimentară(acestea sunt deosebite pluginuri pentru netfilter). Extensii suplimentare încărcat folosind parametrul -m sau --Meci. Deci, de exemplu, dacă vom folosi criteriile stat, atunci trebuie să specificăm în mod explicit acest lucru în linia de regulă: -m stareîn stânga criteriului utilizat. Diferență între evidentȘi implicit negeneral Criteriul este ca cele explicite să fie încărcate în mod explicit, iar cele implicite să fie încărcate automat.

Poate fi folosit în toate criteriile semn!înainte de valoarea criteriului. Aceasta va însemna că această regulă acoperă toate pachetele care nu corespund acestui parametru. De exemplu: criteriu --protocol ! tcp va însemna că toate pachetele care Nu protocoalele TCP sunt supuse regulii. in orice caz ultimele versiuni iptables (în special 1.4.3.2 și o versiune ulterioară) nu mai acceptă această sintaxă și necesită utilizarea --protocol ! tcp, A ! --protocol tcp, dând următoarea eroare:

Utilizarea negației intrapoziționate (`--option ! this`) este depreciată în favoarea extrapoziționării (`! --option this`).

Mai jos sunt prezentate sub formă de tabel Parametrii de selecție a pachetelor utilizați în mod obișnuit:

Parametru Descriere Exemplu
Parametri comuni
--protocol
(prescurtat -p)
Definește protocolul. Opțiuni tcp, udp, icmp, toate sau orice alt protocol definit în /etc/protocols iptables -A INPUT -p tcp
--sursă
(-s, --src)
Adresa IP a sursei pachetului. Poate fi definit în mai multe moduri:
  • Gazdă unică: host.domain.tld sau adresa IP: 10.10.10.3
  • Pool de adrese (subrețea): 10.10.10.3/24 sau 10.10.10.3/255.255.255.0

Se recomandă insistent să nu utilizați nume de domenii care necesită interogări DNS pentru rezolvare, deoarece DNS netfilter poate să nu funcționeze corect în timpul etapei de configurare. De asemenea, rețineți că numele sunt rezolvate o singură dată - atunci când adăugați o regulă în lanț. Ulterior, adresa IP corespunzătoare acestui nume se poate modifica, dar acest lucru nu va afecta regulile deja scrise (vor rămâne adresa veche). Dacă specificați Numele domeniului, care se rezolvă la mai multe adrese IP, se va adăuga o regulă separată pentru fiecare adresă.

iptables -A INPUT -s 10.10.10.3
--destinaţie
(-d)
Adresa IP a destinației pachetului. Poate fi definit în mai multe moduri (vezi --source). iptables -A INPUT --destinație 192.168.1.0/24
--in-interfață
(-i)
Identifică interfața pe care a ajuns pachetul. Util pentru NAT și mașini cu mai multe interfețe de rețea. Folosit în lanțurile INPUT, FORWARD și PREROUTING. Este posibil să folosiți semnul „+”, atunci înseamnă utilizarea tuturor interfețelor care încep cu numele + (de exemplu, eth+ - toate interfețele eth). iptables -t nat -A PREROUTING --in-interface eth0
--out-interfață
(-o)
Definește interfața din care va pleca pachetul. Util pentru NAT și mașini cu mai multe interfețe de rețea. Folosit în lanțurile OUTPUT, FORWARD și POSTROUTING. Este posibil să utilizați semnul „+”. iptables -t nat -A POSTROUTING --in-interface eth1
Parametri impliciti (nepartajați).
-p proto -h afișarea ajutorului privind parametrii impliciti ai protocolului proto. iptables -p icmp -h
--sursă-port
(--sport)
Port sursă, posibil numai pentru protocoalele --protocol tcp sau --protocol udp iptables -A INPUT --protocol tcp --source-port 25
--portul de destinație
(--dport)
Port de destinație, posibil numai pentru protocoalele --protocol tcp sau --protemocol udp iptables -A INPUT --protocol udp --destination-port 67
Parametri explici
-m stat --stat(învechit)
aka
-m conttrack --ctstate

Starea conexiunii. Optiuni Disponibile:

  • NOU(Toate pachetele care stabilesc o nouă conexiune)
  • STABILIT(Toate pachetele aparținând conexiunea stabilită)
  • LEGATE DE(Pachete care nu aparțin conexiunii stabilite, dar sunt asociate acesteia. De exemplu - FTP în modul activ utilizări conexiuni diferite pentru transferul de date. Aceste conexiuni sunt legate.)
  • INVALID(Pachete care nu pot fi identificate dintr-un motiv sau altul. De exemplu, erori ICMP care nu aparțin conexiunilor existente)
  • etc. (mai multe detalii în documentație)
iptables -A INPUT -m stare --state NEW,ESTABLISHEDiptables -A INPUT -m conntrack --ctstate NEW,ESTABLISHED
-m mac --mac-source Seturi Adresa mac nod de rețea care a trimis pachetul. Adresa MAC trebuie specificată sub forma XX:XX:XX:XX:XX:XX. -m mac --mac-source 00:00:00:00:00:0

Acțiuni asupra pachetelor

Acest titlu ar fi mai corect reformulat ca „ Acțiuni asupra pachetelor care corespund criteriilor de selecție". Deci, pentru a realiza orice acțiuni asupra pachetelor, trebuie să specificați cheia -j (--sări)și indicați ce acțiune specifică să luați.

Acțiunile asupra pachetelor pot lua următoarele valori:

  • ACCEPT- pachetul pleaca acest lanțși se trece la următorul (la propriu - ACCEPT).
  • CĂDERE BRUSCA- aruncați un pachet care îndeplinește condiția, în timp ce pachetul nu este transmis către alte tabele/lanțuri.
  • RESPINGE- aruncați pachetul prin trimiterea unui mesaj ICMP către expeditor, în timp ce pachetul nu este transmis către alte tabele/lanțuri.
  • ÎNTOARCERE- readuceți pachetul în lanțul anterior și continuați trecerea acestuia începând de la următoarea regulă.
  • SNAT sursă in pachet. Poate fi folosit doar în lanțuri POSTOUTING și OUTPUTîn mesele nat.
  • DNAT- aplicați traducerea adresei numiri in pachet. Poate fi folosit în lanț PRERUUTARE la masa nat. (în cazuri excepționale - în lanțul OUTPUT)
  • BUTURUGA- înregistrați pachetul (trimis demonului) și procesați-l cu alte reguli.
  • MASCARADĂ- folosit în schimb SNAT dacă există o conexiune cu un IP dinamic (este permisă indicarea numai în lanț POSTOUTARE mese nat).
  • MARCĂ- folosit pentru a seta etichete pe pachete și trecut la reguli ulterioare pentru procesare.
  • si etc.

Pe lângă aceste acțiuni, mai sunt și altele care pot fi găsite în documentație (poate că voi completa în curând articolul pe măsură ce voi dezvolta subiectul). Unele acțiuni au parametri suplimentari.

Tabelul de mai jos oferă exemple și descrieri ale parametrilor suplimentari:

Parametru Descriere Exemplu
DNAT (Traducerea adresei rețelei de destinație)
--la-destinație specifică ce adresă IP trebuie înlocuită ca adresă de destinație. În exemplu, în toate pachetele de protocol tcp care ajung la adresa 1.2.3.4, adresa dată va fi înlocuit cu 4.3.2.1. iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -j DNAT --to-destination 4.3.2.1
BUTURUGA
--nivel-log Folosit pentru a seta nivelul de înregistrare (). În exemplu, nivelul maxim de înregistrare este setat pentru toate pachetele tcp din tabelul de filtrare al lanțului FORWARD. iptables -A FORWARD -p tcp -j LOG --depanare la nivel de jurnal
--log-prefix Specifică textul (prefixul) care va precede toate mesajele iptables. (foarte convenabil pentru mai târziu) Prefixul poate conține până la 29 de caractere, inclusiv spații. În exemplu, toate pachetele tcp din tabelul de filtrare al lanțului INPUT cu prefixul INRUT-filter sunt trimise către syslog. iptables -A INPUT -p tcp -j LOG --log-prefix "INRUT-filter"
--log-ip-options Vă permite să intrați în diverse informatii din antetul pachetului IP. iptables -A FORWARD -p tcp -j LOG --log-ip-options
si etc...

Aceasta încheie teoria despre filtrul de rețea netfilter/iptables. În articolul următor voi da exemple practice pentru a înțelege această teorie.

rezumat

În acest articol, ne-am uitat foarte pe scurt la conceptele de bază ale unui filtru de rețea în Linux. Deci, subsistemul netfilter/iptables face parte din nucleul Linux și este folosit pentru organizare diverse scheme filtrarea și manipularea pachetelor de rețea. În acest caz, fiecare pachet trece de la interfata retea, în care a ajuns și mai departe de-a lungul unui anumit traseu de lanțuri, în funcție de dacă este destinat sistem local sau „non-local”. Fiecare lanț constă dintr-un set de tabele care conțin un set secvenţial de reguli. Fiecare regulă constă dintr-un anumit criteriu/criteri pentru selectarea unui pachet de rețea și o acțiune cu pachetul care îndeplinește aceste criterii. În conformitate cu regulile date, orice acțiune poate fi efectuată asupra pachetului (De exemplu, transfer la următorul/altul lanț, resetarea pachetului, modificarea conținutului sau antetelor etc.). Fiecare lanț și fiecare tabelă își au propriul scop, funcționalitate și loc în calea pachetului. De exemplu, pentru filtrarea pachetelor se folosește tabelul de filtrare, care este conținut în trei lanțuri standard și poate fi conținut în lanțuri specificate de utilizator. Calea pachetului se termină fie la interfața de rețea de ieșire, fie prin livrare către un proces/aplicație locală.

Literatură

Destul de multe informații interesante în limba rusă sunt conținute aici:

  • http://www.opennet.ru/docs/RUS/iptables/
  • http://ru.wikibooks.org/wiki/Iptables

Material mai aprofundat este disponibil în limba burgheză aici:

  • http://www.frozentux.net/documents/ipsysctl-tutorial/
  • http://www.netfilter.org/documentation/index.html

Salutări, McSim!

Principiul de setare

Sintaxa generală pentru utilizarea iptables este:

iptables -t<таблица> <команда> <цепочка>[număr]<условие> <действие>

<таблица>

Regulile netfilter sunt distribuite în 4 tabele, fiecare având propriul scop (mai multe detalii mai jos). Este indicat de comutatorul -t, dar dacă acest parametru nu este specificat, acțiunea va fi efectuată pentru tabelul implicit - filtru.

<команда>

Comenzile indică ce fel de acțiune efectuăm pe netfilter, de exemplu, crearea sau ștergerea unei reguli.

<цепочка>

Fiecare tabel are lanțuri, pentru fiecare dintre ele sunt create regulile în sine. De exemplu, pentru tabelul de filtrare de mai sus există trei lanțuri predefinite - INPUT (pachete de intrare), OUTPUT (pachete de ieșire) și FORWARD (pachete de tranzit).

[număr]

Unele comenzi necesită specificarea numărului regulii, de exemplu, pentru a șterge sau edita.

<условие>

O condiție descrie criteriile pentru elaborarea unei anumite reguli.

<действие>

Ei bine, de fapt, ce facem cu pachetul dacă îndeplinește criteriile condiției?

* în dreptate, este de remarcat faptul că cheia de acțiune nu trebuie să vină la sfârșit. Doar că acest format se găsește cel mai adesea în instrucțiuni și face regulile mai ușor de citit.

chei iptables și exemple de utilizare a acestora

Pentru a lucra cu tabele (iptables -t)

Permiteți-mi să vă reamintesc că toate regulile din netfilter sunt distribuite pe tabele. Pentru a lucra cu un anumit tabel, trebuie să utilizați comutatorul -t.

Echipe

Următoarele chei determină acțiunile pe care le efectuează utilitarul iptables.

Cheie Descriere și exemple
-A Adăugarea unei reguli la sfârșitul listei:
iptables -A INPUT -s 192.168.0.15 -j DROP
respinge mesajele primite de la 192.168.0.15.
-D Ștergerea unei reguli:
iptables -D INTRARE 10
ștergeți regula din lanțul INPUT cu numărul 10.
-Eu Inserarea unei reguli într-o anumită parte a listei:
iptables -I INPUT 5 -s 192.168.0.15 -j DROP
introduceți regula a 5-a în listă.
-R Înlocuirea regulii.
iptables -R IEȘIRE 5 -s 192.168.0.15 -j ACCEPT
înlocuiți a 5-a regulă de la interzicere la permisivă.
-F Resetarea regulilor într-un lanț.
iptables -F INPUT
-Z Resetarea statisticilor.
iptables -Z INPUT
-N Crearea unui lanț.
iptables -N CHAINNEW
-X Ștergerea unui lanț.
iptables -X CHAINNEW
-P Definiți regula implicită.
iptables -P INPUT DROP
-E Redenumiți un lanț.
iptables -E CHAINNEW CHAINOLD

Condiții

Aceste chei definesc condițiile regulii.

Cheie Descriere și exemple
-p Protocol de rețea. Opțiunile valide sunt TCP, UDP, ICMP sau ALL.
iptables -A INTRARE -p tcp -j ACCEPT
permiteți toate conexiunile TCP de intrare.
-s Adresă sursă - nume de gazdă, adresă IP sau subrețea în notație CIDR.
iptables -A INPUT -s 192.168.0.50 -j DROP
respinge mesajele primite de la nodul 192.168.0.50
-d Adresa de destinatie. Principiul de utilizare este similar cu cheia anterioară -s.
iptables -A OUTPUT -d 192.168.0.50 -j DROP
refuza ieșirea către nodul 192.168.0.50
-i Adaptor de retea, prin care ajung pachetele (INPUT).
iptables -A INPUT -i eth2 -j DROP
dezactivați traficul de intrare pentru interfața Ethernet eth2.
-o Adaptorul de rețea de la care sunt trimise pachetele (OUTPUT).
iptables -A IEȘIRE -o eth3 -j ACCEPT
Permiteți trimiterea mesajelor de la interfața Ethernet eth3.
--dport Portul de destinație.
iptables -A INTRARE -p tcp --dport 80 -j ACCEPT
Permiteți apeluri primite pe portul 80.
--sportul Port sursă.
iptables -A INPUT -p tcp --sport 1023 -j DROP
interziceți mesajele primite de la portul 1023.

Cheile enumerate acceptă și construcția folosind semnul ! . Acesta inversează condiția, de exemplu,
iptables -A INTRARE -s ! 192.168.0.50 -j DROP
va refuza conexiunea la toate gazdele, cu excepția 192.168.0.50.

Acțiuni

Acțiuni care vor fi efectuate pe un pachet care corespunde criteriilor condiției. Fiecare tabel are propriul său set de acțiuni permise. Specificat folosind o cheie -j.

Masa Acțiune Descriere
filtru ACCEPT Permite pachetul.
CĂDERE BRUSCA Respinge pachetul.
RESPINGE Interzice trimiterea unui mesaj către sursă.
nat MASCARADĂ Pentru pachetele de ieșire, înlocuiește adresa IP sursă cu adresa interfeței din care pleacă pachetul.
SNAT Similar cu MASQUERADE, dar indicând o interfață de rețea specifică a cărei adresă va fi folosită pentru falsificare.
DNAT Înlocuirea adresei pentru pachetele primite.
REDIRECŢIONA Redirecționează cererea către alt port pe același sistem.
calandru T.O.S. Modificarea câmpului TOS (prioritizarea traficului).
DSCP Schimbarea DSCP (de asemenea, prioritizarea traficului).
TTL Modificați TTL (durata de viață a pachetului).
H.L. Similar cu TTL, dar pentru IPv6.
MARCĂ Marcarea pachetului. Folosit pentru filtrarea sau modelarea ulterioară.
CONNMARK Marcarea conexiunii.
TCPMSS Modificarea valorii MTU.

Exemple de comenzi iptables utilizate în mod obișnuit

Comenzi generale

Vedeți regulile cu numerele lor:

iptables -L --line-numbers

Pentru fiecare tabel trebuie să vă uitați la regulile separat:

iptables -t nat -L --line-numbers

Eliminați toate regulile:

Setați regulile implicite:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* în aceste exemple, în mod implicit, regula de refuzare (DROP) va funcționa pentru toate pachetele de intrare (INPUT) și de ieșire (OUTPUT).

Permiteți totul

Metoda 1: Prin adăugarea unei reguli:

iptables -I INTRARE 1 -j ACCEPT

iptables -I IEȘIRE 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

* aceste trei comenzi vor crea reguli care permit toate pachetele de intrare, de ieșire și de tranzit.

Metoda 2. Curățarea regulilor:

* aici eliminăm mai întâi toate regulile (-F), apoi setăm politica implicită pentru a permite intrarea, ieșirea și tranzitul (-S).

Metoda 3. Dezactivarea serviciului (este convenabil să dezactivați temporar firewall-ul pentru a diagnostica problemele):

serviciul iptables se opreste

Lucrul cu reguli

Adăugați o regulă la sfârșitul listei:

iptables -A INTRARE -p tcp --dport 25 -j ACCEPT

iptables -A INPUT -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j ACCEPT

Adăugați un interval de porturi:

iptables -A INTRARE -p tcp --dport 3000:4000 -j ACCEPT

* în acest caz, de la 3000 la 4000.

Introduceți regula:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ACCEPT

Blocați o anumită adresă IP pentru conexiunea pe portul 25:

iptables -I INPUT 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP

Port forwarding

Există două metode de configurare.

1. Reguli de PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT --to-destination 192.168.1.15:2222

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 --sport 2222 -j SNAT --to-source 19.8.232.80:22

* Unde 19.8.232.80 — adresa la care ascultăm cererile de conectare; 22 — port pentru redirecționare; 192.168.1.15 — adresa IP internă la care transferăm toate solicitările; 2222 - port intern.

2. Reguli de PRE-RUTARE + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT --to-destination 192.168.1.15:2222

iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m stare --state NOU,STABILIT,LEGAT -j ACCEPT