Differences between revisions 2 and 3
Revision 2 as of 2022-06-25 14:44:10
Size: 5730
Editor: Kurgan
Comment:
Revision 3 as of 2022-08-11 10:36:01
Size: 5785
Editor: Kurgan
Comment:
Deletions are marked like this. Additions are marked like this.
Line 47: Line 47:
47 4 * * * root /opt/blocklists-ipset.py 47 4 * * * root /opt/blocklists-ipset.py && ( /usr/sbin/ipset save -file /etc/iptables/ipsets )

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.

LinuxDebian/Ipset (last edited 2022-08-11 10:36:01 by Kurgan)