Loggare traffico bloccato da IPTABLES in Linux

Loggare traffico bloccato da IPTABLES in Linux

Una descrizione completa di iptables è disponibile qui

Per poter registrare i pacchetti che vengono bloccati da Iptables è necessario creare una nuova chain chiamata LOGGING.

E’ molto importante che la regola di registrazione (es. iptables -A INPUT -j LOGGING) sia l’ultima per ogni chain rispetto a tutte le altre regole, e registrerà tutti i pacchetti di input rilasciati (in entrata) su /var/log/syslog o /var/log/kern.log (essendo iptables integrato nel kernel linux).

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "Firewall-Blocked: " --log-level 4
iptables -A LOGGING -j DROP

Nella prima riga diciamo ad iptables di creare una nuova chain chiamata LOGGING il cui unico scopo è quello di registrare i messaggi in un file di testo.
La seconda riga passa tutti i pacchetti che non “matchano” con una regola precedente alla chain LOGGING.
La terza riga, registra i pacchetti in arrivo su syslog, limitando per pacchetti simili la registrazione a 2 al minuto aggiungendo un prefisso alla riga di log ‘Firewall-Blocked:’ .
L’ultima riga elimina tutti i pacchetti che sono arrivati ​​alla catena LOGGING perchè ormai inutili.

Qui un esempio base di iptables dopo la modifica:

# Generated by iptables-save v1.6.1 on Wed Aug 14 15:14:39 2019

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [718:88476]
:LOGGING - [0:0]

#**************************
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#Pacchetti attacco XMAS
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# Permette tutto il traffico su loopback (lo0) traffic e elimina tutto il traffico che non usa lo0 verso 127/8
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accetta in entrata su tutte le connessioni stabilite
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -m comment --comment "Abilitazione icmp" -j ACCEPT
# Accetta le connessione verso il DB Mysql 
-A INPUT -p tcp -m tcp --dport 3306 -s 192.168.0.6 -j ACCEPT 

#Accetto connessioni HTTPS
-A INPUT -p tcp -m tcp --dport 443 -s 192.168.0.6 -j ACCEPT 

# Elimino i pacchetti di rete non validi
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Elimino pacchetti di broadcast
-A INPUT -i enp2s0 -m pkttype --pkt-type broadcast -d 10.20.0.255/32 -j DROP

####TUTTE LE NUOVE REGOLE DEVONO ESSERE INSERITE QUI SOPRA PER LA CATENA INPUT

# Il resto del traffico viene inviato alla CHAIN LOGGING
-A INPUT -j LOGGING
   
# REGISTRAZIONE TRAFFICO BLOCCATO DA IPTABLES #

-A LOGGING -m limit --limit 2/min -j LOG --log-prefix "Firewall-Blocked: "
-A LOGGING -j DROP
################################################

COMMIT
# Completed on Wed Aug 14 15:14:39 2019

Con la configurazione attuale iptables registra, come detto in precedenza nel file generale di log /var/log/syslog,  rendendo difficile la lettura dei blocchi effettuati dal firewall.

Possiamo però scegliere il file che più ci piace in cui andare a conservare il log del firewall. In Ubuntu/Debian ad esempio, il programma predefinito per la gestione dei log è rsyslog. Per creare un nuovo file con tutto il traffico bloccato da iptables basterà creare un file di configurazione in  /etc/rsyslog.d/ chiamato ad esempio 05-iptables.conf con all’interno la seguente configurazione:

if $msg contains "Firewall-Blocked:" then {
        /var/log/firewall.log
        stop
}

dove “Firewall-Blocked:” è il testo che abbiamo definito nella riga 3 delle regole iptables e nella seconda riga la posizione del file che vogliamo venga scritto.
A questo punto, il demone rsyslog, dopo aver riavviato il servizio con 

root@myserver:~# service rsyslog restart

creerà un nuovo file chiamato /var/log/firewall.log in cui sarà elencato tutto il traffico bloccato da iptables.

Per finire, dobbiamo creare un file di configurazione per consentire la rotazione dei file di log chiamato /etc/logrotate.d/iptables il cui contenuto sarà:

/var/log/firewall.log
{
	su syslog syslog
        rotate 7
	daily
	missingok
	notifempty
	delaycompress
	compress
        dateext
        dateformat -del_%Y-%m-%d
	postrotate
		invoke-rc.d rsyslog rotate > /dev/null 2>&1 || true
	endscript
}

Lo script indica a logrotate di ruotare quotidianamente i log del firewall e di conservare i log degli ultimi sette giorni.

Testiamo con logrotate che non ci siamo problemi (dopo aver verificato che il file di log /var/log/firewall.log esista e lanciamo il comando

root@myserver:~#logrotate -f /etc/logrotate.d/iptables

Ora dovremmo vedere un nuovo file chiamato firewall.log-del_2019-12-12

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *