Usare ipset e la lista pubblica di blocklist.de
Questa configurazione funziona su Debian 11 con systemd, non l'ho provata su Devuan senza systemd ma suppongo funzioni con minime modifiche.
Lo scopo di questa configurazione è quello di inserire nel nostro firewall (fatto con iptables) delle regole per bloccare gli ip malevoli (ipv4 e ipv6) presi dalla lista pubblica disponibile dal sito blocklist.de.
Per farlo, useremo:
- Python 3 (in Debian 11 è già presente e non dovrebbe essere necessario installare niente)
Uno script python per scaricare la lista di blocklist.de e creare due ipset, uno per v4 e uno per v6. Lo script è questo: https://github.com/Thermi/blocklists-ipset
- Iptables e ipset con i relativi script per il restore al boot (i pacchetti iptables-persistent e ipset-persistent in Debian 11)
- Cron per aggiornare le liste da blocklist.de
Installazione
- Installare i pacchetti necessari:
apt install iptables-persistent ipset-persistent
- Assicurarsi che iptables-persistent parta al boot:
systemctl enable netfilter-persistent.service
Scaricare lo script python che crea e aggiorna gli ipset di blocklist.de. Questo script lo trovate qui allegato blocklists-ipset.py ma vale la pena di verificare se sono state fatte migliorie o aggiornamenti da https://github.com/Thermi/blocklists-ipset. Salviamo questo script dove ci viene comodo; io lo metto dentro /opt/.
- Verificare che esista la directory /etc/iptables (dovrebbe essere stata creata quando abbiamo installato iptables-persistent)
Creare i due ipset vuoti come da documentazione su https://github.com/Thermi/blocklists-ipset
ipset create blocklists-de-permanent_v4 hash:ip family inet hashsize 1024 maxelem 65535 comment ipset create blocklists-de-permanent_v6 hash:ip family inet6 hashsize 1024 maxelem 65535 comment
- Eseguire a mano lo script che popola gli ipset (non dovrebbe dare nessun output in caso di successo)
chmod u+x /opt/blocklists-ipset.py /opt/blocklists-ipset.py
- Verificare che gli ipset siano stati popolati
ipset list | less
- Salvare gli ipset in modo che al boot vengano ricaricati. Questo è necessario in quanto iptables riporta un errore se gli dico di usare un ipset che ancora non esiste. Inoltre se al boot non venissero ricaricati dovremmo ri-eseguire sia gli "ipset create" che lo script blocklist-ipset.py per rigenerare e ripopolare gli ipset.
ipset save -file /etc/iptables/ipsets
- Mettere in crontab una riga che aggiorni le blocklist (non troppo spesso, secondo me al massimo una volta al giorno).
# Aggiorno gli ipset di blocklist.de 47 4 * * * root /opt/blocklists-ipset.py && ( /usr/sbin/ipset save -file /etc/iptables/ipsets )
Creare uno script di firewall
A questo punto si può creare uno script di firewall (che possiamo salvare dove vogliamo, per esempio nella home di root o anche questo in /opt/) che esegua le seguenti azioni:
- Flush delle regole
- Creazione delle regole che vogliamo
- Salvataggio delle regole usando iptables-save.
Le regole così salvate verranno ricaricate al boot da iptables-restore (se funziona tutto correttamente) quindi questo script non va lanciato ad ogni boot, ma lo lanceremo a mano solo alla prima configurazione e poi se vogliamo fare modifiche al nostro firewall.
Ovviamente questo e` un esempio; le vostre regole saranno diverse.
#### #### Inizializzazione (cancellazione delle regole vecchie) #### iptables -F ip6tables -F iptables -F -t nat iptables -X ip6tables -X ### ### blocchi per ipset ### iptables -I INPUT -m set --match-set blocklists-de-permanent_v4 src -j DROP ip6tables -I INPUT -m set --match-set blocklists-de-permanent_v6 src -j DROP #### #### SSH (per esempio) #### iptables -A INPUT -i ens3 -m state --state NEW -p tcp --dport 22 -j ACCEPT ip6tables -A INPUT -i ens3 -m state --state NEW -p tcp --dport 22 -j ACCEPT #### #### accetto l' icmp #### iptables -A INPUT -i ens3 -p icmp -j ACCEPT ip6tables -A INPUT -i ens3 -p icmpv6 -j ACCEPT #### #### Blocco tutto quello che entra da ens3 che sia in stato NEW o INVALID #### (e che non sia stato accettato prima, ovviamente) #### iptables -A INPUT -i ens3 -m state --state NEW,INVALID -j DROP ip6tables -A INPUT -i ens3 -m state --state NEW,INVALID -j DROP iptables -A FORWARD -i ens3 -m state --state NEW,INVALID -j DROP ip6tables -A FORWARD -i ens3 -m state --state NEW,INVALID -j DROP #### #### Salvo le regole in modo che al boot vengano ricaricate da #### netfilter-persistent #### /sbin/ip6tables-save > /etc/iptables/rules.v6 /sbin/iptables-save > /etc/iptables/rules.v4
Conclusioni
Questa configurazione è la prima che documento per Debian 11 con systemd. Volendo fare la stessa configurazione senza systemd non dovrebbero esserci grosse differenze se non per il comando per abilitare netfilter-persistent che sarà diverso (probabilmente comunque è abilitato di default al momento in cui lo installiamo).
Nella "vecchia logica" che ho usato sempre prima di systemd non avrei proprio usato netfilter-persistent, ma avrei usato uno script di init che carica al boot tutte le regole di firewall e popola anche gli ipset. Questa "nuova logica" è pensata così perché non ho voglia di studiarmi a fondo systemd per crearmi una mia unit che carichi le regole di firewall, quindi ho deciso di appoggiarmi a netfilter-persistent e far fare il lavoro a lui. Probabilmente in futuro comunque tutto questo sarà obsoleto e saremo costretti a usare l'ennesima reinvenzione dell'acqua calda tipo firewalld, quindi sarà tutto da rivedere.