Linux FirewallingObiettivo: |
Linux firewalling: Introduzione a IptablesOverview, gestione, utilizzo di iptables su Linux per packet filtering iptables - Linux natting e packet manglingUtilizzo di iptables per natting, masquerading e mangling di pacchetti. Esempi di configurazione di IptablesEsempi di configurazioni di un firewall Linux con iptables Iptables AvanzatoFunzionalità avanzate di iptables. |
Linux firewalling: Introduzione a Iptables |
Overview, gestione, utilizzo di iptables su Linux per packet filtering |
Tipo Infobox: DESCRIPTION - Skill Level: 2- JUNIOR - Autore: Giorgio 'neo' Colombo - Ultimo Aggiornamento: 2005-05-14 23:11:57
Netfilter è il framework con cui vengono gestite tutte le operazioni di firewalling, natting e manipolazione di pacchetti nel kernel Linux.
Netfilter viene gestito con il comando iptables con cui si determinano e configurano tutte le regole con cui gestire il traffico di rete.
Breve storia dei firewall Linux
Il codice di firewalling di Linux ha subito diverse modifiche nella storia del kernel.
Nella versione 2.0.x viene usato il sistema ipfwadm che viene sostituito nelle versione 2.2.x dalle ipchains che introducono il concetto di catene di regole (access-list) a cui un pacchetto può essere indirizzato.
Dalla versione 2.4 in poi il kernel si basa sull'infrastruttura netfilter/iptables che permette con semplicità estrema di configurare un firewall di fare packet filtering (stateless, statefull), diversi tipi di NAT (Network Address Translation) e packet mangling (modifica di alcuni flag dei pacchetti trattati).
Il progetto NETFILTER/IPTABLES nasce da Paul "Rusty" Russell e dal Core Team (i quali tutt'ora continuano il lavoro di sviluppo), nel lontano 1999.
Componenti
Il framework netfilter/iptables si può identificare in diversi componenti:
1- la parte riguardante il kernel, ovvero tutto il codice che lavora in kernel space e che con diversi moduli introduce funzionalità base e avanzate.
In quasi tutte le distribuzioni netfilter è installato, in alcune specifiche sulla sicurezza possono essere anche installati moduli aggiuntivi sperimentali.
2- L'interfaccia utente, ovvero sostanzialmente il comando iptables
che permette di impostare regole e gestire il firewall.
Solitamente fornita con un pacchetto chiamato... iptables.
LINK: Home Page del progetto Netfiltering/Iptables - http://www.netfilter.org/
HOWTO: Elenco di How-To ufficiali Netfiltering/Iptables - http://www.netfilter.org/documentation/index.html#HOWTO
LINK: Info, link utili da linuxGuruz.org - http://www.linuxguruz.org/iptables/
Tipo Infobox: DESCRIPTION - Skill Level: 2- JUNIOR - Autore: Alessandro 'al' Franceschi - Ultimo Aggiornamento: 2005-05-15 13:32:22
E' essenziale capire e familiarizzare con la logica di iptables prima di cimentarsi nella stesura delle policy di un firewall, altrimenti si rischia di non ottenere i risultati voluti o comprometterne la funzionalità.
Logica di tabelle, catene, regole.
Di default iptables lavora su 3 tabelle (tables) (filter, nat, mangle) che prevedono diverse catene (chains) (INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING...) all'interno delle quali esistono elenchi di regole (rules).
Ogni regola identifica pacchetti di rete secondo diversi criteri sulla base di variegati match (tcp, udp, state, pkttype e molti altri, alcuni sperimentali) con le relative opzioni e termina con un target che determina cosa fare del pacchetto matchato (ACCEPT, DROP, REJECT, SNAT, DNAT, LOG...).
Tabella di filter
Quando si usa il comando iptables questa è la tabella di default, implicita.
Prevede 3 catene di default che di fatto corrispondono alle possibili destinazioni del pacchetto rispetto alla macchina che funziona da firewall:
INPUT
Catena in cui passano tutti i pacchetti in entrata dalle interfacce di rete del sistema. Si usa comunemente per permettere o negare l'accesso da IP remoti a porte locali.
OUTPUT:
Considera tutti i pacchetti che sono originati ed escono dal proprio sistema. Si usa per controllare il traffico in uscita, sia per le risposte a pacchetti permessi in INPUT che per nuove connessioni in uscita.
FORWARD:
Riguarda i pacchetti che devono "attraversare" il firewall, avendo IP sorgente e destinazione diversi da quello della macchina su cui gira iptables.
Si usa tipicamente su router o firewall di rete.
Tabella di nat
Questa tabella riguarda alcune alterazioni che si possono fare su un pacchetto, in particolare la variazione degli IP e delle porte sorgenti o di destinazione . Viene richiamata con l'opzione -t nat
e prevede le seguenti catene di default:
PREROUTING
- Catena in cui vengono processati i pacchetti in ingresso, prima che il sistema prenda le decisioni di routing. Si usa tipicamente per fare destination natting usando il target DNAT
.
POSTROUTING
- Catena in cui passano i pacchetti dopo che sono stati routati sulla interfaccia di destinazione. Si usa per modificare l'IP e/o la porta sorgente di un pacchetto, tipicamente usato su default gateway di una rete con funzioni di Port Address Translation (su Linux definito Masquerading). Prevede i target SNAT
e MASQUERADE
.
OUTPUT
- Catena utilizzata per modificare l'IP sorgente di un pacchetto uscito dal sistema stesso.
Tabella di mangle
Si può utilizzare per modificare vari parametri negli header di un pacchetto. Viene richiamata con -t mangle
e prevede le catene di default PREROTING, INPUT, FORWARD, OUTPOUT, POSTROUTING. L'uso più comune è per alterare il TOS di un pacchetto IP. Non ci si ritroverà ad usarla spesso.
Il comando iptables
Iptables è sia il nome dell'infrastruttura a catene con cui si definiscono le policy di firewalling di un sistema basato su netfilter che il comando, utilizzabile da shell, con cui si configura e gestisce il tutto.
La sua sintassi è piuttosto variegata e prevede opzioni e impostazioni anche sulla base dei moduli aggiuntivi supportati e permette di: azzerare le catene esistenti, aggiungere regole, rimuovere regole, impostare le policy di default, creare nuove catene custom, azzerare i contatori ecc.
Comodi comandi ausiliari sono iptables-save
e iptables-restore
che si usano rispettivamente per salvare e ripristinare le configurazioni del firewall.
Le impostazioni sono immediatamente applicate sul sistema fino al momento in cui non si riavvia, per ripristinarle dopo un reboot, è necessario salvare su un file.
Le distribuzioni Linux possono avere file diversi di configurazione e diversi script di avvio, con cui le iptables sono gestite come un servizio, ma la sintassi del comando iptables resta comunque comune.
Attraversamento delle catene
La sequenza con cui vengono processate le varie catene dal Kernel ha questa logica, nel caso si faccia forwarding:
RETE A - MANGLE PREROUTING - NAT PREROUTING - ROUTING - FILTER FORWARD - ROUTING - RETE B
Oppure, per pacchetti in entrata o in uscita:
RETE A - MANGLE PREROUTING - NAT PREROUTING - ROUTING - FILTER INPUT - LOCAL PROCESS - MANGLE OUTPUT - NAT OUTPUT - FILTER OUTPUT - ROUTING - RETE B
I pacchetti attraversano le catene che sono destinati a percorrere, secondo l'ordine delle regole impostate. Se un pacchetto matcha le condizioni definite in una regola, allora segue le indicazioni specificate nel target (ACCEPT, DROP, DNAT) e , in molti casi, interrompe l'attraversamento. Se non matcha nessuna regola di una catena, segue la policy di default impostata per quella catena.
Per questo motivo è fondamentale l'ordine con cui sono inserite le regole in una catena.
Tipo Infobox: COMMANDS - Skill Level: 3- INTERMEDIATE - Autore: Giorgio 'neo' Colombo - Ultimo Aggiornamento: 2005-05-23 14:29:18
Iptables è il comando utilizzato per settare, modificare e cancellare rule riguardanti il packet filtering del kernel linux.
Di seguito verranno riportati le principali opzioni e le sintassi più utilizzate:
Aggiunge una regola alla fine della catena scelta oppure la modifica o cancella:
iptables -[ADC] chain rule-specification [options]
Sostituisce regola o la inserisce all'inizio della catena
iptables -[RI] chain rulenum rule-specification [options]
Visualizza, svuota o azzera i contatori della catena selezionata:
iptables -[LFZ] [chain] [options]
Crea o aggiunge una nuova catena
iptables -[NX] chain
Setta la policy di default della catena
iptables -P chain target [options]
COMANDI
-A, --append
Aggiunge una regola in fondo alla catena
-D, --delete
Cancella una regola
-R, --replace
Esegue il replace di una regola
-I, --insert
Inserisce la regola all'inizio della catena o alla posizione indicata.
-L, --list
Visulizza l'elenco delle regole inserite
-F, --flush
Svuota le catene predefinite
-Z, --zero
Azzera i contatori di ogni catena
-N, --new-chain
Crea una nuova catena custom
-X, --delete-chain
Cancella una catena (creata dall'utente)
-P, --policy
Setta la policy di default per una catena
PARAMETRI
-p ,--protocol [protocol]
Specifica su quale protocollo deve matchare la regola
-s, --source address[/mask], -src
Specifica l'IP sorgente.
-d, --destination address[/mask], -dst
Specifica l'IP destinazione
-j, --jump
Specifica il target a con cui gestire il pacchetto matchato: può essere una catena custom o un target esistente (drop,accept etc..)
-i, --interface
Specifica da quale interfaccia è in entrata un pacchetto. Opzione valida solo per INPUT, FORWARD e PREROUTING.
-o, --out-interface
Specifica l'interfaccia d'uscita di un pacchetti. Opzione valida per FORWARD, OUTPUT e POSTROUTING.
TARGET
DROP
I pacchetti che "matchano" la regola vengono droppati.
ACCEPT
I paccheti che "matchano" la regola vengono fatti passare.
RETURN
Il pacchetto smette di attraversare la catena e passa a quella successiva o segue il comportamente di default
QUEUE
Se il kernel lo supporta il pacchetto passa a livello user-space dove può essere manipolato da programmi vari.
REJECT
Il pacchetto viene rifiutato con un messaggio di notifica al mittente (es: icmp destination unreachable)
LOG
Il pacchetto viene loggato via syslog.
MARK
Il pacchetto viene marcato per essere gestito da programmi in user space.
MASQUERADE
L'IP del pacchetto viene mascherato.
MIRROR
Viene rimandato al mittente un pacchetto speculare a quello ricevuto
REDIRECT
Il pacchetto viene redirezionato ad una porta locale
ALTRE OPZIONI
-v --verbose
Abilita il verbose mode
-n
Abilita la visualizzazione numerica, senza DNS reverse lookup
--linenumbers
Quando viene eseguito il list delle regole viene aggiunto un numero ad ogni regola che corrisponde la posizione della regola nella sua catena.
!
Inverte il significato dell'opzione che lo segue
Tipo Infobox: PATH - Skill Level: 3- INTERMEDIATE - Autore: Giorgio 'neo' Colombo - Ultimo Aggiornamento: 2004-04-01 12:13:42
File di configurazione contenente le opzioni del kernel modificabili in run-time.
Di seguito verra' riportato un esempio di questo file con alcune opzioni abilitate di default da RedHat.
E' fondamentale abilitare net.ipv4.ip_forward (forwarding dei pacchetti IP) se il proprio Linux deve fare da firewall/router.
Di fatto vengono modificati i parametri contenuti nel /proc filesystem.
Abilitando (1) ,disabilitando (0), o il Tuning di alcuni parametri del kernel:
Precisamente si possono modificare i valori del kernel in run-time per i seguenti campi
- Virtual memory
- File System
- Network
Ecco il cat del file in configurazione RedHat Standard:
[neo@dido neo]$ cat /etc/sysctl.conf
# Disables packet forwarding
net.ipv4.ip_forward = 0
# Enables source route verification
net.ipv4.conf.default.rp_filter = 1
# Disables the magic-sysrq key
kernel.sysrq = 0
A causa di un bug di alcuni router, inoltre, se l'ECN (Explicit Congestation Notification) è abilitato, ciò che sta dietro a tali router NON sarà raggiungibile.
Il tutto si risolve disabilitando l'ECN nel kernel, intervenendo in /etc/sysctl.conf con una riga tipo:
net.ipv4.tcp_ecn= 0
Tipo Infobox: COMMANDS - Skill Level: 4- ADVANCED - Autore: Giorgio 'neo' Colombo - Ultimo Aggiornamento: 2002-10-03 18:07:14
Comando su Linux che permette di configurare in run-time e visualizzare alcuni parametri del kernel.
Particolarmente utile per il tuning del sistema, in particolare:
- Tuning dei Parametri della Network
- Tuning dei Parametri della memoria virtuale
- Tuning dei Parametri del filesystem
Per verificare le opzioni:
sysctl [-n] [-e] variable ...
sysctl [-A]
Per modificare le opzioni:
sysctl [-n] [-e] -w variable=values
Per rileggere il file di condfigurazione:
sysctl [-n] [-e] -p [file di configurazione]
-A
Printa in stdout tutti i valori attualmente disponibili
-n
Disabilita il print in stdout del nome della variabile
-e
Ignora eventuali errori nel nome della variabile
-w
Opzione per modificare il settaggio di sysctl
-p
Carica le opzioni di sysctl da un file. Default /etc/sysctl.conf
iptables - Linux natting e packet mangling |
Utilizzo di iptables per natting, masquerading e mangling di pacchetti. |
Tipo Infobox: DESCRIPTION - Skill Level: 3- INTERMEDIATE - Autore: Giorgio 'neo' Colombo - Ultimo Aggiornamento: 2004-06-04 10:47:19
NAT ovvero Network Address Tranlation permette di manipolare un pacchetto IP modificando l'indirizzo IP sorgente o di destinazione.
Ovviamente il dispositivo che esegue il NAT quando riceve il pacchetto di ritorno esegue l'operazione inversa, sulla base di una tabella di natting che si tiene in memoria.
Il Nat viene utilizzato in varie occasioni, dove si ha la necessità ad esempio di redirezionare il traffico su un unico IP, oppure forwardare il traffico con una certa porta di destinazione ad un'altro host oppure su un'altra porta.
Su Linux si usa definire il natting con due modalità specifiche:
SNAT: Source NAT, cioè l'alterazione dell'IP sorgente del primo pacchetto che apre la connessione. Avviene sempre dopo che il pacchetto ha subito il routing (post-routing).
Un esempio di SNAT è il masquerading, con cui tutti gli IP sorgenti di una rete locale vengono convertiti in un unico IP sorgente (del dispositivo che fa masquerading) con cui i pacchetti vengono mandati in rete.
DNAT: Destination NAT, cioè l'alterazione dell'IP di destinazione del primo pacchetto.
A differenza del SNAT il DNAT avviene sempre prima che il pacchetto subisca il routing (pre-routing).
Una forma di DNAT è il port-forwarding e trasparent proxy.
Per quanto riguarda iptables, le catene (chain) da considerare per i vari tipi di NAT sono:
PREROUTING (DNAT, per i pacchetti in arrivo).
Esiste inoltre un "caso speciale" chiamato redirection. E' un DNAT effettuato esclusivamente sull'interfaccia di ingresso del pacchetto. Ovvero si può eseguire un redirect di tuti i pacchetti provenienti su eth0 con destination port 80 e redirezionarli sempre su eth0 ma sulla porta 12345.
OUTPUT (DNAT, per i pacchetti generati della macchina locale)
POSTROUTING (SNAT, per i pacchetti in uscita)
Esempi di NAT:
Port forwarding
iptables -A PREROUTING -t nat -p tcp -d 10.0.0.150 --dport 8080 -j DNAT --to 172.16.1.128:80
Ovvero tutti i pacchetti che hanno destinazione 10.0.0.150 sulla porta 8080vengono riderizionati al'ip 172.16.1.128 alla porta 80.
Source Natting
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.0.1
Tutti i pacchetti che escono dall'interfaccia eth0, subiscono una variazione dell'ip sorgente in 10.0.0.1
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.0.1-10.0.0.254
Come sopra, con la differenza che l'ip sorgente può essere alterato sia in 10.0.0.1 o 10.0.0.154
Masquerading
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Tutto ciò che passa in uscita dal proprio modem viene mascherato con l'ip pubblico assegnato dal proprio ISP.
Destination Natting
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 10.0.0.1:8080
Tutti i pacchetti TCP, arrivati dall'interfaccia eth1 con destinazione porta 80 vengono "dirottati" all'ip 10.0.0.1 alla porta 8080.
LINK: How-to NAT in italiano - http://www.netfilter.org/documentation/HOWTO/it/NAT-HOWTO.txt
Tipo Infobox: DESCRIPTION - Skill Level: 4- ADVANCED - Autore: Alessandro 'al' Franceschi - Ultimo Aggiornamento: 2005-05-22 20:39:41
Segue un esempio di script che esegue il masquerading di una rete locale e il destination natting di un server PPTP interno a dei limitati IP pubblici.
Può essere modificato e adattato ai propri scopi.
#!/bin/sh
#
# masquerading.sh - Version 20040531 - Coresis
#
#### DEBUGGING ###
set -x
### FLUSHING CHAIN ### Azzera e pulisce ogni regola esistente
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
### DEFAULT CHAIN ### Imposta le policy di default
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -t nat -P POSTROUTING DROP
/sbin/iptables -t nat -P PREROUTING DROP
### SETTING IPFORWARDING ### Abilita il forwarding di pacchetti non locali - FONDAMENTALE
/bin/echo "1" > /proc/sys/net/ipv4/ip_forward
### DISABLE RESPOND TO BROADCAST ### Non risponde ai ping inviati al browadcast della subnet
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
### ENABLE BAD ERROR MESSAGE PROTECTION ### Ignora finti messaggi di errore ICMP
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
### DISABLE ICMP REDIRECT ACCEPTANCE ### Non accetta pacchetti ICMP di route redirection
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
### SETTING ANTISPOOFING PROTECTION ###
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
### DON'T RESPOND TO BROADCAST PINGS ###
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
### Qui vengono definite alcune variabili che successivamente sono usate nelle regole - MODIFICARE SECONDO I PROPRI PARAMETRI
# External Public Interface
EXTIF="eth1"
# Internal Private Interface
INTIF="eth0"
# Host Public IP (su eth1)
EGO="211.121.111.111"
# Internal LAN IP (su eth0)
LANIN="10.0.0.0/24"
# Trusted public network (da cui si permettono collegamenti SSH)
TRUSTED="13.18.151.0/24"
# IP/rete di un utente esterno abilitato a connetterci al server VPN interno
USER="112.56.10.32/28"
# IP Interno del server VPN
VPNSERVER="10.0.0.77"
# RFC IPs Classi di indirizzi dedicate a utilizzi privati o particolari e non routate su Internet
LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
# ANTISPOOF Adesso iniziano le regole vere e proprie. Le prime sono generiche regole anti-spoof per IP noti dall'interfaccia pubblica.
/sbin/iptables -A INPUT -i $EXTIF -s $EGO -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_A -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_B -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_C -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_D_MULTICAST -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_E_RESERVED_NET -j DROP
/sbin/iptables -A INPUT -i $EXTIF -d $LOOPBACK -j DROP
# LOOP RULE Permettiamo il traffico di loopback
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
# LAN IN ACCESS Regole che permettono l'accesso al firewall Linux dagli IP della rete Interna - Potrebbero essere più ristrette e limitarsi all'IP dell'amministratore
/sbin/iptables -A INPUT -i $INTIF -s $LANIN -j ACCEPT
/sbin/iptables -A OUTPUT -o $INTIF -d $LANIN -j ACCEPT
# LAN IN OUT Seguono le regole che gestiscono il masquerading della rete interna
/sbin/iptables -A FORWARD -s $LANIN -d 0/0 -j ACCEPT Forwarda tutti i pacchetti dalla rete interna a qualsiasi destinazione
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -d $LANIN -j ACCEPT Permette il forwarding di tutti i pacchetti correlati a comunicazioni esistenti
/sbin/iptables -t nat -A POSTROUTING -o $EXTIF -s $LANIN -j MASQUERADE Maschera gli IP sorgenti Interni con l'IP dell'interfaccia pubblica
# GENERAL Regole generali per permettere all'host locale di collegarsi a IP remoti e ricevere i pacchetti di risposta (Nota: si riferiscono alle attività che vengono fatte direttamente dalla macchina Linux locale e non dagli host che la usano come firewall)
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# SSH Regole per permettere l'accesso al server SSH locale da un IP esterno fidato precedentemente indicato
/sbin/iptables -A INPUT -s $TRUSTED -p TCP --dport 22 -j ACCEPT
# VPN NATTING Esegue un DNAT di un server VPN che usa pptp (TCP porta 1723) e GRE (IP type 47) e permette l'accesso al server solo da un IP sorgente definito
/sbin/iptables -A FORWARD -s $USER -p TCP --dport 1723 -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -d $EGO -p tcp --dport 1723 -j DNAT --to-dest $VPNSERVER:1723
/sbin/iptables -t nat -A PREROUTING -d $EGO -p 47 -i eth1 -j DNAT --to-dest $VPNSERVER
# LOGGING Log di tutti i pacchetti, esclusi i broadcast, prima di essere droppati dalla regole di default. I logging viene fatto con livello debug per isolarlo da altri log di sistema. Per cui è necessario scrivere in /etc/syslog.conf una riga tipo:
kern.debug /var/log/iptables.log
/sbin/iptables -A INPUT -m pkttype --pkt-type ! broadcast -j LOG --log-level=DEBUG --log-prefix="[INPUT DROP] : "
/sbin/iptables -A OUTPUT -m pkttype --pkt-type ! broadcast -j LOG --log-level=DEBUG --log-prefix="[OUTPUT DROP] : "
Esempi di configurazione di Iptables |
Esempi di configurazioni di un firewall Linux con iptables |
Iptables Avanzato |
Funzionalità avanzate di iptables. |
Tipo Infobox: DESCRIPTION - Skill Level: 5- SENIOR - Autore: Alessandro 'al' Franceschi - Ultimo Aggiornamento: 2005-06-01 10:21:27
Il team di sviluppatori di Netfilter e i loro collaboratori hanno realizzato numerose patch che allargano in modo considerevole le funzionalità del codice base, normalmente incluso nel kernel.
Molte di queste non sono incluse nel codice ufficiale del kernel in quanto considerate sperimentali, non completamente stabili o non necessarie, alcune lo saranno in futuro o sono incluse nel ramo 2.6 ma non nel 2.4, alcune sono incluse nei kernel forniti da specifiche distribuzioni.
Esiste comunque la possibilità di inserirle in un proprio kernel custom utilizzando Patch'O'Matic (POM), un comodo strumento realizzato dagli autori di Netfilter.
INTRODUZIONE
Per applicare le patch aggiuntive sul codice del proprio kernel sono necessari:
- I sorgenti del kernel (normalmente scompattati nella directory /usr/src/linux
o /usr/src/kernel-versione
o simili) su cui verranno applicate le patch
- I sorgenti di iptables, scaricabili dal sito ufficiale http://www.netfilter.org/ che vanno ricompilati per supportare le nuove opzioni introdotte
- I sorgenti di patch'o'matic, anch'essi scaricabili dal sito ufficiale. Notare che dai primi di Gennaio 2005 il team di Netfilter ha smesso di rilasciare release ufficiali di patch'o'matic, per cui è interessato a queste patch si deve basare sulle release "current" rilasciate regolarmente.
Le patch (sono numerose e variegate) sono divise in diversi gruppi:
submitted - Patch proposte e sottoposte per l'inclusione nel kernel ufficiale
pending - Patch che sono in attesa di essere proposte per essere incluse nel kernel ufficiale
base - Patch di base, comunque sperimentali e non testate in modo approfondito
extra - Tutte le patch disponibili, numerose, variegate e sperimentali
obsolete - Codice obsoleto o deprecato.
Notare che esistono patch in conflitto fra loro, che non vanno compilate sullo stesso kernel. Generalmente i conflitti, le dipendenze e le incompatibilità sono indicate per ogni patch.
INSTALLAZIONE
Si scaricano e scompattano i sorgenti. Non essendoci più release ufficiali di POM, in questo esempio si è ricorso all'ultimo snapshot, con tutti i rischi del caso nell'usare software in testing.
wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20050413.tar.bz2
tar -jxvf patch-o-matic-ng-20050413.tar.bz2
cd patch-o-matic-ng-20050413
A questo punto si può procedere con la procedura standard di POM:
export KERNEL_DIR=/usr/src/kerneldir Indicare la directory dove si trovano i sorgenti del kernel da patchare
export IPTABLES_DIR=/usr/src/iptablesdir Dove sono stati scompattati i sorgenti di iptables
./runme pending
Alternativamente eseguire ./runme base
o ./runme extra
per includere i diversi gruppi.
Per ogni patch viene data una breve spiegazione e chiesto se si vuole inserirla nel kernel.
Una volta completata questa operazione sarà possibile procedere alla compilazione del kernel secondo le solite procedure. Nel menu di configurazione del kernel tutte le patch aggiuntive sono include nella voce NetFilter Configuration del menu Networking options.
Oltre ai moduli del kernel, patch'O'matic permette di patchare il mondo userland del comando iptables, in modo da gestire le nuove funzionalità.
PATCH (+) INTERESSANTI
Vediamo alcune delle patch più interessanti che POM mette a disposizione, queste riguardano soprattutto nuovi criteri di matching dei pacchetti e nuovi target:
match: comment
Questa patch, già inclusa nel kernel ufficiale 2.6, permette di aggiungere un commento ad una regola, introducento il modulo di match comment con l'unica opzione --comment.
Esempio: -A INPUT -s 213.215.144.242 -m comment --comment "Host Webmaster"
Voce nel kernel .config: CONFIG_IP_NF_MATCH_COMMENT
Nome modulo: ipt_comment
target: NETMAP
Ancora sperimentale, presente nel repository base, introduce il target NETMAP che permette di nattare 1 a 1 tutti gli host di intere reti senza specificare i singoli IP. Comodo per firewall che nattano tutti i propri server in una DMZ con IP privati o per fare double natting per far comunicare reti con gli IP privati sovrapposti.
Esempio: iptables -t nat -A PREROUTING -d 213.215.144.128/25 -j NETMAP --to 10.0.0.128/25
Si può usare anche per source natting: iptables -t nat -A POSTROUTING -s 213.215.144.128/25 -j NETMAP --to 10.0.0.128/25
Voce nel kernel .config: CONFIG_IP_NF_TARGET_NETMAP
Nome modulo: ipt_NETMAP
match: connlimit
Patch sperimentale che imposta un numero massimo di connessioni tcp da un singolo arbitrario host IP o da una intera rete. Introduce il match connlimit con le opzioni --connlimit-above (determina il numero massimo di connessioni) e --connlimit-mask (imposta il limite allargandolo ad una intera rete, definendola tramite i subnet bit, ad esempio 24. Di default si limita al singolo host: 32)
Esempi:
Per limitare l'accesso SSH a due sole connessioni per IP sorgente:
-I INPUT -p tcp --dport 22 --syn -m connlimit --connlimit-above 2 -j DROP
Per impostare massimo 16 connessioni per rete di 256 indirizzi ad un server web dietro il firewall Linux:
-A FORWARD -d 213.215.144.242 -p tcp -m tcp --dport 80 --syn -m connlimit --connlimit-above 16 --connlimit-mask 32 -j DROP
Per impostare a 250 il numero massimo di connessioni contemporanee che possono essere fatte ad un server SMTP:
-A FORWARD -d 213.215.144.242 -p tcp -m tcp --dport 25 --syn -m connlimit --connlimit-above 250 --connlimit-mask 0 -j DROP
Voce nel kernel .config: CONFIG_IP_NF_MATCH_CONNLIMIT
Nome modulo: ipt_connlimit
match: iprange
Comoda patch che permette di fare il match su un range di IP sorgenti o destinazione. Introduce il modulo di match iprange con le opzioni: --src-range (range di IP sorgenti, es: 10.0.0.0-10.0.255.255) e --dst-range.
Esempio: iptables -A FORWARD -m iprange --dst-range 10.0.0.0-10.0.255.255 -j ACCEPT
Voce nel kernel .config: CONFIG_IP_NF_MATCH_IPRANGE
Nome modulo: ipt_iprange
match: nth
Curiosa e versatile patch che permette di fare un match ogni n pacchetti sulla base di opzioni varie, mettendo a disposizione di default 16 "contatori" indipendenti. Introduce il match nth con le opzioni:
--every Imposta ogni quanti pacchetti eseguire il match
--counter Definisce il contatore da utilizzare (di default 0)
--start Definisce a quale pacchetto iniziare a contare (di default 0)
--packet Definisce quale pacchetto all'interno del contatore matchare. Se viene definito va inserira una regola per ogni --packet da 0 a N-1
Esempio senza l'uso di --packet per loggare un pacchetto ogni 10, in entrata: iptables -I INPUT -m nth --every 10 -j LOG
Esempio per un semplice ma efficace load balancer dove tutti i pacchetti alla porta 80 dell'IP pubblico vengono forwardati in modalità round robin a 3 diversi server web nattati (viene usato il contatore 1):
iptables -t nat -A PREROUTING -d 213.215.144.242 -p tcp --dport 80 -m nth --counter 1 --every 3 --packet 0 -j DNAT --to-dest 10.0.0.10:80
iptables -t nat -A PREROUTING -d 213.215.144.242 -p tcp --dport 80 -m nth --counter 1 --every 3 --packet 1 -j DNAT --to-dest 10.0.0.11:80
iptables -t nat -A PREROUTING -d 213.215.144.242 -p tcp --dport 80 -m nth --counter 1 --every 3 --packet 2 -j DNAT --to-dest 10.0.0.12:80
Voce nel kernel .config: CONFIG_IP_NF_MATCH_NTH
Nome modulo: ipt_nth
match: psd
E' possibile identificare dei Port Scan tramite il match psd con le seguenti opzioni:
--psd-weight-threshold
--psd-delay-threshold
--psd-lo-ports-weight
--psd-hi-ports-weight
Un esempio essenziale per aggiungere un log, che può essere verboso, di tutti gli scan (Consigliabile aggiungerlo alla fine della catena di INPUT, con un default DROP finale):
iptables -A INPUT -m psd -j LOG --log-prefix "PORTSCAN: "
Voce nel kernel .config: CONFIG_IP_NF_MATCH_PSD
Nome modulo: ipt_psd
match: quota
Implementa il match quota con cui si definisce un contatore relativo al traffico di rete che si vuole permettere (o comunque matchare). Unica opzione: --quota (numero di byte massimi).
Esempio: iptables -A FORWARD -m quota --quota 1024000 -d 10.0.0.5 -j ACCEPT
Voce nel kernel .config: CONFIG_IP_NF_MATCH_QUOTA
Nome modulo: ipt_quota
match: random
Un curioso match random che introduce la possibiltà di definire regole con possibilità di match random in base all'opzione: --average che indica la percentuale media di match (di default il 50%)
Esempio: iptables -A INPUT -m random --average 10 -d 10.0.0.5 -j LOG
Voce nel kernel .config: CONFIG_IP_NF_MATCH_RANDOM
Nome modulo: ipt_random
match: time
Permete di creare regole sulla base dell'ora, della data o del giorno della settimana. Introduce il match time con le seguenti opzioni:
--timestart value - Match se l'ora locale è successiva a quella indicata (HH:MM, default 00:00).
--timestop value - Match se l'ora è prima di quella indicata (default 23:59).
--days - Giorno della settimana (formato: Mon,Tue,Wed,Thu,Fri,Sat,Sun ; default tutti i giorni)
--datestart - Match se la data è successiva a quella indicatata (Formato: YYYY[:MM[:DD[:hh[:mm[:ss]]]]])
--datestop - Match se la data locale è prima di quella indicata (Formato YYYY[:MM[:DD[:hh[:mm[:ss]]]]])
Esempio per permettere l'accesso solo in orari lavorativi:
iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT
Esempio per permettere l'accesso solo fino al 31 Dicembre 2005:
iptables -A INPUT -m time --datestop 2005:12:31:23:59 -j ACCEPT
Voce nel kernel .config: CONFIG_IP_NF_MATCH_TIME
Nome modulo: ipt_time
match: condition
Fornisce un meccanismo di matching che può rivelarsi estremamente flessibile per modificare le regole di firewalling secondo il contenuto di un file.
In pratica permette di verificare se un file qualsiasi nella directory /proc/net/ipt_condition/ ha valore 0 o 1.
Esempio per aprire la porta 80 se il file /proc/net/ipt_condition/openweb ha contenuto "1":
iptables -A INPUT -m condition --condition openweb -p tcp --dport 80 -j ACCEPT
Voce nel kernel .config: CONFIG_IP_NF_MATCH_CONDITION
Nome modulo: ipt_condition
match: geoip
Rivoluzionario modulo per eseguire filtering sulla base della nazione da cui proviene un IP. Si appoggia ad un database GeoIP, ha bisogno dei file /var/geoip/geoipdb.bin
e /var/geoip/geoipdb.idx
su quali eseguire il check sulle nazioni a cui sono associati i vari IP.
I database si possono creare con l'utility csv2bin o scaricare da http://people.netfilter.org/peejix/geoip/database/.
Voce nel kernel .config: CONFIG_IP_NF_MATCH_GEOIP
Nome modulo: ipt_geoip
match: string
Permette il match di una stringa nel contenuto di un pacchetto. Di fatto, seppur non è questo l'utilizzo migliore perchè non prevede la conoscenza della logica del protocollo, permette filtering a livello applicativo.
Esempio classico per loggare CodeRed e affini (notare che non esclude falsi positivi): iptables -I INPUT -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -j LOG
Voce nel kernel .config: CONFIG_IP_NF_MATCH_STRING
Nome modulo: ipt_string
SOURCE: Home page path'o'matic sul sito di Netfilter - http://www.netfilter.org/patch-o-matic/
LINK: SecurityFocus: IPTables Linux firewall with packet string-matching support - http://securityfocus.com/infocus/1531
Tipo Infobox: DESCRIPTION - Skill Level: 5- SENIOR - Autore: Giorgio 'neo' Colombo - Ultimo Aggiornamento: 2002-10-04 01:20:15
Per far si che il nostro linux funga da firewall, dovremo compilare il kernel abilitando il netfiltering e alcune sue features a seconda dello scopo e del tipo di traffico che dovra' filtrare.
Come la maggior parte delle features del kernel linux si ha la possibilita' di selezionarle come moduli oppure compilarli all'interno del kernel se si preferisce un kernel monolitico.
Di seguito vengono messe in evidenza le piu' importanti opzioni da considerare nella fase di configurazione del kernel per attivare e gestire il packet filtering:
CONFIG_PACKET
Permette a varie applicazione ed utility di lavorare direttamente sui device di rete
CONFIG_NETFILTER
DA ABILITARE!! Di fatto e' l'opzione base che vi permettera' anche di accedere al menu delle singole opzioni di iptables
CONFIG_IP_NF_CONNTRACK
Modulo che permette il tracking delle connessioni, utilizzato per il NAT e masquerading
CONFIG_IP_NF_FTP
Modulo che permette il tracking delle connessioni FTP, utile se volete fare firewall perimetrale o di contenimento che devono gestire anche traffico ftp. Bene o male FTP si utilizza ovunque, direi DA ABILITARE.
CONFIG_IP_NF_IPTABLES
DA ABILITARE!! Opzione che permette qualsiasi tipo di filtering, NAT e masquerading. Praticamento e' il core delle iptables
CONFIG_IP_NF_MATCH_LIMIT
Opzione non obbligatoria, ma permette di fare filtering sulle connessioni, stabilendo che un certo numero di pacchetti in un certo limite di tempo devono matchare alcune regole. Utile per difendersi da attacchi DoS
CONFIG_IP_NF_MATCH_MAC
Opzione che permette l'utilizzo del MAC address per il matching delle regole. Comodo se si hanno poche macchine da gestire, ma sarete pesantemente dipendenti dall'hardware che utilizzerete
CONFIG_IP_NF_MATCH_MARK
Abilita la possibilita' di fare il matching tramite il MARK dei pacchetti.
CONFIG_IP_NF_MATCH_MULTIPORT
Permette di filtrare le connessioni specificando un range di sorce port e destination port. DA ABILITARE
CONFIG_IP_NF_MATCH_TOS
Permette il filetring tramite TOS (Type of Service). ONLY FOR EXPERT
CONFIG_IP_NF_MATCH_TCPMSS
Abilita' la possibilita del matching del MSS field. ONLY FOR EXPERT
CONFIG_IP_NF_MATCH_STATE
Permette il stateful matching delle connessioni. DA ABILITARE !!
CONFIG_IP_NF_MATCH_UNCLEAN
Opzione che permette di filtrare il traffico TCP,UDP,ICMP che sono considerati invalidi. DA ABILITARE, ma ricordarsi che non funziona del tutto corettamente in tutti i casi
CONFIG_IP_NF_MATCH_OWNER
Ci permette di filtrare le socket, abilitando un'utente specifico per aprire un certo tipo di socket. E' ANCORA IN FASE DI SVILUPPO
CONFIG_IP_NF_FILTER
Modulo base per il packet filetering. DA AGGIUNGERE!!
CONFIG_IP_NF_TARGET_REJECT
Modulo che permette di specificare che i messagi di ICMP error di essere inviati alla sorgente
CONFIG_IP_NF_TARGET_MIRROR
Abilita il bounced back (rimbalzati indietro) dei pacchetti al sender. ES. se si decide di mettere un MIRROR target sulle porte di destinazione di HTTP (80), tutte le richieste verranno replicate al sender e poi seguite dai pacchetti contenenti le informazioni per visualizzare la pagina
CONFIG_IP_NF_NAT
Modulo che abilita il NAT, Port forwarding e masquerading. DA ABILIATRE se si vuole translare gli ip sorgente o di destinazione
CONFIG_IP_NF_TARGET_MASQUERADE
Modulo che permette di aggiungere il TARGET per il masquerading. DA ABILITARE, se si vuole fare masquerading.
CONFIG_IP_NF_TARGET_REDIRECT
Opzione che permette che vi permette di far funzionare il vostro firewall come se fosse un transparent proxy
CONFIG_IP_NF_TARGET_LOG
Permette la possibilita' di loggare i packetti. DA ABILITARE, anche se quello che si logga dipende dalle vostre regole. Se decidete di abilitare questa opzione e di loggare in syslog, utilizzate tools per avere un report del entry registrate nel log sia per rendere la lettura dei log piu' comprensibile sia per la possibilita' di mantenere una history
CONFIG_IP_NF_TARGET_TCPMSS
Questa opzione viene utilizzata per ovviare a vari problemi con host o ISP che bloccano i pacchetti che richiedono l'ICMP Fragmentation.
CONFIG_IP_NF_COMPAT_IPCHAINS
Abilita la compatibilita' con le vecchie IPCHAINS. DA ABILIATRE solo in caso di bisogno
CONFIG_IP_NF_COMPAT_IPFWADM
Abilita la compatibilita' con le vecchie IPCHAINS. DA ABILIATRE solo in caso di bisogno
Esistono altri parametri configurabili in run-time ovvero dopo che il kernel e' stato caricato e il sistema è in funzione.
Si hanno piu' possibilita' per modificare questi parametri, quello piu' corretto e' quello di modificare i vari parametri editando /etc/sysctl.conf
oppure usare il comando sysctl
o scrivendo direttamente i valori voluti nel proc filesystem.
Questa operazione viene normalmente eseguita tramite script lanciati al boot della macchina.
Segue un elenco delle principali opzioni modificabili in modalita' run-time per quanto riguarda il network, ovviamente nel dubbio è meglio lasciare i valori di default, salvo quelli strettamente necessari per un firewall (ip_forward).
I valori che si possono assumere sono di tipo:
- BOOLEAN = 0 (disabilita) e 1(abilita)
- INTEGER = N , dove N e' un mumero intero Es 64
- N INTEGERS = X Y Z , N indica il numero dei valori(interi) da inserire, e X Y Z i valori che acquisisce la variabile
Tutte le variabili fanno riferimento a /proc/sys/net/ipv4/*
:
ip_forward BOOLEAN - Permette il forwarding dei pacchetti fra le interfacce. DA ABILITARE.
ipfrag_high_thresh INTEGER - La massima memoria utilizzata per riassemblare i pacchetti IP frammentati. Quando questo valore verra' raggiunto, i pacchetti in surplus verranno scartati finche' non si raggiungera' di nuovo il valore settato in ip_frag_low_thresh
ipfrag_time INTEGER - Indica il tempo max in secondi per mantenere in memoria un "IP fragment"
tcp_syn_retries INTEGER - Indica il numero di volte che un SYN deve essere ritrasmesso per i tentativi di una connessione TCP attiva (non puo' essere piu' grande di 255)
tcp_synack_retries INTEGER - Indica il numero delle volte che un SYNACK deve essere ritrasmesso per i tentavi di connessioni TCP passive (non puo' essere piu' grande di 255)
tcp_keepalive_time INTEGER - Indica quanto spesso verra' inviato il messaggio TCP di keepalive. Default 2hdsfsfds
tcp_keepalive_probes INTEGER - Indica quanti pacchetti Keepalive probes verranno inviati, finche' la connessione verra' considerata definitivamente broken
tcp_keepalive_interval INTEGER - Indica quanto frequentemente i pacchetti di probe sono inviati. Moltiplicando per tcp_keepalive_probes si ottiene il tempo per il KILL di una connessione che non risponde ai pacchetti di probes.
tcp_retries1 INTEGER - Indica il numero di tentativi/richieste prima che venga segnalato al network layer che sulla connessione c'e' qualcosa che non va.
tcp_retries2 INTEGER - Indica il numero di tentativi/richieste prima di killare una sessione TCP attiva
tcp_orphan_retries INTEGER - Indica il numero dei tentativi/richieste prima che una connessione TCP venga killata
tcp_fin_timeout INTEGER - Indica il tempo per cui mantenere una socket nello status di FIN-WAIT-2
tcp_max_tw_buckets INTEGER - Indica il numero massimo di socket simultanee in timewait che mantiene il sistema
tcp_max_orphans INTEGER - Numero massimo di socket TCP che possono rimanere non collegati a file handle aperti dal sistema.
tcp_abort_on_overflow BOOLEAN - Permette il reset di una connessione se un servizio in listening e' troppo lento per rispondere.
tcp_sysncookies BOOLEAN - Opzione valida solo se il kernel e' stato compilato con il supporto dei SYNCOOKIES, previene possibili "syn flood attack"
tcp_timestamps BOOLEAN - Abilita o disabilita il timestamp
tcp_ecn BOOLEAN - Abilita o disabilta la notificazione di una possibile congestione della network
ip_local_port_range 2 INTEGERS - Desinisce il range delle porte locali, utilizzate dal protocollo TCP e UDP. Il primo numero indica la porta piu' bassa ed il secondo indica la porta piu' alta. Il valore di default dipende dal quantitativo di ram disponibile sul sistema
ip_dynaddr BOOLEAN - Se settato non a zero abilita il supporto per il dynamic addresses
icmp_echo_ignore_all BOOLEAN - Ignora i Ping (ICMP ECHO Request)
icmp_echo_ignore_broadcasts BOOLEAN - Se settati entrambi il sistema ignora gli ICMP ECHO solo verso indirizzi di broadcast/multicast
log_martians BOOLEAN - Logga i pacchetti con indirizzi impossibili.
accept_redirects BOOLEAN - Accetta o meno gli ICMP redirect
forwarding BOOLEAN - Abilita il forwarding per una specifica interfaccia
proxy_arp BOOLEAN - Abilita il proxy arp.
secure_redirects BOOLEAN - Accetta ICMP redirect message solo dai gw configurati.
La modifica di alcuni parametri potrebbe pregiudicare il buon funzionamento del sistema, ma può essere necessaria per il fine tuning di sistemi sotto particolari carichi di rete.
Per maggiori informazioni e indicazioni utili sui parametri raccomandabili fare riferimento direttamente al file Documentation/networking/ip-sysctl.txt
nel tarball del kernel.
LINK: IPTables log analyzer - http://www.gege.org/iptables/
LINK: GUI per Iptables - http://www.fwbuilder.org/
HOWTO: Linux Bridge+Firewall Mini-HOWTO version 1.2.0 - http://ldp.openskills.info/HOWTO/Bridge+Firewall.html
Tipo Infobox: DESCRIPTION - Skill Level: 3- INTERMEDIATE - Autore: Alessandro 'al' Franceschi - Ultimo Aggiornamento: 2005-05-14 22:11:24
Iptables mette a disposizione la possibilità di loggare pacchetti per debugging e analisi del traffico.
Di fatto il log generato da iptables può essere utile sia per verificare le funzionalità delle regole inserite sia per essere analizzato da tool per creare statistiche e report.
Il logging viene abilitato tramite target LOG
che lavora in kernel space e usa syslog per scrivere i log o con ULOG
per trasmettere a programmi in user space le informazioni di log.
E' buon senso loggare solo i pacchetti che vengono bloccati, in modo da avere informazioni utili per troubleshooting (in fase di configurazione e test del firewall) e sicurezza (per capire i volumi e la qualità del traffico non desiderato).
A differenza di molti altri, i target LOG e ULOG non interrompono l'attraversamento di una catena: i pacchetti che matchano una regola di (U)LOG vengono loggati e continuano ad essere processati venendo gestiti da netfilter secondo le regole successive.
In un firewall, che di default blocca tutto, la regola di logging dovrebbe essere l'ultima prima del DROP di default.
Il target LOG
Il target LOG (-j LOG
) permette di definire diverse opzioni:
--log-level #
- Livello di logging, secondo le logiche di syslog, utile, insieme alla configurazione di syslog.conf, per loggare i dati sui pacchetti su file separato.
--log-prefix stringa
- Una stringa, lunga fino a 29 caratteri, che viene messa come prefisso alla riga di log, per renderlo più leggibile e associarlo ad un dato tipo di traffico
--log-tcp-sequence
- Logga il TCP sequence naumber. Dato sensibile, se accessibile ad altri utenti locali.
--log-tcp-options
- Logga le opzioni presenti nell'intestazione TCP
--log-ip-options
- Logga le opzioni presenti nell'intestazione IP (come il precedente può essere utile per strumenti di analisi dei log, altrimenti, se le informazioni aggiuntive non si reputano interessanti, è meglio disattivare)
--log-uid
- Logga lo UserID del processo che ha generato il pacchetto (in OUTPUT).
Il target ULOG
Meno diffuso e usato rispetto a LOG, ULOG fornisce maggiore flessibilità ed estende notevolmente il campo di applicazioni possibili.
Redireziona infatti in multicast il pacchetto che ha matchato la regola su una netlink socket a cui possono legarsi uno o più processi in userspace ricevendo i pacchetti senza che un loro eventuale malfunzionamento interrompa la gestione del traffico da parte di netfilter.
I programmi che ricevono i pacchetti li possono quindi trattare per molteplici scopi:
- Logging su database o in formati diversi da quello standard via syslog del target LOG
- Ispezioni dei pacchetti per matching su tipologie di traffico articolate, come le regole di un IDS quale SNORT
- Attivazione di meccanismi di Intrusion Prevention, interrompendo flussi di traffico indesiderati o pericolosi
Le applicazioni possono essere molte e modulari e possono essere sviluppate come componenti esterne al kernel.
Una di queste è ULogD che funziona come un servizio e utilizza diversi plugin per gestire i dati in vario modo, tra cui la possibilità di loggare su database MySQL o PostgreSQL
--ulog-nlgroup nlgroup
- Definisce il gruppo netlink (1-32) a cui è indirizzato il pacchetto. Di default è 1
--ulog-prefix prefix
- Come su LOG, imposta una stringa come prefisso alla riga di log (max 32 caratteri)
--ulog-cprange #
- Numero di byte da copiare in user space. Di default è 0 e l'intero pacchetto viene inviato
--ulog-qthreshold #
- Numero di pacchetti che il kernel deve avere in coda prima di inviarli al netlink. Default è 1
Esempi
Per loggare i pacchetti sulle catene di filter FORWARD, INPUT e OUTPUT aggiungendo in ogni riga di log adeguato prefisso.
iptables -A FORWARD -j LOG --log-prefix="FORWARD: "
iptables -A INPUT -j LOG --log-prefix="INPUT:"
iptables -A OUTPUT -j LOG --log-prefix="OUTPUT:"
Per loggare tutti i pacchetti UDP in INPUT con porta sorgente diversa da 137,138 e 139, inserendo come prefisso INPUT UDP:
iptables -A INPUT -p UDP --source-port ! 137:139 -j LOG --log-prefix="INPUT UDP:"
Per loggare tramite ULOG:
iptables -A INPUT -j ULOG --log-prefix="INPUT:"
In esecuzione sul sistema deve esserci us servizio come ulogd in grado di intercettare il multicast su netlink.
Un buona regola di log da appendere alla fine di una catena con policy di default DROP, può essere la seguente. Logga solo pacchetti di tipo unicast (comodo per evitare log di drop di multicast o broadcast inoffensivi) e con livello 7 di severity su sysylog (debug):
iptables -A INPUT -m pkttype --pkt-type unicast -j LOG --log-prefix "INPUT: " --log-level 7
Esempio di output di LOG su syslog
Feb 19 11:01:12 GIOVE kernel: FORWARD=eth1 OUT=eth0 SRC=192.168.0.98 DST=213.198.151.2 LEN=66 TOS=0x00 PREC=0x00 TTL=127 ID=165 PROTO=UDP SPT=1047 DPT=53 LEN=46
LINK: Netfilter Log Format - http://logi.cc/linux/netfilter-log-format.php3
LINK: Netfilter Log analyzer on the web - http://logi.cc/linux/NetfilterLogAnalyzer.php3
LINK: Iptables Log analyzer - http://www.gege.org/iptables/
LINK: ulogd - http://gnumonks.org/projects/ulogd
Fonte: OpenSkills.info | Rilasciato sotto licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo. |