Netfilter
NetFilter e il firewalling su Linux
Il codice di firewalling nel kernel Linux ha una sua storia: Nel kernel 2.0 ( 1996 ) si usava ipfwadm Nel kernel 2.2 ( 1999 ) si sono usate le ipchains Dal kernel 2.4 ( 2001 ) sono state introdotte le iptables Tutt'ora utilizzate nel ramo 2.6 ( 2002 )
Il framework netfilter/iptables gestisce tutte le attività di firewalling su Linux: - Netfilter comprende i moduli del kernel - iptables è il comando con cui si gestisce netfilter
Feature principali: - Packet filtering stateless e stateful - Supporto IPv4 e IPv6 - Ogni tipo di natting (NAT/NAPT) - Infrastruttura flessibile ed estendibile - Numerosi plug-in e moduli aggiuntivi per funzionalità aggiuntive
Logica di Iptables: tabelle, catene, regole, target
Iptables lavora su 3 tabelle (tables) di default: filter - Regola il firewalling: quali pacchetti accettare, quali bloccare nat - Regola le attività di natting mangle - Interviene sulla alterazione dei pacchetti.
Ogni tabella ha delle catene (chains) predefinite (INPUT, OUTPUT, FORWARD ... ) a cui possono essere aggiunte catene custom.
Ogni catena è composta da un elenco di regole (rules) che identificano pacchetti di rete secono criteri diversi (es: -p tcp --dport 80 -d 10.0.0.45)
Ogni regola termina con una indicazione (target) su cosa fare dei pacchetti identificati dalla regola stessa (es: -j ACCEPT, -j DROP ...)
Firewall con la tabella filter
E' la tabella implicita e predefinita (-t filter)
Riguarda le attività di filtraggio del traffico.
Ha 3 catene di default:
- INPUT - Riguarda tutti i pacchetti destinati al sistema. In entrata da ogni interfaccia.
- OUTPUT - Riguarda i pacchetti che sono originati dal sistema e destinati ad uscire.
- FORWARD - Riguarda i pacchetti che attraversano il sistema, con IP sorgente e destinazione esterni.
Esempio per permettere accesso alla porta 80 locale:
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
Analoga a:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
Esempio per permettere ad un pacchetto con IP sorgente 10.0.0.4 di raggiungere il server 192.168.0.1 attraversando il firewall:
iptables -I FORWARD -s 10.0.0.4 -d 192.168.0.1 -j ACCEPT
iptables - One command to rule them all
Il comando iptables viene usato per ogni attività di gestione e configurazione.
Inserimento regole:
iptables -A CATENA ... - Aggiunge una regola alla fine della catena indicata iptables -I CATENA [#] ... - Inserisce alla riga # (default 1) una regola nella catena indicata iptables -N CATENA - Crea una nuova catena custom iptables -P CATENA TARGET - Imposta il target di default per la catena indicata
Rimozione regole e azzeramenti:
iptables -F [catena] - Ripulisce tutte le catene (o quella indicata) iptables -X [catena] - Ripulisce tutte le catene custom (o quella indicata) iptables -Z [catena] - Azzera i contatori sulle catene iptables -D catena # - Cancella la regola numero # dalla catena indicata
Interrogazione:
iptables -L - Elenca le regole esistenti iptables -L -n -v - Elenca, senza risolvere gli host, in modo verboso le regole esistenti
Gestione e salvataggio regole
Le regole di iptables vengono immediatamente attivate nel momento in cui si inserisce il comando.
Lo stato del firewall rimane fino a quando non si esegue un riavvio.
Il comando iptables-save stampa su stdout la configurazione corrente del firewall
Con iptables-restore si può ripristinare una configurazione salvata con iptables-save
Durante l'avvio le impostazioni di iptables possono essere ripristinate con:
- Uno script shell che esegue in successione tutti i comandi iptables necessari.
Ha il vantaggio di permettere commenti fra le regole e poter usare variabili, cicli e impostare regole sulla base di parametri variabili.
Spesso lo si richiama da /etc/rc.d/rc.local ma sarebbe meglio applicarlo appena attivate le interfacce di rete
- Uno script di init.d che tramite iptables-restore ripristina una configurazione precedentemente salvata. E' la soluzione usata da molte distribuzioni, dove il file di configurazione del firewall non è altro che l'output di un comando come: iptables-save > /etc/sysconfig/iptables. Ha il vantaggio di applicare lunghi elenchi di regole in modo molto più rapido.
Criteri standard di match
Le possibilità di matching di pacchetti secondo diversi criteri sono molte e possono essere abbinate nella stessa regola.
Il carattere ! si usa come negazione (NOT logico):
Criteri di match standard:
-p [!] proto - Protocollo IP. Secondo IP number o nome (es: tcp, udp, gre, ah...)
-s [!] address[/mask] - Indirizzo IP sorgente (o network con maschera di sottorete)
-d [!] address[/mask] - Indirizzo IP destinazione (o network)
-i [!] interface[+] - Interfaccia di rete di entrata ([+] wildcard)
-o [!] interface[+] - Interfaccia di rete di uscita ([+] wildcard)
-f - Frammento di pacchetto
Estensioni per principali protocolli
TCP (-p tcp)
--sport port[:port] - La porta o il range di porte TCP sorgenti (Per un range da 1 a 1024: 1:1024
--dport port[:port] - La porta o il range di porte TCP di destinazione
--tcp-flags flag - I flag TCP del pacchetto attivi (SYN, ACK, FIN, RST, URG, PSH)
--syn - Pacchetti con solo SYN attivo (nuove connessioni)
--tcp-option option - Match per specifiche opzioni della intestazione TCP
Esempio per droppare tutti i pacchetti TCP in entrata su porte privilegiate:
iptables -I INPUT -p tcp --syn --dport 0:1024 -j DROP
UDP (-p udp)
--sport port[:port] - La porta o il range di porte UDP sorgenti (Per un range da 1 a 1024: 1:1024
--dport port[:port] - La porta o il range di porte UDP di destinazione
Esempio per permettere pacchetti UDP per traceroute:
iptables -I INPUT -p udp --sport 32769:65535 --dport 33434:33523 -j ACCEPT
ICMP (-p icmp)
--icmp-type type - Match sul tipo di pacchetto ICMP in formato numerico o completo (iptables -p icmp --help per un elenco dei tipi ICMP)
Esempio per permettere pacchetti UDP per traceroute:
iptables -I INPUT -p udp --sport 32769:65535 --dport 33434:33523 -j ACCEPT
Target e jump
Ogni regola termina con la definizione di un TARGET che indica cosa viene fatto del pacchetto.
Molti dei target principali (ACCEPT, DROP, REJECT...) determinano l'interruzione della catena: il pacchetto matchato segue le indicazioni del Target e non vengono considerate le catene successive.
Come target si può anche impostare una catena custom nella quale "saltare" (jump -j) per procedere nell'attraversamento delle regole.
Target principali
- -j ACCEPT - Il pachetto matchato viene accettato e procede verso la sua destinazione. Si usa per definire il traffico permesso.
- -j DROP - Il pacchetto viene rifiutato e scartato, senza alcuna notifica al mittente. Si usa, in alternativa a REJECT, per bloccare traffico.
- -j REJECT - Il pacchetto viene rifiutato. Al mittente viene mandato un pacchetto (configurabile) di notifica tipo ICMP port-unreachable (--reject-with icmp-port-unreachable)
- -t LOG - Il pacchetto viene loggato via syslog e procede l'attraversamento della catena. Opzioni: (--log-level, --log-prefix, --log-tcp-sequence, --log-tcp-options, --log-ip-options)
- -j DNAT - Viene modificato l'IP di destinazione del pacchetto. Target disponibile solo in nat / PREROUTING e nat / OUTPUT. L'opzione --to-destination IP:porta definisce il nuovo IP di destinazione. Si usa tipicamente su network firewall che nattano server di una DMZ
- -j SNAT - Viene modificato l'IP sorgente. Solo in nat / POSTROUTING. Prevede l'opzione --to-source IP:porta. Si usa per permettere l'accesso a Internet da una rete locale con IP privati.
- -j MASQUERADE - Simile a SNAT, si applica quando i pacchetti escono da interfacce con IP dinamico (dialup, adsl, dhcp...). Si usa solo in nat / POSTROUTING e prevede l'opzione --to-ports porte.
- -j REDIRECT - Redirige il pacchetto ad una porta locale. Usabile solo in nat / PREROUTING e nat / OUTPUT è previsto per fare un transparent proxy (con proxy server in esecuzione sulla macchina con iptables)
- -j RETURN - Interrompe l'attraversamento della catena. Se questa è una secondaria, il pacchetto torna ad attraversare la catena madre da punto in cui aveva fatto il salto nella secondaria. Se il RETURN è in una delle catene di default, il pacchetto interrompe l'attraversamento e segue la policy di default.
- -j TOS - Usabile solo nella tabella mangle, permette di cambiare il TOS (Type Of Service) di un pacchetto con l'opzione --set-tos. Per un elenco dei parametri disponibili: iptables -j TOS -h
- -j MIRROR - Curioso e sperimentale, questo target invia un pacchetto speculare al mittente. In pratica è come se facesse da specchio per tutti i pacchetti ricevuti. Da usare con cautela, per evitare attacchi DOS indiretti.
Connection tracking con Iptables
Una delle più potenti e benvenute feature di iptables è la gestione del traffico con la consapevolezza dei flussi e delle connessioni dei protocolli usati.
Il modulo ip_conntrack di Netfilter si preoccupa di gestire le connessioni e fornire gli strumenti per poterle controllare.
In /proc/net/ip_conntrack il kernel mantiene e aggiorna in tempo reale lo stato delle connessioni gestite (il numero massimo è configurabile modificando /proc/sys/net/ipv4/ip_conntrack_max.
La gestione del traffico sulla base delle connessioni è fatta richiamando il modulo di match state che permette di dividere il traffico secondo diversi stati:
- NEW - Il primo pacchetto relativo ad una nuova connessione (syn TCP o nuovo pacchetto UPD)
- ESTABLISHED - Pacchetti relativi a connessioni già stabilite, in cui si è avuto almeno un pacchetto da entrambi i peer
- RELATED - Pacchetti in qualche modo correlati a connessioni esistenti ed established. Ticipi esempi il traffico di dati FTP o il trasferimetno DCC in IRC.
- INVALID - Pacchetti che non rientrano in alcuno dei suddetti stati, di solito vengono droppati.
Il match state risulta particolarmente comodo per gestire il "traffico di ritorno" per connessioni accettate.
Ad esempio, per permettere su un host, tutto il traffico in uscita e, in entrata, solo il traffico correlato a quanto uscito bastano regole tipo:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT itables -I OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Per gestire lo stato di connessione di alcuni protocolli particolari, esistono dei moduli speciali adibili sia alla gestione del connection tracking, sia al natting:
ip_conntrack_ftp - ip_nat_ftp : Conntrack e nat per FTP ip_conntrack_h323 - ip_nat_h323 : Conntrack e nat per H323 ip_conntrack_irc - ip_nat_irc : Conntrack e nat per IRC ip_conntrack_rtsp - ip_nat_rtsp : Conntrack e nat per IRC ip_conntrack_tftp - ip_nat_tftp : Conntrack e nat per TFTP ip_conntrack_rpc_tcp - ip_conntrack_rpc_udp : Conntrack per RPC
Tuning dei parametri del kernel
Tramite l'interfaccia system control è possibile settare, in tempo reale, numerosi parametri che influenzano il tuning del networking
Esistono diversi modi per intervenire su sysctl:
- Usare normali comandi come cat e echo per visualizzare e modificare parametri all'interno di /proc/sys. Es:
echo "1" > /proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward
- Usare il comando sysctl per visualizzare o settare (con opzione -w) i parametri:
sysctl -w net.ipv4.ip_forward="1" sysctl net.ipv4.ip_forward
- Usare il file di configurazione /etc/sysctl.conf che all'avvio viene caricato automaticamente e contiene righe come:
net.ipv4.ip_forward = 1