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
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
Innanzitutto nel gennaio 2018
In secondo luogo, da dicembre 2019 MaxMind
Poiché desideriamo utilizzare il loro prodotto, ci registreremo su questa pagina.
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.
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:
- regola 20_convert_geolite2;
- regola xt_geoip_build.
Nel primo caso riduciamo
/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
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
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.
Solo gli utenti registrati possono partecipare al sondaggio.
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