duminică, 18 ianuarie 2015

Tutorial utilizare iptables


 


Toate încep cu un prim pas….

1. Ștergere reguli existente
Înainte de a construe un nou set de reguli trebuie resetate toate regulile existente.
Comanda este iptables –F   sau iptables –flush

2. Stabilire reguli implicite
Regula implicit este ACCEPT. Motivul pentru care se folosește iptables este simplu- nu se dorește ca aceasta să rămână  regula  implicită. Se va schimba cu DROP (respingere pachete fără atenționare) pentru   INPUT, FORWARD, and OUTPUT astfel
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
Dacă pentru INPUT și OUTPUT regula implicit este DROP pentru fiecare excepție firewall trebuiesc definite 2 reguli, una pentru pachetele de intrare și alta pentru pachetele de ieșire
Dacă aveți încredere în utilizatorii rețelei interne  nu rulați comanda iptables -P OUTPUT DROP.  În acest caz trebuiesc definite reguli numai pentru conexiunile de intrare (INPUT din exteriorul rețelei interne către calculatoarele din rețeaua internă). Aceasta este de fapt setarea implicită la rețelele Windows.

3. Blocarea unei adrese IP
Blocarea unei adrese IP se realizează direct cu comanda
iptables -A INPUT -i eth0 -s x.x.x.x -j DROP  
sau
iptables -A INPUT -i eth0 -p tcp -s x.x.x.x  -j DROP  unde x.x.x.x este adresa IP
Tag-ul –A înseamnă adăugarea unei noi reguli. Tagul –p tcp arată că vor fi blocate pachetele transmise prin protocolul TCP. Tagul –j specifică ce se va întâmpla cu pachetele de date astfel ACCEPT –accept, DROP –refuz, QUEQUE- trimiterea în coada de așteptare și RETURN retransmiterea la expeditor.
Tagul -s arată sursa pachetelor de date. Dacă dorim stergerea acestei reguli se folosește tag-ul –D de exemplu
iptables -D INPUT -i eth0 -s x.x.x.x -j DROP  
iptables -D INPUT -i eth0 -p tcp -s x.x.x.x  -j DROP 
Regulile sunt numerotate  de aceea se poate folosi pentru stergere comanda
iptables -D INPUT 1
Pentru a vizualiza regulile din iptables comanda este
iptables -L
O altă modalitatea este folosirea unui fisier script (fișier text făcut executabil cu comanda chmod 700 file.txt și rulat cu comanda  ./file.txt din folderul fișierului
În acest caz putem defini o variabila căreia îi atribuim valoarea adresei IP astfel
BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
Acest mod de lucru în aparență mai complicat este foarte util pentru a vizualiza mai rapid în log-uri adresa IP care generează „trafic suplimentar”.
Se poate bloca traficul de pe o adresă IP pe o anumită interfață de rețea de exemplu
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

4. Permiterea conexiunilor SSH
Următoarea regulă permite efectuarea de conexiuni SSH pe interfața de rețea  eth0 .
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Tagul port permite specificarea unui port anume (în cazul ssh portul 22) iar prefixul -d arată destinația către portul 22 . Similar –sport indică ca sursă a traficului portul 22
Setul de două instrucţiuni este necesar pentru INPUT/OUTPUT. Este recomandat ca în loc de prima instrucțiune pentru ssh să se folosească următoarele
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW, ESTABLISHED  -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP.
Și, bineînțeles, ar trebui ca portul implicit pentru SSH să fie modificat.


5.Permiterea conexiunilor SSH numai dintr-o anumită reţea
Dacă dorim să fie premise conexiunile SSH numai din reţeaua 192.168.33.0 comanda este
iptables -A INPUT -i eth0 -p tcp -s 192.168.33.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
În loc de masca restrânsă de reţea se poate folosi masaca extinsă de reţea astfel în loc de
 192.168.33.0/24  folosim 192.168.33.0/255.255.255.0.

6. Permiterea conexiunilor HTTP şi HTTPS
Regulile următoare permit traffic web nesecurizat (Protocolul http port 80)
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Regulile următoare permit traffic web securizat (Protocolul https port 443)
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

7. Crearea de reguli de acces multiple.
Dacă se doreşte permiterea de conexiuni de intrare de tipuri diferite este suficient să se insereze lista porturilor pe care se efectuează accesul fără a se creea reguli individuale pe fiecare port în parte..
De exemplu pentru a permite conexiuni de intrare SSH, HTTP și HTTPS.
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
Apare tagul –m multiport care precizează o listă de porturi.

8. Permiterea conexiunilor  SSH în rețele externe
Dacă dorim să ne conectăm la un server extern prin  SSH trebuiesc create regulie următoare
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Se observă diferența față de conexiunile de intrare tag-urile NEW și ESTABLISHED se aplică pe OUTPUT iar pe INPUT numai ESTABLISHED, invers față de conexiunile de intrare

9. Permiterea conexiunilor  SSH într-o anumită rețea externă.
Regula următoare permite efectuarea conexiunilor SSH numai pentru o rețea specifică (de exemplu 192.168.33.0 ).
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.33.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10. Permiterea conexiunilor  HTTP și HTTPS externe
Pentru a permite traficul HTTPS se folosesc următoarele reguli.
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
Această regulă permite și conexiuni wget.
Pentru a permite conexiuni HTTP se inserează următoarele reguli
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

11. Efectuare Load Balancing pentru traffic web de intrare
Se poate efectua loadbalance cu iptables. Se folosește taguș nth. In exemplu următor efectuăm load balance pe 2 adrese IP pentru HTTPS. Un pachet va fi transmis la o adresă IP iar următorul pachet la altă adresă IP.
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 2 --packet 0 -j DNAT --to-destination 192.168.1.33:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 2 --packet 1 -j DNAT --to-destination 192.168.1.34:443

12. Permitere ping din exterior în interior
Regulile următoare permit efectuarea de ping-uri către serverele din rețeaua locală.
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

13. Permitere ping din interior în exterior
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

14. Permitere Loopback Access
Majoritatea serverelor necesită acces Loopback (localhost -127.0.0.1). Se folosește tagul lo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

15. Permitere trafic din rețeaua internă în rețeaua externă
În mod normal un server firewall are o placă de rețea conectată la rețeaua internă și o pălacă de rețea conectată la internet (rețeaua externă).Pentru a permite traficul din rețeaua externă în rețeaua internă se folosesc următoarele reguli (rețeaua internă este 192.168.1.x și este conectată la server prin interfața eth1.
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Tagul –o reprezintă output destination și tagul –i input destination.
Pentru a efectua corect MASQUERADE regulile sunt :
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j REJECT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

16. Permiterea cererilor către DNS externe
The following rules allow outgoing DNS connections.
iptables -A OUTPUT -p udp -o eth1 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth1 --sport 53 -j ACCEPT



17. Permiterea conexiunilor NIS
Dacă se folosește NIS pentru management conturi utilizator trebuiesc premise conexiuni NIS. Chiar dacă sunt permise conexiunile SSH dacă nu sunt premise conexiunile NIS utilizatorii nu se pot loga.
Porturile NIS sunt alocate dynamic de ypbind la lansarea în execuție.
Folosind comanda rpcinfo –p vedem că sunt folosie porturile 851 și 852 de exemplu. Pentru a identifica port ypbind folosim comanda rpcinfo -p | grep ypbind. Observăm că ypbind utilizează portul 114 e.g.
Permitem conexiuni de intrare tcp and udp pe porturile menționate.
iptables -A INPUT -p tcp --dport 114 -j ACCEPT
iptables -A INPUT -p udp --dport 114 -j ACCEPT
iptables -A INPUT -p tcp --dport 851 -j ACCEPT
iptables -A INPUT -p udp --dport 851 -j ACCEPT
iptables -A INPUT -p tcp --dport 852 -j ACCEPT
iptables -A INPUT -p udp --dport 852 -j ACCEPT
NB.  Dacă se restartează ypbind porturile vor fi altele.
Sunt două soluții:
1) Folosire adresă static pentru serverul NIS
2)Folosirea de scripturi automate care prelucreaza output-ul lui rpcinfo -p .

18. Permiterea cererilor DHCP
Pentru a permite cereri DHCP
iptables -A OUTPUT -o eth0  -p udp --dport 68 -j ACCEPT
iptables -A INPUT -i eth1 -p udp --dport 67 -j ACCEPT

19.Permiterea traficului SAMBA 3 numai în rețeaua curentă
Asumăm că rețeaua locala este 192.168.1.0/24
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 138 -j ACCEPT
iptables -A INPUT  -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 139 -j ACCEPT
iptables -A INPUT  -m state --state NEW -m tcp -p tcp -s 192.168.1.0/24 --dport 445 -j ACCEPT

20. Permiterea Rsync dintr-o rețea specificată
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT



21. Permiterea MySQL din rețeaua internă
În mod normal nu se permit conexiuni SQL directe dar este util ca rețeaua locală să se poată conecta la serverul SQL.
iptables -A INPUT -i eth0 -p tcp -s 192.168.33.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

22. Permiterea traffic Mail
The following rules allow mail traffic. It may be sendmail or postfix.
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

23. Permiterea IMAP și IMAPS
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
Și pentru IMAPS.
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

24. Permiterea POP3 și POP3S
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
Și pentru POP3S.
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
25. Prevenirea DoS Attack
Următoarea regulă ajută la reducerea efectelor atacurilor Denial of Service (DoS) attack pe webserverul dumneavoastră.
iptables -A INPUT -p tcp --dport 80 -m limit --limit 60/minute --limit-burst 10 -j ACCEPT
În acest exemplu
·       -m limit: Tagul – limit definește limită de conexiuni
·       –limit 60/minute: Există o limitare de maximum 60 conexiuni pe minut. Această valoare poate fi modificată
·       –limit-burst 5: Această valoare indică că limitarea conexiunilor va fi aplicată numai după  lce numărul conexiunilor va depăși 60 conexiuni în ultimile 5 minute.
·        
26. Port Forwarding
Următorul exemplu arată modul în care traficul extern pe portul 6022 va fi transferat pe portul 22.

iptables -t nat -A PREROUTING -p tcp -d 192.168.101.37 --dport 6022 -j DNAT --to 192.168.101.37:22

De asemena trebuiesc premise conexiunile pe portul 6022
iptables -A INPUT -i eth0 -p tcp --dport 6022 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 6022 -m state --state ESTABLISHED -j ACCEPT
27. Blocarea traficului de la adresă fizică MAC
iptables -A INPUT -m mac --mac-source x:x:x:x:x:x -j DROP
iptables -A FORWARD -m mac --mac-source x:x:x:x:x:x -j DROP
Dacă dorim permiterea traficului doar de la o adresă MAC regulile sunt
iptables -A INPUT -m mac! --mac-source x:x:x:x:x:x -j DROP
iptables -A FORWARD -m mac! --mac-source x:x:x:x:x:x -j DROP
Se observă apariția tag-ului ! care reprezintă cunoscutul not (sensul mac! este nu această adresă)
28. Log pachete drop
Este foarte util să se efectueze log cu toate pachetele drop. Aceasta este întotdeauna ultima regulă în iptables.
Prima data se creează un nou chain numit LOGGING.
iptables -N LOGGING
După aceea toate conexiunile de intrare sunt rulate prin LOGGING cu comanda
iptables -A INPUT -j LOGGING
Vom loga pachetele sub o denumire particularizată.
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "Packet Drops: " --log-level 7
În final se dă DROP la aceste pachete.
iptables -A LOGGING -j DROP



Descărcați acest tutorial în format PDF

Niciun comentariu:

Trimiteți un comentariu

Comentează această postare.