= 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 [[attachment: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.''' {{{ #!/bin/sh #### #### 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.