traducere ver. 0.6 de catre Riddl Multumiri tuturor celor care m-au ajutat. Lui Gushterul in special. Deasemenea multumiri si lui Little Dragon. Observatie f importanta: probabil ca exista unele greseli in acest document. Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de traducere si pentru observatii pertinente mail me (Riddl) at "discutzii at gmx dot net". Nu uitati sa precizati numele documentului. Multumesc anticipat. Aceasta versiune este putin modificata fata de original, deorece unii termeni sunau foarte aiurea in ro. Pentru ultima versiune a acestui document verifica . Lecturare placuta! ______________________________________________________________________ Linux 2.4 Packet Filtering HOWTO Rusty Russel, lista de discutii netfilter@lists.samba.org $Revision: 1.2 $ $Date: 2002/02/19 11:33:43 $ Acest document descrie folosirea lui iptables pentru filtrarea pachetelor in kernelurile versiunea 2.4. ______________________________________________________________________ Cuprins 1. Introducere 2. Care este site-ul oficial? Exista vreo lista de discutii? 3. Deci, ce inseamna filtru de pachete? 3.1 De ce as vrea sa filtrez pachetele? 3.2 Cum filtrez pachetele sub linux? 3.2.1 iptables 3.2.2 Crearea regulilor permanente 4. Cine dracu esti tu, si de ce te joci cu kernelul meu? 5. Ghidul intr-adevar rapid al lui Rusty pentru filtrarea de pachete 6. Cum traverseaza pachetele filtrele? 7. Folosirea iptables 7.1 Ce vei vedea cand porneste calculatorul 7.2 Operatii pentru o singura regula 7.3 Optiuni de filtrare 7.3.1 Specificarea IP-ului sursa si destinatie 7.3.2 Specificarea inversa 7.3.3 Specificarea protocolului 7.3.4 Specificarea unei interfete 7.3.5 Specificarea fragmentelor 7.3.6 Optiuni extinse la iptables: Noi potriviri 7.3.6.1 Optiuni extinse TCP 7.3.6.1.1 O explicatie pentru flag-urile TCP 7.3.6.2 Optiuni extinse UDP 7.3.6.3 Optiuni extinse ICMP 7.3.6.4 Alte optiuni extinse pentru potrivire 7.3.6.5 Potrivirea dupa stare 7.4 Argumente asupra tintei 7.4.1 Chain-uri definite de utilizator 7.4.2 Optiuni extinse la iptables: Noi tinte 7.4.3 Tinte speciale construite default 7.5 Operatii asupra unui intreg chain 7.5.1 Creearea unui nou chain 7.5.2 Stergerea unui chain 7.5.3 Stergerea tuturor regulilor unui chain 7.5.4 Listarea unui chain 7.5.5 Resetarea counter-elor 7.5.6 Setarea policy-ului 8. Folosirea ipchains si ipfwadm 9. Folosirea impreuna a NAT-ului si a filtrarii de pachete 10. Diferente intre iptables si ipchains 11. Sfaturi asupra designului filtrului de pachete ______________________________________________________________________ 1. Introducere Bine ai venit, cititorule. (:)) Se presupune ca stii ce este aceea o adresa IP, adresa de retea, netmask, routare si DNS. Daca nu, se recomanda sa citesti Network Concepts Howto. Acest HOWTO loveste intre o introducere draguta (care te poate lasa increzator pentru moment, dar neprotejat in lumea reala) si o dezvaluire total neprelucrata (care ii vor lasa pe toti, mai putin caracterele tari, in confuzie, paranoici si in cautarea de arme grele). Reteaua ta nu este sigura. Problema permiterii comunicarii rapide si comode, in acelasi timp cu restrictia acesteia numai pentru bine si nu in mod malefic, este asemanatoare cu alte probleme opuse cum ar fi permiterea vorbirii libere in acelasi timp cu refuzarea unui strigat de "FOC!!" intr-un teatru aglomerat. Nu va fi rezolvata aceasta problema in spatiul acestui HOWTO. Asa ca doar tu poti sa decizi unde va fi compromisul. Voi incerca sa te instruiesc in folosirea unor comenzi disponibile si a unor vulnerabilitati de care sa fii constient, in speranta ca vei folosi aceasta in mod pozitiv si nu in scopuri malefice. Aceasta este o alta problema asemanatoare. (C) 2000 Paul "Rusty" Russell. Cu licenta sub GNU GPL. 2. Care este site-ul oficial? Exista vreo lista de discutii? Sunt trei site-uri oficiale: o Multumiri lui Filewatcher . o Multumiri Echipei Samba si SGI . o Multumiri lui Harald Welte . Le poti accesa pe toate folosind round-robin DNS la: si Pentru lista de discutii oficiala de la netfilter, vezi: . 3. Deci, ce inseamna filtru de pachete? Un filtru de pachete este o bucatica de software care se uita la header-ul pachetelor pe masura ce ele intra, si decid soarta intregului pachet. Acest filtru poate decide sa ignore pachetul (DROP) (respinge pachetul ca si cum nu l-ar fi primit niciodata), accepta (ACCEPT) pachetul (lasa pachetul sa intre), sau alte decizii mai complicate. Sub linux, filtrarea de pachete este construita in kernel (ca modul sau construita in el), si sunt cateva lucruri complicate pe care le putem face cu pachetele, dar principiul general de examinare al header-ului pachetului si decidere asupra sortii pachetului este inca acolo. 3.1 De ce as vrea sa filtrez pachetele? Control. Securitate. Vigilenta. Control: cand folosesti un sistem Linux pentru a-ti conecta reteaua interna la o alta retea (sa spunem, Internet) ai posibilitatea de a permite un anumit tip de trafic, si sa refuzi pe altele. De exemplu, header-ul contine adresa destinatie a unui pachet, asa ca poti preveni pachetele sa se duca spre o anumita parte a retelei exterioare. Ca un alt exemplu, folosesc Netscape pentru accesarea arhivelor Dilbert. Sunt reclame pe pagina de la doubleclick.net, si Netscape imi pierde timpul incarcandu-le. Spunand filtrului de pachete sa nu permita pachete de la sau spre nici una din adresele detinute de catre doubleclick.net, rezolva aceasta problema (cu toate acestea sunt modalitati mai bune pentru aceasta: vezi Junkbuster). Securitate: cand sistemul tau Linux este singurul intre haosul Internetului si reteaua ta ordonata si delicata, este placut sa stii ca poti sa restrictionezi ceea ce vine tropaind la usa. De exemplu, poti sa permiti la tot sa iasa din retea, dar ai putea fi ingrijorat de binecunoscutul "Ping al Mortii" venind de la persoanele din afara rau intentionate. Ca un alt exemplu, s-ar putea sa nu doresti ca persoanele din afara sa se telnet-uiasca pe sistemul tau Linux, chiar daca toate conturile tale au parole. Poate doresti (ca multi oameni) sa fii un observator al Internet-ului, si nu server (de voie, sau in alt mod). Pur si simplu nu lasa pe nimeni sa se conecteze, punand fitrul de pachete sa respinga pachetele folosite la initierea de conexiuni. Vigilenta: uneori o masina prost configurata in reteaua locala va decide sa arunce pachete spre lumea din afara. Este dragut sa-i spui filtrului de pachete sa te anunte daca se intampla ceva anormal; poate poti face ceva cu privire la acel lucru, sau poate esti doar curios. 3.2 Cum filtrez pachetele sub linux? Kernelurile Linux au avut filtrare de pachete inca de la versiunile 1.1. Prima generatie, bazata pe ipfw de la BSD, a fost portata de catre Alan Cox spre sfarsitului anului 1994. Aceasta a fost dezvoltata de catre Jos Vos si altii pentru Linux 2.0; comanda pentru utilizatori "ipfwadm" controla regulile de filtrare ale kernelului. La mijlocului anului 1998, pentru Linux 2.2, am rescris puternic kernelul cu ajutorul lui Michael Neuling, si am introdus comanda pentru utilizatori "ipchains". In sfarsit, a patra generatie de comenzi, "iptables", si o noua rescriere a kernelului s-a intamplat la mijlocul anului 1999 pentru Linux 2.4. Acest HOWTO este centrat pe iptables. Ai nevoie de un kernel care are infrastructura netfilter in el: netfilter este un cadru in interiorul kernelului Linux in care alte lucruri (cum ar fi modulul de iptables) se pot introduce. Asta inseamna ca ai nevoie de kernel versiune 2.3.15 sau peste, si sa raspunzi "Y" la CONFIG_NETFILTER in configurarea kernelului. Comanda iptables comunica kernelului si ii spune ce pachete sa filtreze. 3.2.1 iptables Comanda iptables insereaza si sterge reguli din tabela de filtrare a pachetelor din kernel. Asta inseamna ca orice vei seta, va fi pierdut dupa rebootare; vezi "Crearea regulilor permanente" pentru cum sa fii sigur ca vor fi restaurate data urmatoare cand va boota Linuxul. iptables este un inlocuitor pentru ipfwadm si ipchains: vezi "Folosirea ipchains si ipfwadm" pentru a afla cum poti evita fara probleme folosirea iptables daca folosesti una din aceste comenzi. 3.2.2 Crearea regulilor permanente Setarile firewall-ului tau curent sunt pastrate in kernel, si de aceea vor fi pierdute la rebootare. Poti folosi scripturile iptables-save si iptables-restore sa le salvezi, sau restaurezi dintr-un fisier. O alte cale este sa pui comenzile cerute sa iti setezi regulile intr-un script de initializare. Ai grija sa faci ceva inteligent in caz ca una din comenzi nu ar reusi (de obicei "exec /sbin/sulogin"). 4. Cine dracu esti tu, si de ce te joci cu kernelul meu? Sunt Rusty Russel; cel ce mentine Linux IP Firewall si doar un alt programator care s-a intamplat sa fie in locul potrivit la momentul potrivit. Am scris ipchains (vezi mai sus "Cum filtrez pachetele sub linux?" pentru a da credit celor care au facut de fapt munca), si am invatat suficient sa fac cum trebuie de data asta filtrarea de pachete. Sper. WatchGuard , o compania excelenta de firewall-uri care vinde chiar simpaticul plug-in Firebox, s-a oferit sa ma plateasca sa nu fac nimic, pentru a-mi petrece tot timpul meu sa scriu asta, si sa imi mentin munca anterioara. Am preconizat 6 luni, si mi-au luat 12, dar la sfarsit am simtit ca l-am facut cum trebuie. Multe rescrieri, o cedare a unui hardisk, un laptop furat, doua sisteme de fisiere corupte si un monitor spart mai tarziu, asta este. Cat sunt aici, vreau sa indrept niste idei gresite ale unor oameni: nu sunt un guru al kernelului. Stiu asta, pentru ca munca mea pe partea din kernel m-a adus in contact cu unii din acestia: David S. Miller, Alexey Kuznetsov, Andi Kleen, Alan Cox. Oricum, sunt cu totii ocupati sa faca magia din interior, lasandu-ma sa avansez cu greu prin superficialitate unde este sigur. 5. Ghidul intr-adevar rapid al lui Rusty pentru filtrarea de pachete Cei mai multi oameni au o singura conexiune PPP spre Internet, si nu vor ca cineva sa intre inapoi in reteaua lor, iata firewall-ul: ## Se insereaza modulele pentru connection-tracking (nu este necesar ## daca sunt compilate in kernel) # insmod ip_conntrack # insmod ip_conntrack_ftp ## Se creeaza chain-ul care blocheaza conexiunile noi, cu exceptia celor ## venite din interior. # iptables -N block # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT # iptables -A block -j DROP ## Se sare la acest chain din chain-urile INPUT si FORWARD # iptables -A INPUT -j block # iptables -A FORWARD -j block 6. Cum traverseaza pachetele filtrele? Kernelul porneste cu trei liste de reguli in tabela de "filtrare"; aceste liste sunt numite chain-uri ale firewall-ului sau pur si simplu chain-uri (lanturi). Cele trei chain-uri se numesc INPUT, OUTPUT si FORWARD. Pentru fanii ASCII, chain-urile sunt aranjate cam in felul urmator: (Nota: acesta este un aranjament foarte diferit fata de cel din kernelurile ver. 2.0 si 2.2 !) _____ Incoming / \ Outgoing -->[Routing ]--->|FORWARD|-------> [Decision] \_____/ ^ | | v ____ ___ / \ / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | ----> Local Process ---- Cele trei cercuri reprezinta cele trei chain-uri despre care am vorbit anterior. Cand un pachet ajunge la un cerc din diagrama, acel chain este examinat pentru a decide soarta pachetului. In cazul in care chain-ul spune sa ignore pachetul (DROP), este taiat acolo, daca insa chain-ul spune sa accepte pachetul (ACCEPT), atunci pachetul continua sa parcurga diagrama. Un chain este o lista de verificare cu reguli. Fiecare regula spune "daca headerul pachetului arata asa, atunci iata ce sa faci cu pachetul". Daca regula nu se potriveste cu pachetul, atunci urmatoarea regula din chain (lant) este examinata. In final, daca nu mai exista reguli de examinat, kernelul se uita la politica acelui chain-ului pentru a decide soarta pachetului. Intr-un sistem sigur, politica in chain-uri este de obicei sa taie pachetul (DROP). 1. Cand un pachet vine (sa zicem, prin placa de retea) kernelul se uita intai la destinatia pachetului: aceasta se numeste "routing" (rutare). 2. Daca pachetul este destinat pentru aceasta masina, pachetul trece pe diagrama in chain-ul INPUT. Daca trece de acest chain, orice proces care asteapta acel pachet il va primi. 3. In caz contrar, daca kernelul nu are forwarding-ul pus, sau nu stie cum sa forward-eze pachetul, acesta este ignorat. Daca este pus forwarding-ul, si pachetul are ca destinatie o alta interfata de retea (daca mai ai inca una), atunci pachetul se duce in diagrama noastra direct catre chain-ul FORWARD. Daca este acceptat pachetul va fi transmis. 4. In final, un program ce ruleaza pe sistem poate trimite pachete. Aceste pachete trec direct in chain-ul OUTPUT: daca este acceptat pachetul isi continua drumul fara sa conteze interfata spre care este destinat. 7. Folosirea iptables iptables are o pagina de manual destul de detaliata (man iptables), si daca ai nevoie de detalii mai in amanunt. Aceia dintre voi familiarizati cu ipchains vor dori poate sa se uite la "Diferente intre iptables si ipchains"; sunt comenzi foarte similare. Sunt mai multe lucruri pe care le poti face cu iptables. Pornesti la drum cu trei chainu-ri default care nu pot fi sterse INPUT, OUTPUT si FORWARD. Sa privim operatiile care se pot aplica pentru un intreg chain: 1. Creearea unui chain nou (-N). 2. Stergerea unui chain gol (care nu contine reguli) (-X). 3. Schimbarea politicii pentru un chain default (-P). 4. Listarea regulilor dintr-un chain (-L). 5. Stergerea tuturor regulilor dintr-un chain (-F). 6. Resetarea counter-elor de pachete si bytes pentru toate regulile dintr-un chain (-Z). Sunt mai multe moduri in care se pot manipula regulile intr-un chain: 1. Adaugarea in coada chain-ului a unei noi reguli (-A). 2. Insereaza o regula noua la o anumita pozitie in chain (-I). Daca nu este precizata pozitia printr-un numar atunci regula este adaugata la inceputul chain-ului. 3. Inlocuieste o regula la o anumita pozitie in chain (-R). 4. Sterge o regula la o anumita pozitie in chain, sau prima care se potriveste (-D). 7.1 Ce vei vedea cand porneste calculatorul Iptables poate fi un modul, numit ("iptable_filter.o"), care ar trebui sa fie incarcat in mod automat cand rulezi prima oara iptables. Poate fi deasemenea compilat in kernel in mod permament. Inainte de rularea oricarei comenzi iptables (ai grija: unele distributii vor rula iptables in scripturile lor de initializare), nu vor fi reguli in nici una din chain-urile default ("INPUT", "OUTPUT" si "FORWARD"), toate chain-urile vor avea politica de acceptare a pachetelor (ACCEPT). Poti schimba politica default al chain-ului FORWARD prin stipularea optiunii "forward=0" modulului iptable_filter. (n.t. sau "echo 0 > /proc/sys/net/ipv4/ip_forward", depinde insa si de distributie, pe redhat default inseamna ca forward-ul este 0) 7.2 Operatii pentru o singura regula Aceasta este paine-si-untul, sarea si piperul, si ce mai vreti voi, a filtrarii de pachete; manipularea regulilor. Cel mai obisnuit, vei folosi probabil comenzile de adaugare (-A) si stergere (-D). Celelalte (-I pentru inserare si -R pentru inlocuire) sunt doar extensii ale acestor concepte. Fiecare regula specifica o multime de conditii pe care un pachet trebuie sa le indeplineasca si ce sa faca daca acestea sunt indeplinite (o "tinta" (target)). De exemplu, s-ar putea sa doresti sa ignori toate pachetele de tip ICMP care vin de la adresa 127.0.0.1. Deci, in acest caz conditiile noastre sunt ca protocolul sa fie ICMP si ca adresa sursa sa fie 127.0.0.1. "tinta" noastra este DROP. 127.0.0.1 este interfata "loopback", pe care o ai chiar daca nu ai conexiune reala de retea. Poti folosi programul "ping" pentru a genera acest tip de pachete (pur si simplu trimite pachete ICMP de tip 8 (echo request) la care toate host-urile ar trebui sa raspunda cu pachete ICMP de tip 0 (echo replay)). Aceast program este foarte folositor pentru teste. # ping -c 1 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.2/0.2/0.2 ms # iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP # ping -c 1 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes --- 127.0.0.1 ping statistics --- 1 packets transmitted, 0 packets received, 100% packet loss # Poti vedea aici ca primul ping reuseste ("-c 1" spune sa sa trimita doar un singur pachet). Apoi adaugam in coada (-A) chain-ului "INPUT", o regula ce spune ca pentru pachetele de la 127.0.0.1 ("-s 127.0.0.1") de tip ICMP ("-p icmp") trebuie sa sarim la "DROP" ("-j DROP"). Apoi testam regula noastra, folosind al doilea ping. Va fi o pauza pana cand programul se da batut sa astepte un raspuns care nu va veni niciodata. (:)), cat de DRAMATIC) Am putea sa stergem regula in doua moduri. Intai, deoarece stim ca este singura regula din chain-ul INPUT, putem folosi o stergere numarata, ca in: # iptables -D INPUT 1 # Pentru a sterge regula cu numarul 1 in chain-ul de INPUT. Al doilea mod este sa scriem comanda prin care am introdus regula -A, dar sa inlocuim -A cu -D. Aceasta este folositor cand ai un chain complex de reguli si nu doresti sa le numeri ca sa iti dai seama ca este a 37-a regula de care vrei sa scapi. In aces caz, vom folosi: # iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP # Sintaxa comenzii -D trebuie sa aiba exact aceleasi optiuni cum are comanda -A (sau -I, sau -R). Daca sunt reguli identice in acelasi chain, numai prima regula va fi stearsa. 7.3 Optiuni de filtrare Am vazut folosirea optiunii "-p" pentru a specifica protocolul, si optiunii "-s" pentru a specifica adresa sursa, dar sunt alte optiuni pe care le putem folosi pentru a preciza caracteristici ale pachetului. Ceea ce urmeaza este un compedium complet. 7.3.1 Specificarea IP-ului sursa si destinatie Adresele IP ale sursei ("-s", "--source" sau "--src") si destinatiei ("-d", "--destination" sau "--dst") pot fi specificate in patru moduri. Cea mai obisnuita forma este sa folosesti numele complet, cum ar fi "localhost" sau "www.securityorg.net". Cea de-a doua cale este sa specifici adresa IP cum ar fi "127.0.0.1". Cea de a treia si a patra cale permite specificarea unui grup de adrese IP, cum ar fi "199.95.207.0/24" sau "199.95.207.0/255.255.255.0". Amandoua specifica orice adresa IP de la 199.95.207.0 pana la 199.95.207.255 inclusiv; cifrele dupa "/" spun care parti din adresa IP sunt semnificative. "/32" sau "/255.255.255.255" este default (se potriveste cu toata adresa IP). Pentru a specifica oricare adresa IP "/0" poate fi folosit, astfel: [ NOTA: "-s 0/0" este redundant aici. ] # iptables -A INPUT -s 0/0 -j DROP # Aceasta este folosit in mod rar, deoarece efectul de mai sus este asemanator cu nespecificare deloc a optiunii "-s". 7.3.2 Specificarea inversa Multe optiuni, inclusiv optiunile "-s" (sau "--source") si "-d" ("--destination") pot avea argumentele precedate de "!" (pronuntat "nu") pentru a corespunde adreselor care NU sunt egale cu adresele date. De exemplu, "-s ! localhost" corespunde oricarui pachet care nu vine de la localhost. 7.3.3 Specificarea protocolului Protocolul poate fi specificat prin optiunea "-p" (sau "--protocol"). Protocolul poate fi un numar ( daca stii valorile numerice de protocol pentru IP) sau un nume pentru cazurile speciale de "TCP", "UDP" sau "ICMP". Nu conteaza daca se foloseste sau nu CAPS, asa ca "tcp" merge la fel ca si "TCP". Numele protocolului poate fi precedat de "!", pentru a inversa, ca si "-p ! tcp" pentru a specifica pachetele care nu sunt TCP. 7.3.4 Specificarea unei interfete Optiunea "-i" (sau "--in-interface") si "-o" (sau "--out-interface") specifica numele interfatei cu care sa corespunda. O interfata este dispozitivul fizic prin care intra pachetul ("-i") sau prin care iese pachetul ("-o"). Poti folosi comanda ifconfig pentru a lista interfetele care sunt "sus" (i.e., in stare de functionare in acel moment). Pachetele care traverseaza chain-ul "INPUT" nu au o interfata de iesire, asa ca orice regula care foloseste "-o" in acest chain nu se va potrivi niciodata. In mod similar pachetele care travereseaza chain-ul OUTPUT nu au o interfata de intrare, asa ca orice regula care foloseste "-i" in acest chain nu se va potrivi niciodata. Doar pachetele care travereseaza chain-ul FORWARD au o interata de intrare si de iesire. Este perfect valabil sa specifici o interfata care nu exista; regula nu se va potrivi cu nici un pachet pana cand interfata nu este sus. Aceasta este extrem de folositor pentru legaturi PPP de dial-up (de obicei interfete ppp0) si asemanatoare. Ca un caz special, un nume de interfata terminandu-se cu "+" se va potrivi cu toate interfetele (fie ca exista sau nu) care incep cu acel sir de caractere. De exemplu pentru a specifica o regula care sa se potriveasca tuturor interfetelor PPP, optiunea -i ppp+ ar fi folosita. Numele interfetei poate fi precedata de "!" cu spatii in jur, pentru a corespunde cu pachetul care nu se potriveste cu intefata specificata, de exemplu: -i ! ppp+. 7.3.5 Specificarea fragmentelor Uneori un pachet este prea mare pentru a incape cu totul pe conexiune. Cand aceasta se intampla, pachetul este divizat in fragmente, si trimis ca pachete multiple. Celalalt capat reansambleaza aceste fragmente pentru a construi intregul pachet. Problema cu fragmentele este ca primul fragment are campurile complete in header (IP + TCP, UDP si ICMP) pentru a le examina, dar cele care urmeaza au doar o submultime a header-elor (IP fara campurile protocolului aditional). De aceea privirea in header-e dupa protocol in pachetelor care urmeaza (cum se face in cazul TCP, UDP si ICMP) nu este posibila. Daca faci connection tracking sau NAT, atunci toate fragmentele vor fi reunite inainte de a ajunge la codul filtrului de pachete, asa ca nu trebuie sa te ingrijorezi vreodata pentru fragmente. Te rog sa retii de asemenea: chain-ul INPUT al tabelei de filtrare (sau a oricarei alte tabele care depinde de NF_IP_LOCAL_IN) este traversat dupa defragmentarea stivei principale IP. In caz contrar, este important sa stii cum sunt tratate fragmentele de catre regulile de filtrare. Orice regula de filtrare care cere informatii pe care nu le avem nu se va potrivi. Aceasta inseamna ca primul fragment este tratat ca orice alt pachet. Al doilea si urmatoarele nu vor mai fi. De aceea o regula -p tcp --sport www (specificand un port sursa "www") nu se vor potrivi cu un fragment (altul decat primul). Nici regula opusa nu va face acest lucru -p tcp --sport ! www. Oricum, poti sa specifici o regula special pentru fragmentul al doilea si urmatoarele, folosind optiunea "-f" (sau "--fragment"). Este de asemenea legal sa specifici ca o regula nu se aplica la al doilea si urmatoarele fragmente, prin precedarea lui "-f" cu "!". De obicei este considerat sigur sa lasi sa treaca al doilea si urmatoarele fragmente, deoarece filtrarea va afecta primul fragment, si de aceea previne reansamblarea pe calculatorul destinatie; cu toate acestea, sunt cunoscute bug-uri care permit caderea sistemului doar prin simpla trasnmitere de fragmente. Este decizia ta. Nota pentru network-heads: pachetele cu malformatii (pachete TCP, UDP si ICMP prea scurte codului de firewall ca sa citeasca tipul portului sau codul ICMP si tipul) sunt ignorate cand asemenea examinarii sunt incercate. Astfel sunt si fragmentele TCP care pornesc de la pozitia 8. Ca un exemplu, urmatoarea regula va ignora fragmentele care se duc spre 192.168.1.1: # iptables -A OUTPUT -f -d 192.168.1.1 -j DROP # 7.3.6 Optiuni extinse la iptables: Noi potriviri iptables este extensibil, asta inseamna ca amandoua, iptables si kernelul pot fi extinse pentru a suporta noi optiuni. Unele dintre aceste optiuni sunt standard, altele sunt mai exotice. Aceste optiuni pot fi facute de catre alti oameni si distribuite. Extensiile kernelului sunt gasite deobicei in subdirectorul de module ale kernelului cum ar fi /lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter. Ele se incarca automat daca kernelul tau a fost compilat cu optiunea CONFIG_KMOD, asa ca nu o sa fie necesar sa le incarci manual. Extensiile la programul iptables sunt librarii shared care de obicei se gasesc in /usr/local/lib/iptables/, deseamenea o distributie poate sa le puna in directorul /lib/iptables sau /usr/lib/iptables. Optiuniile vin in doua feluri: noi tinte si noi potriviri (vom vorbi despre tinte ceva mai tarziu). Unele protocoale automat ofera noi teste pentru pachete: in mod curent acestea sunt TCP, UDP si ICMP, cum sunt aratate mai jos. Pentru acestea vei putea sa specifici noile teste in linia de comanda dupa optiunea "-p", care va pune la dispozitie automat optiunile extinse. Pentru a preciza teste noi, foloseste optiunea "-m" pentru a incarca extensia, dupa care optiunile extinse vor putea fi folosite. Pentru a vedea help-ul pentru optiunile extinse foloseste optiunea de incarcare ("-p", "-j" sau "-m") urmat de "-h" sau "--help", de exemplu: # iptables -p tcp --help # 7.3.6.1 Optiuni extinse TCP Optiunile extinse TCP sunt disponibile in mod automat daca se specifica optiunea "-p tcp". Aceste optiuni sunt urmatoarele (nici una dintre ele nu se vor potrivi cu fragmente): --tcp-flags poate fi urmat de semnul optional "!", apoi de doua siruri de flag-uri, care permite filtrarea dupa anumite flag-uri. Primul sir de flag reprezinta mask-ul, flag-urile pe care doresti a le examina. Al doilea sir reprezinta care dintre acestea ar trebui sa fie prezente. De exemplu: # iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP Aceasta comanda spune ca toate flag-urile trebuiesc examinate ("ALL" este sinonim cu "SYN,ACK,FIN,RST,URG,PSH"), dar doar SYN si ACK trebuie sa fie setate. Exista de asemnea un argumente "NONE" similar pentru nici unul dintre acestea. --syn In mod optional precedata de semnul "!", este o prescurtare pentru "--tcp-flags SYN,RST,ACK SYN" --source-port poate fi urmat de un optional "!", si fie de un singur port, fie de o sir de porturi. Porturile pot fi specificate fie folosind numere fie folosind nume, asa cum sunt specificate in /etc/services. sirurile se specifica prin doua porturi despartite de ":", sau (pentru a specifica o sir de porturi mai mare sau egal cu un port dat) un port urmat de ":", sau (pentru a specifica o lista de porturi mai mica sau egala decat un port dat) un port precedat de ":". --sport este sinonim cu --source-port --destination-port si --dport sunt similare cu modul in care se specifica portul sursa numai ca in loc de portul sursa se face potrivirea dupa portul destinatie. --tcp-option urmat de un optional "!" si un numar, se potriveste pentru un pachet cu optiunea TCP egala cu acel numar. Un pachet care nu are un header complet TCP este ignorat automat daca este facuta incercarea de a se examina headerele TCP. 7.3.6.1.1 O explicatie pentru flag-urile TCP Uneori este folositor sa permiti conexiunile TCP intr-o singura directie, nu si in cealalta. De exemplu, ai putea sa permiti conexiuni catre un server extern WWW, dar nici o conexiune de la acel server. Naiv ar fi sa blochezi pachetele TCP dinspre server. Din pacate, conexiunile TCP cer pachetele sa circule in ambele directii. Solutia ar fi sa blochezi numai pachetele folosite pentru a initia conexiuni. Aceste pachete sunt numite pachete SYN (ok, tehnic sunt pachete cu flag SYN pus si cu flagurile RST si ACK nepuse, dar le numim pe scurt pachete SYN). Prin ignorarea acestor pachete, putem sa oprim aceste conexiuni. Optiunea "--syn" este folosita pentru aceasta; este valida numai pentru regulile in care specificam tcp ca protocol. De exemplu, pentru a specifica incercarile de conexiune de la 192.168.1.1: -p TCP -s 192.168.1.1 --syn Aceasta optiune poate fi inversat prin precedarea "--syn" cu semnul "!". 7.3.6.2 Optiuni extinse UDP Aceste optiuni sunt automat disponibile cand se specifica "-p udp". Acestea sunt: "--source-port", "--sport","--destination-port" si "--dport" care au fost detaliate mai sus. 7.3.6.3 Optiuni extinse ICMP Aceste optiuni sunt automat disponibile cand se specifica "-p icmp". Este doar o singura optiune noua: --icmp-type urmat de un semnul optional "!", apoi de numele tipului icmp (ex. "host-unreachable"), sau tipul numeric (ex. "3"), sau tipul numeric si codul separate de "/" (ex. "3/3"). O lista a numelor de tipuri de pachete icmp este data folosind "-p icmp --help". 7.3.6.4 Alte optiuni extinse pentru potrivire Alte optiuni extinse in pachtetul de filtrare sunt optiuni demonstrative, care (daca sunt instalate) pot fi invocate cu optiunea "-m". mac Acest modul trebuie in mod explicit specificat prin optiunea "-m mac" sau "--match mac". Este folosit pentru a se potrivi cu pachetele ce au o anumita adresa ethernet MAC, si de aceea este folositoare numai pentru pachetele care traverseaza chain-urile PREROUTING si INPUT. Este disponibila o singura optiune noua: --mac-source urmat de semnul optional "!", apoi de o adresa ethernet in notatie hexa separata prin ":", ex. "--mac-source 00:60:08:91:CC:B7". limit Acest modul trebuie in mod explicit specificat prin optiunea "-m limit" sau cu "--match limit". Este folosit pentru a restrange rata de potriviri, ca de exemplu pentru reprimarea mesajelor in log-uri (log-urile sunt fisierele in care sistemul scrie anumite date considerate importante, in ideea de a putea fi accesate mai tarziu). Se vor potrivi numai un numar dat de pachete pe secunda (default 3 potriviri pe ora, la un numar maxim de 5 potriviri). Sunt disponibile doua optiuni: --limit urmat de un numar; specifica numarul maxim de potriviri permise pe secunda. Numarul poate fi specificat pe unitati de timp explicite, folosind "/second", "/minute", "/hour" or "/day", sau parti din ele (ex. "5/second" este la fel cu "5/s"). --limit-burst urmat de un numar, indica numarul maxim de potriviri dupa care limita de mai sus intra in actiune. Aceasta potrvire poate adesea fi folosita cu tinta LOG pentru a face logare limitata dupa o rata. Pentru a intelege cum functioneaza sa ne uitam la urmatoarea regula care logheaza cu parametri de limita default: # iptables -A FORWARD -m limit -j LOG Prima data cand se ajunge la aceasta regula, pachetul va fi scris in log-uri, de fapt, deorece numarul limita este 5, primele 5 pachete vor ajunge in log-uri. Dupa aceasta vor trece 20 de minute pana cand alt pachet sa ajunga in log-uri datorita acestei reguli, fara sa conteze numarul de pachete care ajung la regula. Dupa 20 de minute limit-burst-ul, numarul de pachete care vor putea fi primite va fi unu, dupa inca 20 de minute va mai creste cu o unitate, daca nici un pachet nu s-a potrivit cu regula. Deasemenea, la fiecare 20 de minute care trec fara ca pachete sa se potriveasca regulii, numarul limita va creste cu o unitate; daca nici un pachet nu se potriveste cu regula dupa 100 de minute, numarul limita va fi din nou atins, inapoi de unde am plecat. Nota: nu poti crea o regula cu un timp de reincarcare mai mare de 59 de ore, asa ca daca pui o limita de 1/zi, atunci numarul maxim de potriviri (burst-rate) trebuie sa fie mai mic decat 3. Poti de asemenea sa folosesti acest modul pentru a te feri de diferitele atacuri denial of service (DoS) cu o rata mai mare pentru a creste sensibilitatea. Protectie pentru syn-flood: # iptables -A FORWARD -p tcp --syn -m limit 1/s -j ACCEPT Pentru scannere de porturi clandestine: # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT Pingul mortii: # iptables -A FORWARD -p icmp --icmp-type echo-request -m -m limit --limit 1/s -j ACCEPT Acest modul se comporta ca o "usa histeresis", ca in graficul urmator: rata (pachete/s) ^ .---. | / DoS \ | / \ Limita DoS -|.....:.........\....................... = (limit * | /: \ limit-burst) | / : \ .-. | / : \ / \ | / : \ / \ End of DoS -|/....:..............:.../.......\..../. = limit | : :"-" "--" -------------+-----+--------------+------------------> time (s) LOGIC => Potrivire | Nepotrivire | Potrivire Sa consideram ca avem o potrivire de un pachet pe secunda cu o limita maxima de 5 pachete, dar pachetele vin cu o rata de patru pe secunda timp de 3 secunde, apoi incep din nou sa vina peste 3 secunde. <--Flood 1--> <---Flood 2---> Pachete^ Line __-- YNNN total | Rate __-- YNNN | mum __-- YNNN 10 | Maxi __-- Y | __-- Y | __-- Y | __-- YNNN |- YNNN 5 | Y | Y Legenda: Y -> se potriveste cu regula | Y N -> nu se potriveste cu regula | Y |Y 0 +---------------------------------------------> timpul in secunde 0 1 2 3 4 5 6 7 8 9 10 11 12 Se poate vedea ca primele 5 pachete sunt permise sa depaseasca limita de un pachet pe secunda, apoi limit intervine. Daca este o pauza de o secunda inca un pachet in plus va fi permis sa treaca. Intodeauna insa, nu se va permite depasirea de un pachet/secunda dupa ca numarul limita (burst-limit) este atins. owner acest modul incearca sa se potriveasca trasaturilor diferite ale creatorului pachetului, pentru pachetele generate local. Este valid numai in chain-ul OUTPUT, si chiar si atunci unele pachete (cum ar fi raspunsurile de tip ICMP) pot sa nu aiba creator, si de aceea sa nu se potriveasca. --uid-owner userid se potriveste daca pachetul a fost creat de catre un proces cu acelasi id de user. --gid-owner groupid se potriveste daca pachetul a fost creat de catre un proces cu acelasi id de group. --pid-owner processid se potriveste daca pachetul a fost creat de catre un proces cu acelasi id de proces. --sid-owner sessionid se potriveste daca pachetul a fost creat de catre un proces in grupul de sesiune dat. unclean Acest modul experimental trebuie sa fie in mod explicit specificat cu optiunea "-m unclean" sau "--match unclean". Realizeaza niste teste variate de sanatate asupra pachetelor. Acest modul nu a fost testat, si nu ar trebui sa fie folosit ca o unealta in securitate (probabil ca inrautateste lucrurile din cauza ca el insusi s-ar putea sa aiba buguri). Nu este disponibila nici o optiune. 7.3.6.5 Potrivirea dupa stare Cele mai folositoare optiuni este furnizata de modulul "state", care interpreteaza analizele detectorului de conexiuni ale modulului "ip_conntrack". Aceasta este foarte recomandata. Specificarea modulului "-m state" permite folosirea unei optiuni aditionale de stare "--state". Aceste stari sunt: NEW un pachet care creeaza o noua conexiune. ESTABLISHED un pachet care apartine unei conexiuni deja stabilite (un pachet replica (replay), sau un pachet care pleaca al unei conexiuni care a primit replayuri). RELATED Un pachet care este inrudit, dar care nu este parte a unei conexiuni existente, cum ar fi o eroare ICMP, sau (cu modulul FTP introdus), un pachet care stabileste o conexiune FTP. INVALID Un pachet care nu a putut fi identificat pentru niste motive: aceasta include ramanerea fara memorie sau erori ICMP care nu apartin nici unei conexiuni cunoscute. In mod normal aceste pachete ar trebui ignorate. Un exemplu pentru aceasta puternica optiune de potrivire ar fi: # iptables -A FORWARD -i ppp0 -m state ! NEW -j DROP 7.4 Argumente asupra tintei Acum stim ce examinare poate fi facuta asupra unui pachet, avem nevoie de o cale pentru a preciza ce sa facem cu pachetele care se potrivesc testelor noastre. Aceasta este numita tinta unei reguli. Exista doua foarte simple tinte incluse: DROP si ACCEPT. Ne-am intalnit deja cu aceastea. Daca o regula se potriveste cu un pachet si tinta regulii este una din aceste doua, nici una din regulile urmatoare nu sunt consultate, soarta pachetului a fost decisa. Mai sunt doua tipuri de tinte pe langa acestea incluse: tinte extinse si chain-urile definite de catre utilizator. 7.4.1 Chain-uri definite de utilizator O caracteristica puternica pe care iptables o mosteneste de la ipchains este posibilitatea utilizatorului de a crea chain-uri noi, pe langa cele incluse default (INPUT, OUTPUT si FORWARD). Prin conventie, chain-urile definite de catre utilizator se scriu cu litera mica pentru a le deosebi (vom descrie mai jos cum sa cream acest tip de chain-uri in "7.5 Operatii asupra unui intreg chain"). Cand un pachet se potriveste cu o regula a carei tinta este un chain definit de catre utilizator, pachetul incepe sa traverseze chain-ul definit de catre utilizator. Daca acel chain-ul nu decide soarta pachetul de indata ce pachetul ajunge la sfarsitul chain-ului respectiv, pachetul continua traversarea chain-ului initial. Este timpul pentru niste arta ASCII. Considera doua chain-uri aiurea: INPUT (chain-ul inclus default) si test (un chain definit de utilizator). "INPUT" "test" ---------------------------- ---------------------------- | Rule1: -p ICMP -j DROP | | Rule1: -s 192.168.1.1 | |--------------------------| |--------------------------| | Rule2: -p TCP -j test | | Rule2: -d 192.168.1.1 | |--------------------------| ---------------------------- | Rule3: -p UDP -j DROP | ---------------------------- Considera un pachet TCP venind de la 192.168.1.1 si ducandu-se catre 1.2.3.4. Acesta intra in chain-ul INPUT. Rule1 nu se potriveste cu el, Rule2 se potriveste asa ca urmatoarea regula care este examinata este prima din chain-ul test. Rule1 se potriveste dar nu este specificata nici o tinta, asa ca urmatoarea regula este examinata. Rule2 nu se potriveste asa ca am ajuns la sfarsitul chain-ului. Astfel ne reintoarcem in chain-ul INPUT, unde am examinat Rule2, asa ca examinam Rule3 care nici aceasta nu se potriveste. Deci calea urmata de catre pachet este: v __________________________ "INPUT" | / "test" v ------------------------|--/ -----------------------|---- | Rule1 | /| | Rule1 | | |-----------------------|/-| |----------------------|---| | Rule2 / | | Rule2 | | |--------------------------| -----------------------v---- | Rule3 /--+___________________________/ ------------------------|--- v Chain-urile definite de catre utilizator pot sari la alte chain-uri definite de catre utilizator (dar nu crea trasee in cerc, pachetele tale vor fi ignorate daca intra in bucla). 7.4.2 Optiuni extinse la iptables: Noi tinte Celalat tip de optiune extinsa este o tinta. O tinta extinsa este formata dintr-un modul de kernel si o extensie optionala la iptables pentru a pune la dispozitie noi optiuni in linia de comanda. Sunt mai multe optiuni extinse in distributia default a netfilter-ului: LOG Acest modul permite log-area de catre kernel a pachetelor care se potrivesc. Acest modul pune la dispozitie urmatoarele optiuni aditionale: --log-level urmat de un numar al nivelului sau de un nume. Numele corecte sunt (nu conteaza daca sunt scrise cu litera mare sau nu) "debug", "info", "notice", "warning", "err", "crit" and "emerg", corespunzand numerelor de la 7 la 0. Citeste man-ul de la syslog.conf pentru o explicatie privind aceste niveluri de logare. Nivelul default este "warning". --log-prefix urmat de un sir de caractere pana la 29 de caractere, acest mesaj este pus in fata mesajului care este logat, pentru a-i permite identificarea unica. Acest modul este bun dupa o limita de potrivire, pentru a nu-ti flooda fisierele de log. REJECT Acest modul are acelasi efect cu "DROP", cu exceptia faptului ca celui ce trimite pachetele ii este trimis mesaj de eroare ICMP "port unreachable". Bagati la cap ca mesajul de eroare ICMP nu este trimis daca (citeste RFC 1122): - pachetul de il filtrezi a fost de la inceput o eroare ICMP sau alt tip de pachet ICMP necunoscut. - pachetul ce este filtrat nu este un fragment de inceput. - am trimis recent prea multe mesaje de eroare ICMP catre acea destinatie ( cat /proc/sys/net/ipv4/icmp_ratelimit). REJECT pune de asemenea la dispozitie o noua optiune "--reject-with" care modifica pachetul folosit la replay: man iptables. 7.4.3 Tinte speciale construite default Sunt doua tinte speciale contruite default: RETURN si QUEUE. RETURN are acelasi efect cu trecerea direct la sfarsitul chain-ului: pentru o regula in chain-ul inclus default politica acelui chain-ului este executata. Pentru o regula intr-un chain definit de catre utilizator, traversarea continua in chain-ul anterior, exact dupa regula care a determinat trecerea la acest chain. QUEUE este o tinta speciala, care pune in rand pachetul pentru procesare de catre programe utilizator. Pentru ca aceasta sa fie folositor doua urmatoare componente sunt cerute: - un "gestionar al cozii", care se ocupa de mecanismele propriu-zise de trecere a pachetelor intre kernel si modul utilizator; si - un program in mod utilizator pentru a primi, posibil a manipula, si a da verdicte in ceea ce priveste pachetele. Gestionarul standard al cozii pentru iptables IPv4 este modulul ip_queue, care este distribuit cu kernelul si considerat experimental. Ceea ce urmeaza este un scurt exemplu despre cum sa folosesti iptables pentru a pune in coada pachetele pentru procesare in mod utilizator: # modprobe iptable_filter # modprobe ip_queue # iptables -A OUTPUT -p icmp -j QUEUE Cu aceasta regula, pachetele ICMP generate local (care sunt create , sa zicem, cu ping) sunt pasate modulului ip_queue, care apoi incearca sa livreze pachetele unei aplicatii in mod utilizator. Daca nici o aplicatie nu asteapta acele pachete, acestea sunt ignorate. Pentru a scrie o aplicatie in mod utilizator, poti folosi libipq API. Acesta este distribuit impreuna cu iptables. Cod exemplu poate fi gasit in programele de testare (redirect.c) in CVS. Starea lui ip_queue poate fi verificata prin: /proc/net/ip_queue Marimea maxima a unei cozi (i.e. numarul de pachete livrata modului utilizator fara primirea inapoi a unei comfirmari) poate fi controlat prin: /proc/sys/net/ipv4/ip_queue_maxlen Marimea default pentru marimea maxima a cozii este 1024. Odata ce aceasta limita este atinsa, noile pachete vor fi ignorate pana cand marimea cozii scade sub nivelul limita. Protocoale bine gandite ca TCP interpreteaza pachetele ignorate ca aglomerare, si din fericire va inceta livrarea de pachete cand coada este plina. Cu toate acestea, va lua ceva experimente pentru a determina valoare ideala pentru marimea cozii pentru o situatie data daca valoarea default este prea mica. 7.5 Operatii asupra unui intreg chain O foarte folositoare caracteristica a iptables-ului este posibilitatea de a grupa mai multe reguli intr-un chain. Poti numi chain-urile cum doresti, dar recomand folosirea literelor mici pentru a evita confuzia cu chain-urile incluse default si tinte. Numele de chain-uri pot fi pana la 31 de litere in lungime. 7.5.1 Creearea unui nou chain Sa cream un nou chain. Pentru ca sunt un tip cu atata imaginatie o sa o numesc test. Pentru aceasta folosim optiunea "-N" sau "--new-chain": # iptables -N test # Este atat de simplu. Acum poti introduce reguli in el cum am aratat mai sus. 7.5.2 Stergerea unui chain Si sergerea unui chain este deasemenea simpla, prin folosirea optiunilor "-X" sau "--delete-chain". De ce "-X"? Pai toate literele bune au fost luate. # iptables -X test # Sunt cateva restricitii la stergerea de chain-uri: acestea trebuie sa fie goale (vezi "Stergerea tuturor regulilor unui chain" dedesubt) si nu trebuie sa fie tinta nici unei reguli. Nu poti sterge nici unul dintre chain-rile incluse default. Daca nu specific numele chain-ului, atunci toate chain-urile definite de catre utilizator vor fi sterse daca este posibil. 7.5.3 Stergerea tuturor regulilor unui chain Exista un mod simplu de de sterge toate regulile dintr-un chain, folosind optiunile "-F" (sau "--flush"). # iptables -F FORWARD # Daca nu este specificat chain-ul atunci toate chain-urile vor fi sterse de reguli. 7.5.4 Listarea unui chain Poti lista toate regulile dintr-un chain prin folosirea optiunii "-L" (sau "--list"). "refcnt-ul"(reference count) listat pentru fiecare chain definit de catre utilizator este numarul de reguli care au ca tinta acest chain. Acesta trebuie sa fie zero (si chain-ul sa fie gol) inainte ca acest chain sa poata fi sters. Daca numele chain-ului este omis, toate chain-urile sunt listate, chiar si cele care sunt goale. Exista trei optiuni care pot fi adaugate la "-L". Optiunea "-n" (numeric) este foarte folositoare deoarece previne iptables in a incerca sa rezolve IP-urile in nume, care (daca folosesti DNS ca majoritatea oamenilor) va cauza mari intarzieri daca DNS-ul tau nu este setat corect, sau ai filtrat cererile catre DNS. Determina deasemenea ca porturile TCP si UDP sa fie afisate ca numere in loc de nume. Optiunea "-v" arata toate detaliile regulilor, cum ar fi counter-ele pentru de pachete si bytes, comparatiile TOS, interfata. Altfel aceste detalii sunt omise. Observa faptul urmator: counter-ele pentru pachete si bytes sunt afisate folosind sufixele "K", "M" sau "G" pentru 1000, 1,000,000 si respectiv 1,000,000,000. Folosirea lui optiunii "-x" (expandare a numerelor) afiseaza numerele in formatul maxim, fara sa conteze cat sunt de mari. 7.5.5 Resetarea counter-elor Este folositoare posibilitatea de a putea sa resetezi counter-ele. Aceasta poate fi facuta cu optiune "-Z" (sau "--zero"). Considera urmatoarele: # iptables -L FORWARD # iptables -Z FORWARD # In exemplul de mai sus, unele pachete au putut sa vina intre cele doua comenzi. Pentru acest motiv, poti folosi cele doua optiuni "-L" si "-Z" impreuna, pentru a reseta counter-ele in timp ce le afisezi. 7.5.6 Setarea policy-ului Am explicat ce se intampla cand un pachet ajunge la capatul unui chain inclus default si am discutat mai devreme cum parcurge un pachet chain-urile. In acest caz, policy-ul chain-ului determina soarta pachetului. Doar chain-urile incluse default (INPUT, OUTPUT si FORWARD) au policy-uri, deoarece daca un pachet ajunge la capatul unui chain definit de catre utilizator, traversarea continua in chain-ul anterior. Politica poate fi fie ACCEPT, fie DROP, de exemplu: # iptables -P FORWARD drop # 8. Folosirea ipchains si ipfwadm Sunt module in distributia netfilter pe nume ipchains.o si ipfwadm.o. Insereaza unul dintre acestea in kernelul tau ( Observatie: aceste module sunt incompatibile cu ip_tables.o). Apoi poti folosi ipchains sau ipfwadm ca in vremurile de alta data. Aceasta va fi suportata pentru inca un timp. Cred ca o formula rezonabila este 2 * [nota inlocuirii - prima versiune stabila], dupa data cand o versiune stabila a inlocuirii este disponibila. Asta inseamna ca suportul va fi probabil abandonat in Linux 2.6 sau 2.8. 9. Folosirea impreuna a NAT-ului si a filtrarii de pachete Este normal sa vrei sa faci NAT (vezi NAT HOWTO) si filtrare de pachete. Veste buna este ca se pot folosi impreuna extrem de bine. Faci filtrarea de pachete ingorand total orice NAT ai deja. Sursa si destinatia vazute de catre filtrul de pachete vor fi sursele si destinatiile reale. De exemplu daca faci DNAT pentru a trimite orice conexiune pentru 1.2.3.4 portul 80 spre 10.1.1.1 portul 8080, filtrul de pachete va vedea pachetele ducandu-se catre 10.1.1.1 portul 8080 (adresa reala), nu 1.2.3.4 port 80. In mod similar poti ignora masquerading: pachetele vor parea ca vin de la adresa lor IP interna reala (sa zicem 10.1.1.1), si replay-urile vor parea ca se duc inapoi acolo. Poti folosi optiunea extinsa de potrivire "match" fara sa pui filtrul de pachete sa faca munca in plus, deoarece NAT cere detectarea de conexiuni oricum. Pentru a dezvolta exemplul simplu de masquerading din NAT HOWTO pentru a nu permite noi conexiuni pe interfata ppp0, vei face urmatoarele: # masquerading pentru ppp0 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # refuzarea de pachete NOI sau INVALIDE forwardate sau care vin prin ppp0 iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP # se da drumu la IP forwarding echo 1 > /proc/sys/net/ipv4/ip_forward 10. Diferente intre iptables si ipchains o In primul rand, numele chain-urilor predefinite si-au schimbat scrierea din litere mici in litere mari, deoarece chain-urile INPUT si OUTPUT primesc acum doar pachete cu destinatie locala si pachete generate local. Ele obisnuiau sa vada toate pachetele care intrau si respectiv care ieseau. o Optiunea "-i" acum inseamna interfata de intrare si are sens numai in chain-urile INPUT si FORWARD. Regulile in chain-urile OUTPUT si FORWARD care foloseau inainte "-i" vor trebuie sa fie schimbate cu "-o". o Porturile TCP si UDP trebuie sa fie precizate folosind optiunile --source-port sau --sport (sau --destination-port/--dport), si trebuie puse dupa optiunile "-p tcp" sau "-p udp", deorece acestea incarca optiunile disponibile extensiilor TCP si respectiv UDP. o Argumentul TCP -y a devenit acum --syn si trebuie pus dupa "-p tcp". o In cele din urma tinta DENY a deveni DROP. o Resetarea counter-elor pentru un singur chain in timp concomitent cu listarea acestuia este acum posibila. o Resetara counter-elor pentru chain-urile predefinite resetezeaza desemenea counter-ele policy-ului chain-urilor respective. o Listarea counter-elor iti arata counter-ele instant. o REJECT si LOG sunt acum tinte extinse, insemnand ca sunt module de kernel separate. o Numele pentru chain-uri pot fi pana la 31 de caractere in lungime. o MASQ este acum MASQUERADE si foloseste o sintaza diferita. REDIRECT, desi si-a pastrat vechiul nume, a suferit deasemenea o schimbare de sintaxa. Citeste NAT-HOWTO pentru mai multe informatii despre cum sa le configurezi. o Optiunea "-o" nu mai este folosita pentru a conduce pachetele in mod utilizator (vezi -i de mai sus). Pachetele sunt trimise acum in mod utilizator folosind tinta QUEUE. o Probabil o gramada de alte lucruri pe care le-am uitat. 11. Sfaturi asupra designului filtrului de pachete In domeniul securitatii cel mai bun lucru este sa blochezi totul, apoi sa deschizi gauri acolo unde este necesar. Aceasta este deobicei spus "ceea ce nu este in mod explicit permis este interzis". Recomand aceasta daca securitatea este grija ta cea mai mare. Nu rula nici un serviciu de care nu ai nevoie, chiar daca ai blocat accesul la el. Recomand securitatea in adancime: combina tcp-wrappers (pentru conexiuni catre insusi filtrul de pachete), proxy-uri (pentru conexiuni ce trec peste filtrul de pachete), verificarea routei si filtrare de pachete. Verificarea routei este cand un pachet care vine de la o interfata de la care nu poate veni este ignorate: de exemplu, daca reteaua ta interna are adresele 10.1.1.0/24, si un pachet care are ca sursa o adresa apartinand acelei clase vine pe interfata externa, acesta va fi ignorat. Aceasta verificare a routei poate fi activate pentru o interfata (ppp0) astfel: # echo 1 > /proc/sys/net/ipv4/conf/ppp0/rp_filter # Sau pentru toate interfetele existente si viitoare astfel: # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do # echo 1 > $f # done # Debian realizeaza acest lucru "by default" cand este posibil. Daca ai routare asimetrica (te astepti sa primesti pachete din directii ciudate), vei dori sa dezactivezi aceasta filtrare pe interfetele respective. Logarea pachetelor este folositoare cand configurezi un firewall si ceva nu merge, insa pe un sistem in productie, intodeauna foloseste aceasta in combinatie cu limitare, pentru a preveni floodarea fisierelor cu log-uri. Recomand pentru sistemele sigure depistarea conexiunilor (connection tracking): determina o incarcare a sistemului, deoarece toate conexiunile sunt depistate, dar este foarte folositoare pentru a controla accesul la retelele tale. S-ar putea sa trebuiasca sa incarci modulul "ip_conntrack.o" daca kernelul tau nu incarca in mod automat modulele si nu este compilat in kernel. Daca vrei sa depistezi cu precizie protocoale complexe, va trebui sa incarci modulul necesar pentru aceasta (ex. "ip_conntrack_ftp.o"). # iptables -N no-conns-from-ppp0 # iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT # iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix "Bad packet from ppp0:" # iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix "Bad packet not from ppp0:" # iptables -A no-conns-from-ppp0 -j DROP # iptables -A INPUT -j no-conns-from-ppp0 # iptables -A FORWARD -j no-conns-from-ppp0 Construirea unui bun firewall este peste scopul acestui HOWTO, dar sfatul meu este ca "intodeauna sa fii minimalist". Citeste Security HOWTO pentru mai multe informatii privind testarea si examinarea sistemului.