Questo modulo permette di gestire la registrazione dei pacchetti che transitano attraverso il firewall. Rispetto a ipchains che utilizza l'opzione '-l' ora si deve usare l'obiettivo '-j LOG'. Questa modifica ha consentito inoltre di introdurre due nuove opzioni che consentono di memorizzare i log in file diversi e di aggiungere una stringa di commento.
Sono disponibili le seguenti opzioni:
Questa opzione permette di specificare un nome di livello (debug, info, notice, warning, err, crit, alert, emerg) o il numero corrispondente (0-7). Configurando il file syslog.conf è possibile registrare le informazioni dei pacchetti in file differenti in base alle proprie esigenze, oppure direttamente sulla console. Ad esempio, con la Slackware, se si utilizza '--log-level info' o '--log-level notice' le informazioni dei pacchetti saranno memorizzate nel file /var/log/message, se si utilizza '--log-level debug' invece saranno registrate nel file /var/log/debug. Per ulteriori dettagli consultare il manuale di syslog.conf (man syslog.conf) e il file /etc/syslog.conf
Questa opzione permette di specificare una stringa di max. 29 caratteri da inserire nel file di log (/var/log/messages) assieme al resto delle informazioni, usato per identificare rapidamente ciò che interessa.
Registra i numeri di sequenza. Per default i numeri di sequenza (sequence number) non sono memorizzati (consigliato), se si desidera registrare queste informazioni (es. SEQ=3431266037) utilizzare '--log-tcp-sequence'.
Registra le opzioni tcp, nel file si troverà una stringa simile alla seguente: OPT (020405B40000080A0004413D0000000001030300)
Registra le opzioni ip (flag).
Per ottenere un elenco con relativa breve spiegazione utilizzare il comando:
iptables -j LOG --help
Per registrare le intestazioni dei pacchetti è necessario specificare il tipo di pacchetto, l'obiettivo LOG ('-j LOG') ed opzionalmente anche il livello ('--log-level') e la stringa che deve essere associata ('--log-prefix'). Esempio:
iptables -A INPUT -p tcp --dport telnet --syn -j LOG --log-level info \ --log-prefix "Firewall (telnet request) -->"
In questo caso i pacchetti tcp destinati alla porta telnet del firewall sono registrati nel file associato a info (vedere syslog.conf - man syslog.conf), nel caso della Slackware è /var/log/messages, e "contrassegnati" con la stringa Firewall (telnet request) -->.
In alcuni casi è necessario, oltre a registrare le informazioni di un pacchetto, anche scartarlo (o accettarlo):
iptables -A INPUT -s 192.168.0.0/24 -j LOG iptables -A INPUT -s 192.168.0.0/24 -j DROP
Questa soluzione in realtà non è utilizzata in quanto ripetitiva, è meglio creare delle catene specifiche ad esempio logdrop, logaccept e poi utilizzarle quando necessario.
iptables -N logdrop iptables -A logdrop -j LOG --log-level info --log-prefix "FIREWALL logdrop: " iptables -A logdrop -j DROP iptables -N logaccept iptables -A logaccept -j LOG --log-level info --log-prefix "FIREWALL logaccept: " iptables -A logaccept -j ACCEPT iptables -A INPUT -s 192.168.0.0/24 -j logdrop
Il meccanismo di LOG attuale non è ideale per tutti i casi, per questo motivo sono già state proposte nuovi soluzioni che dovrebbero sostituirlo e consentire un utilizzo più comodo.
Il formato della registrazione in base al comando precedentemente indicato è il seguente:
Jun 5 17:35:49 localhost kernel: Firewall (telnet request) -->IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=1061 DPT=23 WINDOW=30816 RES=0x00 SYN URGP=0 Firewall (telnet request) --> = stringa inserita con l'opzione --log-prefix IN = interfaccia di ingresso OUT = interfaccia di uscita SRC = indirizzo IP sorgente del pacchetto DST = indirizzo IP destinazione del pacchetto LEN = dimensione del pacchetto (LENGTH) TOS = bit TOS (Type Of Service) PREC = Precedence TTL = Time to Live ID = Identification (necessario per stabilire a quale pacchetto appartiene un frammento) DF = Don't Fragment (bit che segnala di non frammentare il pacchetto) SPT = porta sorgente DPT = porta destinazione PROTO = protocollo (tcp/udp/icmp) WINDOW= window size (indica quanti byte possono essere spediti a partire dal byte confermato) RES = SYN...= flag impostati (URG/ACK/PSH/RST/SYN/FIN) URGP = urgent pointer (scostamento in byte utile per trovare i dati urgenti)
Nel caso di pacchetti ICMP sono presenti oltre ad alcuni dei campi precedenti anche i seguenti:
TYPE = tipo pacchetto ICMP CODE = codice pacchetto ICMP [..SRC=.. DST=..] = informazioni sul pacchetto che ha causato la risposta ICMP
E' consigliato utilizzare LOG assieme a limit in quanto così è possibile stabilire dei limiti al numero di registrazioni, evitando casi di flood, ossia un numero esagerato di registrazioni che potrebbero causare l'esaurimento dello spazio su disco.
# -------------------------------------------------------------------------------- # Registra i pacchetti (-j LOG) che transitano per la catena FORWARD (-A FORWARD) e # aggiungi la stringa "FORWARD: " (--log-prefix "FORWARD: ". # Utilizza inoltre i parametri di default di limit (3/h, burst di 5 pacchetti) per # limitare il numero di registrazioni. # -------------------------------------------------------------------------------- iptables -A FORWARD -m limit -j LOG --log-prefix "FORWARD: " # -------------------------------------------------------------------------------- # Come esempio precedente solo che si stabilisce un limite alle registrazioni pari a # 5 pacchetti ogni ora (burst rimane invariato, 5 pacchetti). # -------------------------------------------------------------------------------- iptables -A FORWARD -m limit --limit 5/h -j LOG --log-prefix "FORWARD: "
L'esempio 1, riguardante il connection tracking, può essere modificato in questo modo:
#!/bin/bash # Esempio 1 # Supponiamo che PC1 appartenga ad una rete locale e che vogliamo renderla # più sicura e protetta. # # +---+ . # |PC1|------+ # +---+ | # | # +---..... INTERNET # +---+ | # | |------+ # +---+ | # | # . # -------------------------------------------------------------------------------- # Carichiamo i moduli necessari se non compilati nel kernel (es. ip_conntrack) # -------------------------------------------------------------------------------- modprobe ip_conntrack modprobe ipt_REJECT # -------------------------------------------------------------------------------- # Svuotiamo le catene di tutte le regole # -------------------------------------------------------------------------------- iptables -F # -------------------------------------------------------------------------------- # OUTPUT # Accettiamo tutti i pacchetti riguardanti una connessione stabilita o relativa # -------------------------------------------------------------------------------- iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # -------------------------------------------------------------------------------- # I pacchetti di richiesta connessione o nuova connessione (NEW) accettati # sono solo quelli telnet,www, dns (tcp e udp). # Accettiamo anche i pacchetti in uscita dall'interfaccia lo (localhost). # -------------------------------------------------------------------------------- iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -p tcp --dport telnet -m state --state NEW -j ACCEPT iptables -A OUTPUT -p tcp --dport domain -m state --state NEW -j ACCEPT iptables -A OUTPUT -p udp --dport domain -m state --state NEW -j ACCEPT iptables -A OUTPUT -p tcp --dport www -m state --state NEW -j ACCEPT # -------------------------------------------------------------------------------- # tutto il resto è rifiutato # -------------------------------------------------------------------------------- iptables -A OUTPUT -j REJECT # -------------------------------------------------------------------------------- # FORWARD # PC1 non è posto a protezione di una rete locale. # -------------------------------------------------------------------------------- iptables -A FORWARD -j DROP # -------------------------------------------------------------------------------- # INPUT - Accettiamo tutti i pacchetti che fanno parte di una connessione da # noi stabilita (ESTABLISHED) o che sono relativi (RELATED) come ad esempio # pacchetti ICMP di errore. # -------------------------------------------------------------------------------- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # -------------------------------------------------------------------------------- # Registriamo i dati riguardanti i pacchetti che non sono appartenenti a connessioni note # o relativi. Nel file questi dati saranno evidenziati dalla stringa "FW ricevuto:" # Inoltre saranno registrati solo un numero limitato di pacchetti (-m limit). # Le opzioni di default di limit sono (--limit 3/hour --limit-burst 5). # -------------------------------------------------------------------------------- iptables -A INPUT -m limit -j LOG --log-level info --log-prefix "FW ricevuto: " # -------------------------------------------------------------------------------- # il resto è scartato # -------------------------------------------------------------------------------- iptables -A INPUT -j DROP