[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