xtables-addons: filtriamo i pacchetti per paese

xtables-addons: filtriamo i pacchetti per paese
Il compito di bloccare il traffico da determinati paesi sembra semplice, ma la prima impressione è fuorviante. Oggi parleremo di come questo può essere realizzato.

Antefatti

I risultati della ricerca di Google su questo argomento sono deludenti: la maggior parte delle soluzioni è ormai "scaduta" e a volte sembra che questo tema sia stato messo da parte e dimenticato per sempre. Noi invece abbiamo "setacciato" molte vecchie registrazioni e siamo pronti a condividere una versione moderna delle istruzioni.

Ti consigliamo di leggere l'articolo per intero prima di eseguire i comandi indicati.

Preparazione del sistema operativo

La filtrazione sarà configurata utilizzando l'utility iptables, che necessita di un'estensione per lavorare con i dati GeoIP. Tale estensione può essere trovata in xtables-addons. xtables-addons installa estensioni per iptables sotto forma di moduli kernel autonomi, evitando così di dover ricompilare il kernel del sistema operativo.

Al momento della scrittura, la versione attuale di xtables-addons è 3.9. Tuttavia, nei repository standard di Ubuntu 20.04 LTS si trova solo la 3.8, e nei repository di Ubuntu 18.04 è disponibile solo la 3.0. È possibile installare l'estensione dal gestore pacchetti con il seguente comando:

apt install xtables-addons-common libtext-csv-xs-perl

È importante notare che ci sono piccole ma significative differenze tra la versione 3.9 e lo stato attuale del progetto, di cui parleremo più avanti. Per compilare dai sorgenti, installiamo tutti i pacchetti necessari:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Cloniamo il repository:

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

xtables-addons contiene molte estensioni, ma a noi interessa solo xt_geoip. Se non desideri portare in sistema estensioni inutili, puoi escluderle dalla compilazione. A tal fine, è necessario modificare il file mconfig. Per tutti i moduli desiderati, impostare y, e segnare tutti quelli non necessari con n. Compiliamo:

./autogen.sh

./configure

make

E installiamo con i diritti di superuser:

make install

Durante l'installazione dei moduli del kernel potrebbe verificarsi un errore di questo tipo:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- Errore SSL:02001002:library di sistema:fopen:File o directory non esistente: ../crypto/bio/bss_file.c:72
- Errore SSL:2006D080:routine BIO:BIO_new_file:file non trovato: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: File o directory non esistente

Questa situazione si verifica a causa dell'impossibilità di firmare i moduli del kernel, poiché non c'è nulla con cui firmare. Puoi risolvere questo problema con un paio di comandi:

cd /lib/modules/(uname -r)/build/certs

cat < x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Moduli

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

Il modulo del kernel è stato compilato e installato, ma il sistema non lo riconosce. Richiederemo al sistema di creare una mappa delle dipendenze tenendo conto del nuovo modulo, e poi lo caricheremo:

depmod -a

modprobe xt_geoip

Assicuriamoci che xt_geoip sia stato caricato nel sistema:

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

Inoltre, verifichiamo che l'estensione sia stata caricata in iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Siamo soddisfatti e non ci resta che aggiungere il nome del modulo in /etc/modules, affinché il modulo funzioni dopo il riavvio del sistema operativo. D'ora in poi iptables comprenderà i comandi geoip, ma gli mancano i dati per funzionare. Procediamo al caricamento del database geoip.

Download del database GeoIP

Creiamo una cartella in cui verrà memorizzata l'informazione comprensibile per l'estensione iptables:

mkdir /usr/share/xt_geoip

All'inizio dell'articolo abbiamo menzionato che ci sono differenze tra la versione dal codice sorgente e la versione dal gestore pacchetti. La differenza più evidente è il cambiamento del fornitore del database e dello script xt_geoip_dl, che scarica i dati aggiornati.

La versione del gestore pacchetti

Lo script si trova nel percorso /usr/lib/xtables-addons, tuttavia, quando si tenta di eseguirlo, si può vedere un errore non molto informativo:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

In passato, come database si utilizzava il prodotto GeoLite, ora noto come GeoLite Legacy, distribuito con licenza Creative Commons ASA 4.0 dalla società MaxMind. Con questo prodotto si sono verificati due eventi che hanno "rotto" la compatibilità con l'estensione per iptables.

In primo luogo, nel gennaio 2018 hanno annunciato è stata annunciata la fine del supporto del prodotto, e dal 2 gennaio 2019 sono stati rimossi tutti i link per il download della vecchia versione dal sito ufficiale. Ai nuovi utenti si consiglia di utilizzare il prodotto GeoLite2 o la sua versione a pagamento GeoIP2.

In secondo luogo, da dicembre 2019 MaxMind ha dichiarato ha annunciato un cambiamento significativo nell'accesso ai loro database. Per conformarsi alla legge californiana sulla protezione dei diritti dei consumatori, l'azienda MaxMind ha deciso di "chiudere" la distribuzione di GeoLite2 tramite registrazione.

Poiché vogliamo utilizzare il loro prodotto, ci registreremo su questa pagina.

xtables-addons: filtriamo i pacchetti per paese
Dopo, riceverai un'email con una richiesta per impostare la password. Ora che abbiamo creato un account, dobbiamo generare una chiave di licenza. Nel tuo profilo, trova la voce Le mie chiavi di licenza, poi fai clic sul pulsante Genera nuova chiave di licenza.

Durante la creazione della chiave, ci verrà posta solo una domanda: utilizzeremo questa chiave nel programma GeoIP Update? Rispondiamo di no e facciamo clic sul pulsante Conferma. Si aprirà una finestra pop-up che mostrerà la chiave. Salva questa chiave in un luogo sicuro, poiché dopo la chiusura della finestra pop-up non potrai più visualizzare completamente la chiave.

xtables-addons: filtriamo i pacchetti per paese
Abbiamo la possibilità di scaricare i database GeoLite2 manualmente, ma il loro formato non è compatibile con il formato atteso dallo script xt_geoip_build. A questo punto, i script GeoLite2xtables possono aiutare. Per far funzionare gli script, installa il modulo perl NetAddr::IP:

wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

Successivamente, cloniamo il repository con gli script e scriviamo nel file la chiave di licenza ottenuta in precedenza:

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Avviamo gli script:

# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv

MaxMind impone un limite di 2000 download al giorno e, in caso di un grande numero di server, suggerisce di memorizzare nella cache gli aggiornamenti su un server proxy.

Assicurati che il file di output si chiami necessariamente dbip-country-lite.csv. Sfortunatamente, 20_convert_geolite2 produce un file non perfetto. Lo script xt_geoip_build si aspetta tre colonne:

  • inizio dell'intervallo degli indirizzi;
  • fine dell'intervallo degli indirizzi;
  • codice paese in iso-3166-alpha2.

Il file di output contiene sei colonne:

  • inizio dell'intervallo degli indirizzi (rappresentazione stringa);
  • fine dell'intervallo degli indirizzi (rappresentazione stringa);
  • inizio dell'intervallo degli indirizzi (rappresentazione numerica);
  • fine dell'intervallo degli indirizzi (rappresentazione numerica);
  • codice paese;
  • nome del paese.

Questa discrepanza è critica e può essere corretta in uno dei due modi:

  1. modificando 20_convert_geolite2;
  2. modificando xt_geoip_build.

Nel primo caso accorciamo printf nel formato necessario, e nel secondo caso cambiamo l'assegnazione della variabile $cc in $row->[4]. Dopo di che, possiamo procedere con la raccolta:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 intervalli IPv4 per ZA
  348 intervalli IPv6 per ZA
   56 intervalli IPv4 per ZM
   12 intervalli IPv6 per ZM
   56 intervalli IPv4 per ZW
   15 intervalli IPv6 per ZW

Va notato che l'autore GeoLite2xtables non considera i suoi script pronti per la produzione e consiglia di monitorare per lo sviluppo di script originali xt_geoip_*. Pertanto, passiamo alla costruzione dai codici sorgente, in cui questi script sono già aggiornati.

Versione dai codici sorgente

Durante l'installazione dai codici sorgente, gli script xt_geoip_* si trovano nella directory /usr/local/libexec/xtables-addons. In questa versione dello script viene utilizzato un database IP to Country Lite. La licenza è la Creative Commons Attribution License, e tra i dati disponibili ci sono quei tre colonne necessarie. Scarichiamo e costruiamo il database:

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

Dopo queste operazioni, iptables è pronto per funzionare.

Utilizziamo geoip in iptables

Modulo xt_geoip aggiunge solo due chiavi:

opzioni di corrispondenza geoip:
[!] --src-cc, --source-country country[,country...]
	Corrispondi pacchetto proveniente da (uno dei) paesi specificati
[!] --dst-cc, --destination-country country[,country...]
	Corrispondi pacchetto in arrivo (uno dei) paesi specificati

NOTA: Il paese è inserito con il suo codice ISO3166.

I metodi per generare regole per iptables, in generale, rimangono invariati. Per utilizzare le chiavi dai moduli aggiuntivi è necessario chiaramente specificare il nome del modulo con la chiave -m. Ad esempio, una regola per bloccare le connessioni TCP in ingresso sulla porta 443 non provenienti dagli Stati Uniti su tutte le interfacce:

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

I file creati da xt_geoip_build vengono utilizzati solo per creare regole, ma non vengono considerati durante il filtraggio. Di conseguenza, per aggiornare correttamente il database geoip, è necessario prima aggiornare i file iv*-e poi ricreare tutte le regole che utilizzano geoip in iptables.

Conclusione

Il filtraggio dei pacchetti in base alla loro appartenenza ai paesi è una strategia un po' dimenticata dal tempo. Tuttavia, gli strumenti software per tale filtraggio si stanno sviluppando e, probabilmente, a breve nei gestori di pacchetti apparirà una nuova versione di xt_geoip con un nuovo fornitore di dati geoip, il che semplificherà notevolmente la vita degli amministratori di sistema.

xtables-addons: filtriamo i pacchetti per paese

Solo gli utenti registrati possono partecipare al sondaggio. Accedi, per favore.

Hai mai utilizzato il filtraggio per paese?

  • 59,1%Sì13

  • 40,9%No9

Hanno votato 22 utenti. Si sono astenuti 3 utenti.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster