Avanti Indietro Indice

9. LOG

9.1 Descrizione

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.

9.2 Opzioni

Sono disponibili le seguenti opzioni:

--log-level

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

--log-prefix

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.

--log-tcp-sequence

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

--log-tcp-options

Registra le opzioni tcp, nel file si troverà una stringa simile alla seguente: OPT (020405B40000080A0004413D0000000001030300)

--log-ip-options

Registra le opzioni ip (flag).

Per ottenere un elenco con relativa breve spiegazione utilizzare il comando:

iptables -j LOG --help 

9.3 Utilizzo

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.

9.4 Formato della registrazione

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

Avanti Indietro Indice