De taak om verkeer uit bepaalde landen te blokkeren lijkt eenvoudig, maar de eerste indruk kan bedriegen. Vandaag vertellen we u hoe dit kan worden geïmplementeerd.
prehistorie
De resultaten van een Google-zoekopdracht over dit onderwerp zijn teleurstellend: de meeste oplossingen zijn al lang “verrot” en soms lijkt het erop dat dit onderwerp voor altijd in de kast ligt en in de vergetelheid is geraakt. We hebben veel oude platen doorzocht en zijn klaar om een moderne versie van de instructies te delen.
We raden u aan het hele artikel te lezen voordat u deze opdrachten uitvoert.
Voorbereiding van het besturingssysteem
Het filteren wordt geconfigureerd met behulp van het hulpprogramma iptables, waarvoor een extensie nodig is om met GeoIP-gegevens te werken. Deze extensie is te vinden in
Op het moment van schrijven is de huidige versie van xtables-addons 3.9. Er is echter slechts 20.04 te vinden in de standaard Ubuntu 3.8 LTS-repository's, en 18.04 in de Ubuntu 3.0-repository's. U kunt de extensie vanuit pakketbeheer installeren met de volgende opdracht:
apt install xtables-addons-common libtext-csv-xs-perl
Merk op dat er kleine maar belangrijke verschillen zijn tussen versie 3.9 en de huidige status van het project, die we later zullen bespreken. Om vanuit de broncode te bouwen, installeert u alle benodigde pakketten:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl
Kloon de repository:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addons
xtables-addons bevat veel extensies, maar wij zijn alleen geïnteresseerd in xt_geoip. Als u geen onnodige extensies naar het systeem wilt slepen, kunt u ze uitsluiten van de build. Om dit te doen, moet u het bestand bewerken mconfig. Voor alle gewenste modules installeert u yen markeer alle onnodige n. We verzamelen:
./autogen.sh
./configure
make
En installeer met superuser-rechten:
make install
Tijdens de installatie van kernelmodules kan een fout optreden die lijkt op de volgende:
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
Deze situatie ontstaat vanwege de onmogelijkheid om kernelmodules te ondertekenen, omdat niets te ondertekenen. Je kunt dit probleem oplossen met een paar commando's:
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
De gecompileerde kernelmodule is geïnstalleerd, maar het systeem detecteert deze niet. Laten we het systeem vragen een afhankelijkheidskaart te maken, rekening houdend met de nieuwe module, en deze vervolgens laden:
depmod -a
modprobe xt_geoip
Laten we ervoor zorgen dat xt_geoip in het systeem wordt geladen:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tables
Zorg er bovendien voor dat de extensie in iptables is geladen:
# cat /proc/net/ip_tables_matches
geoip
icmp
We zijn blij met alles en het enige dat overblijft is het toevoegen van de modulenaam / etc / moduleszodat de module werkt na het opnieuw opstarten van het besturingssysteem. Vanaf nu begrijpt iptables geoip-opdrachten, maar beschikt het niet over voldoende gegevens om mee te werken. Laten we beginnen met het laden van de geoip-database.
De GeoIP-database ophalen
We maken een map waarin informatie wordt opgeslagen die begrijpelijk is voor de iptables-extensie:
mkdir /usr/share/xt_geoip
Aan het begin van het artikel hebben we vermeld dat er verschillen zijn tussen de versie uit de broncode en de versie uit de pakketbeheerder. Het meest opvallende verschil is de verandering in databaseprovider en script xt_geoip_dl, waarmee de nieuwste gegevens worden gedownload.
Pakketbeheerversie
Het script bevindt zich in het pad /usr/lib/xtables-addons, maar wanneer u het probeert uit te voeren, ziet u een niet erg informatieve fout:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.
Voorheen werd het GeoLite-product, nu bekend als GeoLite Legacy, onder licentie gedistribueerd, gebruikt als database
Ten eerste in januari 2018
Ten tweede sinds december 2019 MaxMind
Omdat we hun product willen gebruiken, zullen we ons op deze pagina registreren.
U ontvangt dan een e-mail waarin u wordt gevraagd een wachtwoord in te stellen. Nu we een account hebben aangemaakt, moeten we een licentiesleutel aanmaken. In uw persoonlijke account vinden wij het artikel Mijn licentiesleutelsen klik vervolgens op de knop Genereer een nieuwe licentiesleutel.
Bij het aanmaken van een sleutel wordt ons slechts één vraag gesteld: zullen we deze sleutel gebruiken in het GeoIP Update-programma? Wij antwoorden ontkennend en drukken op de knop Bevestigen. De sleutel wordt weergegeven in een pop-upvenster. Bewaar deze sleutel op een veilige plaats. Zodra u het pop-upvenster sluit, kunt u niet meer de hele sleutel bekijken.
We hebben de mogelijkheid om GeoLite2-databases handmatig te downloaden, maar hun formaat is niet compatibel met het formaat dat wordt verwacht door het xt_geoip_build-script. Dit is waar GeoLite2xtables-scripts te hulp komen. Om scripts uit te voeren, installeert u de NetAddr::IP perl-module:
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
Vervolgens klonen we de repository met scripts en schrijven we de eerder verkregen licentiesleutel naar een bestand:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license
Laten we de scripts uitvoeren:
# Скачиваем данные 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 legt een limiet op van 2000 downloads per dag en biedt, bij een groot aantal servers, aan om de update op een proxyserver te cachen.
Houd er rekening mee dat het uitvoerbestand moet worden aangeroepen dbip-country-lite.csv... Helaas, 20_convert_geoliet2 levert geen perfect bestand op. Script xt_geoip_build verwacht drie kolommen:
- begin van adresbereik;
- einde van adresbereik;
- landcode in iso-3166-alpha2.
En het uitvoerbestand bevat zes kolommen:
- begin van adresbereik (stringweergave);
- einde van adresbereik (stringrepresentatie);
- begin van adresbereik (numerieke weergave);
- einde van adresbereik (numerieke weergave);
- code van het land;
- de naam van het land.
Deze discrepantie is van cruciaal belang en kan op twee manieren worden gecorrigeerd:
- bewerking 20_convert_geoliet2;
- bewerking xt_geoip_build.
In het eerste geval verminderen we
/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
Merk op dat de auteur
Bronversie
Bij installatie vanuit broncodescripts xt_geoip_* bevinden zich in de catalogus /usr/local/libexec/xtables-addons. Deze versie van het script maakt gebruik van een database
cd /usr/share/xt_geoip/
/usr/local/libexec/xtables-addons/xt_geoip_dl
/usr/local/libexec/xtables-addons/xt_geoip_build
Na deze stappen is iptables klaar voor gebruik.
GeoIP gebruiken in iptables
Module xt_geoip voegt slechts twee sleutels toe:
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.
De methoden voor het maken van regels voor iptables blijven over het algemeen ongewijzigd. Om sleutels van aanvullende modules te gebruiken, moet u expliciet de naam van de module opgeven met de schakeloptie -m. Bijvoorbeeld een regel om inkomende TCP-verbindingen op poort 443, niet vanuit de VS, op alle interfaces te blokkeren:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
Bestanden gemaakt door xt_geoip_build worden alleen gebruikt bij het maken van regels, maar er wordt geen rekening mee gehouden bij het filteren. Om de geoip-database correct bij te werken, moet u dus eerst de iv*-bestanden bijwerken en vervolgens alle regels die geoip gebruiken in iptables opnieuw aanmaken.
Conclusie
Het filteren van pakketten op basis van landen is een strategie die door de tijd enigszins is vergeten. Desondanks worden er softwaretools voor dergelijke filtering ontwikkeld en misschien zal er binnenkort een nieuwe versie van xt_geoip met een nieuwe geoip-gegevensprovider verschijnen in pakketbeheerders, wat het leven van systeembeheerders aanzienlijk zal vereenvoudigen.
Alleen geregistreerde gebruikers kunnen deelnemen aan het onderzoek.
Heeft u ooit filteren op land gebruikt?
-
59,1%Ja13
-
40,9%Geen9
22 gebruikers hebben gestemd. 3 gebruikers onthielden zich van stemming.
Bron: www.habr.com