[Hack] iptables

MM msa76@libero.it
Dom 17 Nov 2002 15:57:40 CET


Posto in lista la traduzione che ho fatto sul comando iptables e alcune 
opzioni utili per amministrare i canali di ingresso, uscita e transito, utili 
per la creazione di un firewall di base. 

http://www.linuxnewbie.org/nhf/Security/IPtables_Basics.html

MM.

---------------------------------------------------------------------------------------------------------------

Iptables

Il comando iptables serve per creare un firewall di base

In che modo funziona un firewall? Per capirlo, occorre prima sapere come 
vengono scambiati i pacchetti di dati da una macchina all'altra. 
I pacchetti possono uscire, entrare o transitare attraverso la nostra 
macchina. Per cui, esistono almeno tre tipologie di canali,  una dedicata ai 
pacchetti in uscita, una a quelli in entrata e una a quelli in transito. 

Ogni pacchetto in ingresso passa dal canale di INPUT
Ogni pacchetto in uscita passa dal canale OUTPUT
Ogni pacchetto in transito passa dal canale FORWARD

Il comando iptalbes consente di settare certe tipologie di regole in ognuno di 
questi tre canali, che, sostanzialmente, riguardano le modalità attraverso 
cui gestire tutti i pacchetti in transito. Ad esempio, se il computer X vuole 
inviare pacchetti di dati all'indirizzo www.golem.linux.it per richiedere la 
home page, i pacchetti passeranno attraverso il canale di OUTPUT. A questo 
punto, il kernel guarderà  le regole settate per effettuare questa operazione 
e si comporterà  di conseguenza.

Quando "golem.linux.it" risponde, i pacchetti di risposta arriveranno alla 
nostra macchina attraverso il canale di INPUT.

Per settare un firewall di base, occorre decidere le regole da far seguire al 
kernel durante la gestione delle varie tipologie di pacchetti.
Poniamo di voler impedire ad un certo indirizzo ip di entrare nella macchina. 
Poniamo che l'indirizzo sia 192.168.1.1

iptables -s 192.168.1.1

Con questo comando ci si riferisce al traffico in entrata proveniente da 
quell'indirizzo e con l'opzione -s si specifica un indirizzo ip od un server 
DNS.
Ancora non abbiamo detto cosa fare al kernel di quei pacchetti. Per farlo si 
usa l'opzione -j, che può  essere declinata nelle seguenti modalità: 

ACCEPT 
DENY  
DROP. 

Poniamo che noi non si voglia accettare la roba che viene da 192.168.1.1. 
Potremmo usare il comando DENY, che invia un messaggio di ritorno alla 
macchina 192.168.1, con il quale le si dice che non si è  accettato la 
connessione.
Con DROP invece si impedisce al pacchetto di entrare. Quindi, siccome siamo 
sospettosi, scriviamo:

iptables -s 192.168.1.1 -j DROP

C'è ancora un'altra cosa da fare. Si deve applicare la regola a tutte i 
pacchetti di un particolare canale. In questo caso al canale di INPUT. Si 
avrà:

iptables -A INPUT -s 192.168.1.1 -j DROP

Con questo singolo comando, il computer ignorerà  tutto quello che viene da 
192.168.1.1. (non tutti i pacchetti, perchè ci sono delle eccezioni). La 
disposizione dei comandi non è influente: -j DROP può  andare davanti a -s 
192.168.1.1.
Siamo quindi capaci di ignorare un computer che ci manda dei pacchetti di 
dati. 
Se volessimo, invece, impedire alla nostra macchina di parlare con lui, 
sostituisco a INPUT, OUTPUT e -s con -d.

Complichiamo un po' le cose
Cosa dobbiamo fare se vogliamo ignorare richieste telnet da questo computer?. 
Si dovrebbe sapere che la porta 23 è quella usata da telnet. Possono essere 
usati tre protocolli di comunicazione: TCP, UDP, ICMP. Telnet viaggia sul 
TCP, e l'opzione -p serve a specificare il protocollo di comunicazione.
Dopo aver specificato il protocollo, si usa --destination-port, per indicare 
la porta che cerchiamo di contattare. Occorre non mischiare le porte di input 
e output: il client può  utilizzare qualsiasi porta, mentre il server usa la 
porta 23. Tutte le volte che si vuole bloccare un certo indirizzo, si usa 
--destination-port. Per l'operazione inversa, cioè per aprire la porta ad un 
certo indirizzo, si usa --source-port.

iptables -A INPUT -s 192.168.1.1 -p tcp --destination-port telnet -j DROP

se si volesse specificare ogni indirizzo IP in un certo range, per esempio 
1-10, si scrive 192.168.1.1/10. Se invece voglio prendere ogni indirizzo IP 
da 1 a 255 di 192.168.1.1, scrivo 192.168.1.*
Nel caso si abbia una LAN, con una connessione ad Internet, si possono 
condividere i pacchetti e usare l'unica connessione per navigare on line.
Se la LAN si basa su connessioni ethernet, e la connessione internet è sul 
protocollo ppp0, e vogliamo far navigare in internet tutti i computer, si 
deve usare l'opzione -i per l'interfaccia input e -o per l'output. Bloccando 
subito sull'INPUT, il demone telnet non vedrà  mai la richiesta. Useremo -i, 

iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP

in questo modo si chiude tutto dall'esterno, ma si apre per i componenti della 
LAN.

E' chiaro che esistono altri modi di manipolare le regole, ad esempio, 
l'opzione -A "appende" una regola alla fine della lista: ogni regola che la 
precede deve essere detta prima che la nostra regola sia eseguita. Se 
vogliano mettere una regola prima della fine della lista, si usa l'opzione 
-I. Con questa, possiamo inserire la regola in una precisa posizione 
all'interno della catena di regole. Se vogliamo ad esempio inserirla al top 
della catena del canale di INPUT, dobbiamo usare "-I INPUT 1". Possiamo 
cambiare il numero per inserire in qualsiasi posto la regola.
Se invece vogliamo saltare una data regola, si usa il comando -R che ha la 
stessa sintassi di -I,  e che elimina una data regola in quella data 
posizione. Se voglio eleminare una regola, uso il comando -D.
Il comando -L elenca le regole, ed è prezioso se si dimentica la posizione di 
esse. -F rimuove le regole di una certa catena. Se non si dice quale, egli 
rimuoverà tutte le regole.
Sappiamo che i pacchetti si muovono in base ad un certo protocollo che può 
essere il TCP, e che usa una certa porta. Per completare il firewall, si 
potrebbero chiudere tutte le porte in entrata, ma ricordarsi che se il 
computer parla con un altro, l'altro deve poter rispondere. Se si chiudono 
tutte le porte in entrata si rende la connessione inutile. Per molti 
programmi è difficile sapere quale porta useranno per comunicare con il 
nostro computer.

Esiste comunque una possibile soluzione. Se due computer sono connessi con 
protocollo TCP, la connessione deve essere inizializzata. Questo è il lavoro 
svolto da un particolare tipo di pacchetto, chiamato SYN. Un pacchetto SYN 
dice agli altri computer che è pronto a parlare. Adesso, solo il computer che 
richiede il servizio, invia un SYN. Quindi, se voi bloccate solo i pacchetti 
SYN in entrata, questo fermerà gli altri computer nell'accesso ai  servizi 
presenti sul vostro, ma non impedirà ad esso di comunicare con gli altri. 
Praticamente, il computer ignora qualunque soggetto che non parla per primo. 
Così, per creare una regola che blocca tutti i tentativi di accesso ai 
servizi sulla nostra macchina, si scrive:

iptables -A INPUT -i ppp0 -p tcp --syn -j DROP

Se si vuole lasciare aperta una porta, ed esempio la 80 (HTTP), si procede 
utilizzando un punto esclamativo, che significa no. Se voglio bloccare tutto 
eccetto la porta 80, scrivo:

iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP

per impostazioni di default, i canali di INPUT ed OUTPUT sono impostati su 
ACCEPT, quello di FORWARD è settato su DENY. Se si vuole usare la macchina 
come router, si imposterà la FORWARD su ACCEPT, altrimenti non funziona 
nulla. Si procede usando l'opzione -P. Si fa seguire dal nome del canale:

iptables -P FORWARD ACCEPT

Questo è solo un piccolo esempio di come si può usare il comando iptables per 
gestire i rapporti di comunicazione fra varie macchine. Se provate a fare 

man iptables

troverete moltissime informazioni relative alle varie opzioni che possono 
essere utilizzate per la creazione di regole.
----------------------------------------------------------------------------------------------------------------



Maggiori informazioni sulla lista golem-hack