Netfilter

Da WikiSitech.
Vai alla navigazioneVai alla ricerca

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

Sito ufficiale

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:

  1. 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

  1. 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

  1. Usare il file di configurazione /etc/sysctl.conf che all'avvio viene caricato automaticamente e contiene righe come:

net.ipv4.ip_forward = 1