
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 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-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 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./configuremakeE installiamo con i diritti di superutente:
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 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 trovataQuesta 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/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
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
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. Chiederemo al sistema di creare una mappa delle dipendenze tenendo conto del nuovo modulo, e poi lo caricheremo:
depmod -amodprobe xt_geoipVerifichiamo 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 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_geoipAll'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 dall'azienda . Con questo prodotto si sono verificati due eventi che hanno "interrotto" la compatibilità con l'estensione per iptables.
In primo luogo, a gennaio 2018 è 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 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.

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.

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.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installDopo, cloniamo il repository con gli script e registriamo il codice di licenza precedentemente ottenuto:
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 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:
- modificare 20_convert_geolite2;
- modificare xt_geoip_build.
Nel primo caso riduciamo 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 ZWSi noti che l'autore non considera i propri script pronti per la produzione e suggerisce 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 . 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_buildDopo 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 DROPI 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.
Solo gli utenti registrati possono partecipare al sondaggio. , 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
