Il filtraggio sotto Linux 2.4 si basa come nelle versioni precedenti sui concetti di catene (chain), obiettivi (target), tattiche (policy).
Inizialmente sono disponibili tre catene predefinite: INPUT, FORWARD, OUTPUT (tabella filter).
Tutti i pacchetti destinati esclusivamente alla macchina firewall saranno sottoposti alle regole contenute nella catena INPUT.
+--+ |PC|--+ ==> +---+ <===== +--+ |_____| |_______ INTERNET +--+ | +---+ |PC|--+ +--+ LAN FIREWALL
Tutti i pacchetti destinati non alla macchina firewall ma ad una delle macchine della rete locale o provenienti dalla rete locale e diretti verso l'esterno (non al firewall) saranno sottoposti alle regole della catena FORWARD.
+--+ |PC|--+ <== +---+ <===== +--+ |_____| |_______ INTERNET +--+ | +---+ |PC|--+ ==> =====> +--+ LAN FIREWALL
Tutti i pacchetti generati dalla macchina firewall e in uscita saranno sottoposti alle regole della catena OUTPUT.
+--+ |PC|--+ <== +---+ ===> +--+ |_____| |_______ INTERNET +--+ | +---+ |PC|--+ +--+ LAN FIREWALL
Ciascuna catena consiste di una tattica (policy), e di una o più regole che stabiliscono quali pacchetti sono accettati e quali no.
Una regola si compone in genere di una serie di caratteristiche che servono ad individuare un pacchetto e da un obiettivo (target) che indica cosa fare del pacchetto se la regola è soddisfatta. L'obiettivo può corrispondere ad ACCEPT (pacchetto accettato), DROP (pacchetto scartato), REJECT (pacchetto rifiutato).
Una catena si può rappresentare in questo modo (qui prendiamo ad esempio la catena INPUT):
INPUT +--------------+ | | Regola 1 | | ---------------- | | Regola 2 | | ---------------- V | Regola 3 | ---------------- Tattica
Tutti i pacchetti che arrivano dalla rete e destinati al firewall saranno sottoposti, in questo caso, a ciascuna regola contenuta nella catena INPUT in ordine. Se la Regola 1 non è soddisfatta si prosegue con la successiva, se una regola (es. Regola 2) è soddisfatta allora il pacchetto è accettato, scartato o rifiutato (questa informazione è contenuta nella regola). Se nessuna regola è soddisfatta allora si applica la tattica (policy), che non dice altro a sua volta se accettare, scartare o rifiutare.
I pacchetti che viaggiano nella rete contengono un insieme di informazione molto utili come ad esempio indirizzo sorgente (indirizzo di chi ha inviato il pacchetto), indirizzo destinazione (indirizzo a cui il pacchetto è destinato), tipo di pacchetto (TCP, UDP, ICMP), porta sorgente e porta destinazione (FTP, TELNET, WWW, ...), ...
Queste informazioni sono usate nelle regole per stabilire quali pacchetti sono da accettare e quali da scartare. Ad esempio se non si desidera che qualcuno dall'esterno possa effettuare un telnet su una macchina della LAN è necessario creare una regola nella tabella filter, catena FORWARD, che filtri, rifiuti i pacchetti destinati alla rete locale, aventi come porta destinazione la porta telnet.
iptables -A FORWARD -p tcp -i eth0 -o eth1 --dport telnet -j DROP ^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^ | | | | | | | | | +- se la regola è soddisfatta | | | | scarta (DROP) il pacchetto | | | +- porta dest. del pacchetto (telnet) | | +---- interfacce ingresso e uscita del pacchetto | + protocollo tcp + aggiungi regola alla catena FORWARD
Con questa nuova versione come abbiamo visto il tool incaricato di impostare le regole di filtraggio nel kernel è iptables, anche se è ancora possibile usare ipfwadm e ipchains.
Questo modulo si occupa di fornire le operazioni di base per la creazione, gestione delle catene e delle regole.
Segue un elenco delle operazioni che permettono di creare, modificare, cancellare le catene:
ipchains: ipchains -N nuova (max. 8 caratteri) iptables: iptables -N nuova (max. 30 caratteri)
ipchains: ipchains -X nuova iptables: iptables -X nuova
ipchains: ipchains -P input DENY iptables: iptables -P INPUT DROP
ipchains: ipchains -L iptables: iptables -L
ipchains: ipchains -F output iptables: iptables -F OUTPUT
ipchains: ipchains -Z input iptables: iptables -Z INPUT
NOTA 1: se non si specifica una catena con le opzioni '-L','-X','-F','-Z' si intenderanno tutte le catene. Esempio:
# Rimuovi tutte le regole della catena INPUT iptables -F INPUT # Rimuovi tutte le regole presenti in TUTTE le catene iptables -F
NOTA 2: l'opzione -L può essere utilizzata inoltre per visualizzare tutte le catene o una sola (se si desiderano anche i numeri di linea utilizzare l'opzione '--line-numbers'):
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:telnet Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:telnet # iptables --line-numbers -L INPUT Chain INPUT (policy DROP) num target prot opt source destination 1 DROP tcp -- anywhere anywhere tcp dpt:telnet
E' inoltre possibile visualizzare informazioni sul numero dei pacchetti sottoposti alle regole con l'opzione '-v' (o '--verbose') oppure ottenere contemporaneamente un elenco delle regole e l'azzeramento dei contatori:
# iptables -v -L Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 2 120 DROP tcp -- any any anywhere anywhere tcp dpt:telnet Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination # iptables -v -L -Z Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 2 120 DROP tcp -- any any anywhere anywhere tcp dpt:telnet Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 2 packets, 120 bytes) pkts bytes target prot opt in out source destination Zeroing chain `INPUT' Zeroing chain `FORWARD' Zeroing chain `OUTPUT'
Segue un elenco delle operazioni che permettono di inserire, cancellare, modificare le regole delle catene:
ipchains: ipchains -A input -p tcp --dport telnet -j REJECT iptables: iptables -A INPUT -p tcp --dport telnet -j REJECT
# Inserisci una regola all'inizio della catena ipchains: ipchains -I input -p tcp --dport telnet -j REJECT iptables: iptables -I INPUT -p tcp --dport telnet -j REJECT
# Sostituisci la seconda regola con la nuova ipchains: ipchains -R input 2 -p icmp --icmp-type ping -j DENY iptables: iptables -R INPUT 2 -p icmp --icmp-type ping -j DROP
# Cancella la precedente regola (vedi -R) ipchains: ipchains -D input -p icmp --icmp-type ping -j DENY iptables: iptables -D INPUT -p icmp --icmp-type ping -j DROP # Cancella la terza regola della catena input ipchains: ipchains -D input 3 iptables: iptables -D INPUT 3
Segue una lista delle opzioni che consentono di realizzare delle regole per filtrare i pacchetti:
ipchains: ipchains -A forward -i eth0 -d $RETE_LOCALE -p icmp -j REJECT iptables: iptables -A FORWARD -i eth0 -o eth1 -p icmp -j REJECT NOTA: con ipchains si utilizzava l'opzione -i che in base all'obiettivo (input, output) indicava rispettivamente interfaccia di ingresso e interfaccia di uscita, per la catena forward indicava sempre e solo l'interfaccia di uscita. Si possono inoltre indicare tutte le interfacce di un certo tipo aggiungendo un '+' (es. ppp+). Per indicare tutte le interfacce NON uguali ad una certa interfaccia, ad esempio a ppp0, si può aggiungere un '!' prima del nome dell'interfaccia. '!' si legge "non uguale a " es.: iptables -A FORWARD -i ! ppp0 -j ACCEPT USO: -i, --in-interface [!] [name][+] -o, --out-interface [!] [name][+]
ipchains: ipchains -A input -s $RETE_LOCALE -d $RETE_ESTERNA -p icmp -j ACCEPT iptables: iptables -A INPUT -s $RETE_LOCALE -d $RETE_ESTERNA -p icmp -j ACCEPT USO: -s, --source [!] address[/mask] -d, --destination [!] address[/mask]
ipchains: ipchains -A input -p tcp -j ACCEPT iptables: iptables -A INPUT -p tcp -j ACCEPT NOTA: è possibile specificare inoltre le opzioni '--tcp-flags', '--tcp-option', e '--syn' oltre a '--sport' e '--dport'. USO: -p, --protocol [!] protocol
ipchains: ipchains -A forward -p tcp -d 192.168.x.x telnet -j ACCEPT iptables: iptables -A FORWARD -p tcp -d 192.168.x.x --dport telnet -j ACCEPT NOTA: è possibile specificare anche un intervallo di porte (es. 21(ftp),22(ssh),23(telnet)). es. iptables -A INPUT -p tcp --dport ftp:telnet -j ACCEPT USO: --source-port [!] [port[:port]] --destination-port [!] [port[:port]]
ipchains: non possibile iptables: iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK -j DROP NOTA: i flag sono SYN,ACK,FIN,RST,URG,PSH. La prima stringa è la maschera (flag che vuoi esaminare), la seconda indica quali dovrebbero risultare impostati. USO: --tcp-flags [!] mask comp
ipchains: non possibile iptables: iptables -A INPUT -p tcp --tcp-option 1 -j DROP USO: --tcp-option [!] number
ipchains: ipchains -A input -p tcp -y -j DENY iptables: iptables -A INPUT -p tcp --syn -j DROP NOTA: '--syn' si può utilizzare solo con il protocollo tcp, ed è molto utile per impedire i tentativi di connessione verso il firewall o la propria rete locale. USO: [!] --syn
ipchains: ipchains -A input -p udp -j ACCEPT iptables: iptables -A INPUT -p udp -j ACCEPT NOTA: è possibile specificare inoltre le opzioni '--sport', '--dport'. USO: -p, --protocol [!] protocol --source-port [!] [port[:port]] --destination-port [!] [port[:port]]
ipchains: ipchains -A input -p icmp -j ACCEPT iptables: iptables -A INPUT -p icmp -j ACCEPT NOTA: è possibile specificare inoltre l'opzione '--icmp-type' per indicare il tipo ICMP (es. '--icmp-type destination-unreachable', '--icmp-type 3', '--icmp-type 3/3'). Per una lista completa utilizzare 'iptables -p icmp -h'. USO: -p, --protocol [!] protocol --icmp-type [!] typename
Oltre alle opzioni appena viste ci sono altre opzioni molto utili, disponibili come estensioni:
Vedere i capitoli corrispondenti per una completa descrizione.