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 è ingannevole. Oggi parleremo di come realizzarlo.

Contesto

I risultati di ricerca su Google riguardo a 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. Abbiamo 'setacciato' molte vecchie pubblicazioni e siamo pronti a condividere una versione aggiornata 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 richiede un'estensione per lavorare con i dati GeoIP. Tale estensione può essere trovata in xtables-addons. xtables-addons installa estensioni per iptables come moduli kernel autonomi, consentendo di non dover ricompilare il kernel del sistema operativo.

Al momento della scrittura dell'articolo, la versione attuale di xtables-addons è 3.9. Tuttavia, nei repository standard di Ubuntu 20.04 LTS si può trovare solo la 3.8, mentre nei repository di Ubuntu 18.04 si trova la 3.0. L'estensione può essere installata 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 in seguito. Per la compilazione 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 numerose estensioni, ma ci interessa solo xt_geoip. Se non si desidera portare nel sistema estensioni non necessarie, è possibile escluderle dalla compilazione. Per fare ciò, è necessario modificare il file mconfig. Per tutti i moduli desiderati impostare y, mentre tutti quelli non necessari contrassegnarli come n. Compiliamo:

./autogen.sh

./configure

make

E installiamo con i diritti di superutente:

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 trovata: ../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 trovata

Questa situazione si verifica a causa dell'impossibilità di firmare i moduli del kernel, poiché non c'è nulla per farlo. 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

[ 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. Chiederemo al sistema di creare una mappa delle dipendenze tenendo conto del nuovo modulo, e poi lo caricheremo:

depmod -a

modprobe xt_geoip

Verifichiamo 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 a posto e dobbiamo solo aggiungere il nome del modulo in /etc/modules, affinché il modulo funzioni dopo il riavvio del sistema operativo. Da questo momento, iptables comprende i comandi geoip, ma gli mancano i dati per funzionare. Procediamo al caricamento del database geoip.

Ottenimento del database GeoIP

Creiamo una directory in cui verrà archiviata l'informazione comprensibile all'estensione iptables:

mkdir /usr/share/xt_geoip

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

La versione del gestore dei pacchetti

Lo script si trova nel percorso /usr/lib/xtables-addons, ma cercando di eseguirlo si può notare un errore poco 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 precedenza come database veniva utilizzato il prodotto GeoLite, ora noto come GeoLite Legacy, distribuito sotto licenza Creative Commons ASA 4.0 dall'azienda MaxMind. Con questo prodotto si sono verificati due eventi che hanno "interrotto" la compatibilità con l'estensione per iptables.

In primo luogo, a gennaio 2018 hanno annunciato è stata annunciata la cessazione del supporto del prodotto, e dal secondo gennaio 2019 sono stati rimossi dal sito ufficiale tutti i link per scaricare la versione precedente del database. Si consiglia ai nuovi utenti di utilizzare il prodotto GeoLite2 o la sua versione a pagamento GeoIP2.

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

Poiché vogliamo usufruire del 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 account personale troverai la voce My License Keys, quindi clicca sul pulsante Generate new License Key.

Quando crei la chiave, ti verrà posta solo una domanda: utilizzeremo questa chiave con il programma GeoIP Update? Rispondi negativamente e clicca sul pulsante Confirm. In una finestra pop-up verrà visualizzata la chiave. Salva questa chiave in un luogo sicuro, poiché dopo la chiusura della finestra pop-up non potrai più visualizzare la chiave completamente.

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. Qui ci vengono in aiuto gli script GeoLite2xtables. Per far funzionare gli script, installiamo 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

Dopo, cloniamo il repository con gli script e registriamo il codice di licenza precedentemente ottenuto:

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 gran numero di server, suggerisce di memorizzare la versione aggiornata su un server proxy.

Si prega di notare che il file di output deve necessariamente chiamarsi 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 del 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 del paese;
  • nome del paese.

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

  1. modificare 20_convert_geolite2;
  2. modificare xt_geoip_build.

Nel primo caso riduciamo printf al formato corretto, mentre nel secondo cambiamo l'assegnazione della variabile $cc con $row->[4]. Dopo questo, è possibile procedere con la configurazione:

/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

Si noti che l'autore GeoLite2xtables non considera i propri script pronti per la produzione e suggerisce di seguire lo sviluppo degli script originali xt_geoip_*. Pertanto, passiamo alla configurazione dei codici sorgente in cui questi script sono già stati 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 il database IP to Country Lite. Licenza — Creative Commons Attribution License, e tra i dati disponibili ci sono proprio quelle tre colonne necessarie. Scarichiamo e configuriamo 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 l'uso.

Usiamo geoip in iptables

Modulo xt_geoip aggiunge solo due opzioni:

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 diretto a (uno dei) paesi specificati

NOTA: Il paese è inserito con il codice ISO3166.

I metodi per configurare le regole per iptables rimangono complessivamente invariati. Per utilizzare le chiavi dei moduli aggiuntivi, è necessario specificare esplicitamente 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 nella creazione delle regole, ma non sono considerati nella filtrazione. Pertanto, per aggiornare correttamente il database geoip, è necessario prima aggiornare i file iv*-e poi ricreare tutte le regole che utilizzano geoip in iptables.

Conclusione

La filtrazione dei pacchetti in base alla nazionalità è una strategia un po' dimenticata nel tempo. Nonostante ciò, gli strumenti software per tale filtrazione si stanno sviluppando e, forse 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 agli amministratori di sistema.

xtables-addons: filtriamo i pacchetti per paese

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

Hai mai utilizzato la filtrazione basata sui paesi?

  • 59,1%Sì13

  • 40,9%No9

Hanno votato 22 utenti. 3 utenti si sono astenuti.

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