xtables-addons: filtra i pacchetti per paese

xtables-addons: filtra i pacchetti per paese
Il compito di bloccare il traffico proveniente da determinati paesi sembra semplice, ma le prime impressioni possono essere ingannevoli. Oggi vi diremo come questo può essere implementato.

Sfondo

I risultati di una ricerca su Google su questo argomento sono deludenti: la maggior parte delle soluzioni sono “marce” da tempo e a volte sembra che questo argomento sia stato accantonato e dimenticato per sempre. Abbiamo esaminato molti vecchi documenti e siamo pronti a condividere una versione moderna delle istruzioni.

Ti consigliamo di leggere l'intero articolo prima di eseguire questi comandi.

Preparazione del sistema operativo

Il filtro verrà configurato utilizzando l'utilità iptables, che richiede un'estensione per funzionare con i dati GeoIP. Questa estensione può essere trovata in Componenti aggiuntivi xtables. xtables-addons installa le estensioni per iptables come moduli del kernel indipendenti, quindi non è necessario ricompilare il kernel del sistema operativo.

Al momento in cui scriviamo, la versione corrente di xtables-addons è la 3.9. Tuttavia, solo 20.04 può essere trovato nei repository Ubuntu 3.8 LTS standard e 18.04 nei repository Ubuntu 3.0. Puoi installare l'estensione dal gestore pacchetti con il seguente comando:

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

Da notare che ci sono piccole ma importanti differenze tra la versione 3.9 e lo stato attuale del progetto, di cui parleremo più avanti. Per compilare dal codice sorgente, installa 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

Clonare 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 vuoi trascinare estensioni non necessarie nel sistema, puoi escluderle dalla build. Per fare ciò è necessario modificare il file mconfig. Per tutti i moduli desiderati, installare ye contrassegna tutti quelli non necessari n. Raccogliamo:

./autogen.sh

./configure

make

E installa con diritti di superutente:

make install

Durante l'installazione dei moduli del kernel, potrebbe verificarsi un errore simile al seguente:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory

Questa situazione nasce dall'impossibilità di firmare i moduli del kernel, perché niente da firmare. Puoi risolvere questo problema con un paio di comandi:

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

cat <<EOF > x509.genkey

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

[ req_distinguished_name ]
CN = Modules

[ 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 compilato è installato, ma il sistema non lo rileva. Chiediamo al sistema di creare una mappa dipendente tenendo conto del nuovo modulo, quindi caricarlo:

depmod -a

modprobe xt_geoip

Assicuriamoci che xt_geoip sia caricato nel sistema:

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

Inoltre, assicurati che l'estensione sia caricata in iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Siamo contenti di tutto e non resta che aggiungere il nome del modulo a / etc / modulesin modo che il modulo funzioni dopo aver riavviato il sistema operativo. D'ora in poi, iptables comprende i comandi geoip, ma non dispone di dati sufficienti con cui lavorare. Iniziamo a caricare il database geoip.

Ottenere il database GeoIP

Creiamo una directory in cui verranno archiviate le informazioni comprensibili all'estensione iptables:

mkdir /usr/share/xt_geoip

All'inizio dell'articolo abbiamo accennato alle differenze tra la versione del codice sorgente e quella del gestore pacchetti. La differenza più evidente è il cambiamento nel fornitore del database e nello script xt_geoip_dl, che scarica i dati più recenti.

Versione del gestore pacchetti

Lo script si trova nel percorso /usr/lib/xtables-addons, ma quando provi ad eseguirlo vedrai 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 su licenza Creative Commons ASA 4.0 l'azienda MaxMind. Con questo prodotto si sono verificati due eventi contemporaneamente che hanno "interrotto" la compatibilità con l'estensione iptables.

Innanzitutto nel gennaio 2018 annunciato sulla cessazione del supporto per il prodotto e il 2019 gennaio 2 tutti i collegamenti per il download della vecchia versione del database sono stati rimossi dal sito ufficiale. Si consiglia ai nuovi utenti di utilizzare il prodotto GeoLite2 o la sua versione a pagamento GeoIPXNUMX.

In secondo luogo, da dicembre 2019 MaxMind egli ha dichiarato circa un cambiamento significativo nell’accesso ai loro database. Per ottemperare al California Consumer Privacy Act, MaxMind ha deciso di "coprire" la distribuzione di GeoLite2 con la registrazione.

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

xtables-addons: filtra i pacchetti per paese
Riceverai quindi un'e-mail che ti chiederà di impostare una password. Ora che abbiamo creato un account, dobbiamo creare una chiave di licenza. Nel tuo account personale troviamo l'oggetto Le mie chiavi di licenza, quindi fare clic sul pulsante Genera una nuova chiave di licenza.

Quando creiamo una chiave, ci verrà posta solo una domanda: utilizzeremo questa chiave nel programma GeoIP Update? Rispondiamo negativamente e premiamo il pulsante Confermare. La chiave verrà visualizzata in una finestra pop-up. Salva questa chiave in un luogo sicuro, poiché una volta chiusa la finestra pop-up non sarai più in grado di visualizzare l'intera chiave.

xtables-addons: filtra i pacchetti per paese
Abbiamo la possibilità di scaricare manualmente i database GeoLite2, ma il loro formato non è compatibile con il formato previsto dallo script xt_geoip_build. È qui che gli script GeoLite2xtables vengono in soccorso. Per eseguire gli script, installare 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 la chiave di licenza precedentemente ottenuta in un file:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Eseguiamo 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, con un numero elevato di server, offre di memorizzare nella cache l'aggiornamento su un server proxy.

Tieni presente che il file di output deve essere richiamato dbip-country-lite.csv... Sfortunatamente, 20_convert_geolite2 non produce un file perfetto. Copione xt_geoip_build prevede tre colonne:

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

E il file di output contiene sei colonne:

  • inizio dell'area indirizzi (rappresentazione di stringa);
  • fine dell'intervallo di indirizzi (rappresentazione della stringa);
  • inizio dell'intervallo di indirizzi (rappresentazione numerica);
  • fine dell'intervallo di indirizzi (rappresentazione numerica);
  • codice del paese;
  • il nome del paese.

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

  1. regola 20_convert_geolite2;
  2. regola xt_geoip_build.

Nel primo caso riduciamo printf nel formato richiesto e nel secondo modifichiamo l'assegnazione alla variabile $cc su $riga->[4]. Dopodiché puoi costruire:

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

. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW

Da notare che l'autore GeoLite2xtabelle non considera le sue sceneggiature pronte per la produzione e le offerte seguire per lo sviluppo di script originali xt_geoip_*. Passiamo quindi all'assemblaggio dai codici sorgente, in cui questi script sono già stati aggiornati.

Versione sorgente

Durante l'installazione da script di codice sorgente xt_geoip_* si trovano nel catalogo /usr/local/libexec/xtables-addons. Questa versione dello script utilizza un database IP a Paese Lite. La licenza è Creative Commons Attribution License, e dai dati disponibili ci sono le tre colonne assolutamente necessarie. Scarica e assembla il database:

cd /usr/share/xt_geoip/

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

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

Dopo questi passaggi, iptables è pronto per funzionare.

Utilizzo di geoip in iptables

modulo xt_geoip aggiunge solo due chiavi:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.

I metodi per creare regole per iptables, in generale, rimangono invariati. Per utilizzare le chiavi di moduli aggiuntivi, è necessario specificare esplicitamente il nome del modulo con l'opzione -m. Ad esempio una regola per bloccare le connessioni TCP in entrata sulla porta 443 non dagli USA 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 durante la creazione delle regole, ma non vengono presi in considerazione durante il filtraggio. Pertanto, per aggiornare correttamente il database geoip, è necessario prima aggiornare i file iv* e quindi ricreare tutte le regole che utilizzano geoip in iptables.

conclusione

Filtrare i pacchetti in base ai paesi è una strategia un po’ dimenticata dal tempo. Nonostante ciò, si stanno sviluppando strumenti software per tale filtraggio e, forse, presto 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: filtra i pacchetti per paese

Solo gli utenti registrati possono partecipare al sondaggio. AccediPer favore.

Hai mai utilizzato il filtraggio per paese?

  • 59,1%Sì13

  • 40,9%No9

22 utenti hanno votato. 3 utenti si sono astenuti.

Fonte: habr.com

Aggiungi un commento