
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 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-perlCloniamo il repository:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsxtables-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./configuremakeE installiamo con i diritti di superuser:
make installDurante 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 esistenteQuesta 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/certscat < 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
EOFopenssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pemIl 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 -amodprobe xt_geoipAssicuriamoci che xt_geoip sia stato caricato nel sistema:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tablesInoltre, verifichiamo che l'estensione sia stata caricata in iptables:
# cat /proc/net/ip_tables_matches
geoip
icmpSiamo 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_geoipAll'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 dalla società . Con questo prodotto si sono verificati due eventi che hanno "rotto" la compatibilità con l'estensione per iptables.
In primo luogo, nel gennaio 2018 è 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 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.

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.

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.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installSuccessivamente, cloniamo il repository con gli script e scriviamo nel file la chiave di licenza ottenuta in precedenza:
git clone https://github.com/mschmitt/GeoLite2xtables.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY=’123ertyui123' > geolite2.licenseAvviamo 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.csvMaxMind 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:
- modificando 20_convert_geolite2;
- modificando xt_geoip_build.
Nel primo caso accorciamo 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 ZWVa notato che l'autore non considera i suoi script pronti per la produzione e consiglia 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 . 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_buildDopo 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 DROPI 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.
Solo gli utenti registrati possono partecipare al sondaggio. , 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
