
De taak om verkeer uit bepaalde landen te blokkeren lijkt eenvoudig, maar de eerste indruk is misleidend. Vandaag vertellen we hoe dit gerealiseerd kan worden.
Achtergrond
De zoekresultaten op Google over dit onderwerp zijn teleurstellend: de meeste oplossingen zijn verouderd en het lijkt soms wel alsof dit onderwerp in de vergetelheid is geraakt. Wij hebben echter veel oude artikelen doorzocht en zijn klaar om een moderne versie van de instructie te delen.
We raden aan om het artikel volledig te lezen, voordat je de opgegeven commando's uitvoert.
Voorbereiding van het besturingssysteem
De filtering zal worden ingesteld met behulp van een hulpprogramma iptables, waarvoor een extensie nodig is om met GeoIP-gegevens te werken. Deze extensie is te vinden in . xtables-addons installeert extensies voor iptables als zelfstandige kernelmodules, waardoor het niet nodig is om de kernel van het besturingssysteem opnieuw te compileren.
Op het moment van schrijven is de actuele versie van xtables-addons – 3.9. Desondanks is in de standaardrepositories van Ubuntu 20.04 LTS alleen 3.8 beschikbaar, en in de repositories van Ubuntu 18.04 - 3.0. De extensie kan met de volgende opdracht uit de pakketbeheerder worden geïnstalleerd:
apt install xtables-addons-common libtext-csv-xs-perlWe merken op dat er tussen versie 3.9 en de huidige staat van het project kleine, maar belangrijke verschillen zijn, waar we later op terug zullen komen. Voor het bouwen uit de broncode installeren we alle benodigde pakketten:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perlWe klonen de repository:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsxtables-addons bevat veel extensies, maar wij zijn alleen geïnteresseerd in xt_geoip. Als je niet onnodige extensies in je systeem wilt installeren, kunnen ze uit de build worden uitgesloten. Dit kan door het bestand mconfigte bewerken. Voor alle gewenste modules zet je y, en markeer alle onnodige modules n. We bouwen:
./autogen.sh./configuremakeEn installeren met superuserrechten:
make installTijdens het installeren van de kernelmodules kan een fout zoals onderstaande optreden:
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 directoryDeze situatie ontstaat doordat de kernelmodules niet kunnen worden ondertekend, omdat er niets is om te ondertekenen. Dit probleem kan worden opgelost met een paar opdrachten:
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 = Modules
[ 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.pemDe gecompileerde kernelmodule is geïnstalleerd, maar het systeem herkent deze niet. Laten we het systeem vragen om een afhankelijkheidskaart te maken met inachtneming van de nieuwe module en deze vervolgens laden:
depmod -amodprobe xt_geoipLaten we controleren of xt_geoip in het systeem is geladen:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tablesLaten we ook controleren of de extensie is geladen in iptables:
# cat /proc/net/ip_tables_matches
geoip
icmpWe zijn volledig tevreden en hoeven alleen maar de naam van de module toe te voegen aan /etc/modules, zodat de module werkt na het opnieuw opstarten van het besturingssysteem. Vanaf dat moment begrijpt iptables de geoip-commando's, maar heeft het informatie nodig om te kunnen werken. Laten we beginnen met het laden van de geoip-database.
Het verkrijgen van de GeoIP-database
Laten we een map aanmaken waarin de gegevens worden opgeslagen die begrijpelijk zijn voor de iptables-extensie:
mkdir /usr/share/xt_geoipAan het begin van het artikel hebben we genoemd dat er verschillen zijn tussen de versie uit de source code en de versie van de pakketmanager. Het meest opvallende verschil is de wijziging van de databron en het script xt_geoip_dl, dat de actuele gegevens downloadt.
De versie van de pakketmanager
Het script bevindt zich op het pad /usr/lib/xtables-addons, maar bij het proberen uit te voeren kan je een niet zo informatieve foutmelding zien:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.Eerder werd het product GeoLite als database gebruikt, nu bekend als GeoLite Legacy, dat onder de licentie wordt verspreid door het bedrijf . Met dit product zijn er meteen twee gebeurtenissen gebeurd die de compatibiliteit met de extensie voor iptables "gebroken" hebben.
Ten eerste, in januari 2018 over het stopzetten van de ondersteuning van het product, en op 2 januari 2019 zijn alle downloadlinks voor de oude versie van de database van de officiële website verwijderd. Nieuwe gebruikers wordt aangeraden om het product GeoLite2 of de betaalde versie GeoIP2 te gebruiken.
Ten tweede, sinds december 2019 heeft MaxMind over een aanzienlijke wijziging in de toegang tot hun databases. Om te voldoen aan de Californische consumentenbeschermingswet heeft het bedrijf MaxMind besloten om de distributie van GeoLite2 te beperken tot registratie.
Aangezien we gebruik willen maken van hun product, laten we ons registreren op deze pagina.

Na uw e-mail ontvangt u een bericht met het verzoek om een wachtwoord in te stellen. Nu we een account hebben aangemaakt, moeten we een licentie sleutel genereren. In het persoonlijke dashboard zoeken we naar het item Mijn Licentiesleutels, en klik vervolgens op de knop Genereer nieuwe Licentiesleutel.
Bij het aanmaken van de sleutel krijgen we slechts één vraag: zullen we deze sleutel gebruiken in het programma GeoIP Update? We antwoorden negatief en drukken op de knop Bevestig. In het pop-up venster wordt de sleutel weergegeven. Bewaar deze sleutel op een veilige plek, want na het sluiten van het pop-up venster kunt u de sleutel niet meer volledig bekijken.

We hebben de mogelijkheid om GeoLite2-databases handmatig te downloaden, maar hun formaat is niet compatibel met het formaat dat het script xt_geoip_build verwacht. Hier komen de GeoLite2xtables-scripts van pas. Om de scripts te laten werken, installeren we de Perl-module 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 installVervolgens klonen we de repository met de scripts en schrijven we de eerder verkregen licentiesleutel in een bestand:
git clone https://github.com/mschmitt/GeoLite2xtables.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY='123ertyui123' > geolite2.licenseWe starten de scripts:
# Скачиваем данные 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 legt een limiet op van 2000 downloads per dag en biedt bij een groot aantal servers aan om de updates op een proxyserver te cachen.
Let op dat het uitvoerbestand verplicht moet heten dbip-country-lite.csv. Helaas, 20_convert_geolite2 geeft geen perfect bestand. Het script xt_geoip_build verwacht drie kolommen:
- begin van het ip-adresbereik;
- eind van het ip-adresbereik;
- landcode in iso-3166-alpha2.
Het uitvoerbestand bevat echter zes kolommen:
- begin van het ip-adresbereik (stringrepresentatie);
- eind van het ip-adresbereik (stringrepresentatie);
- begin van het ip-adresbereik (numerieke representatie);
- eind van het ip-adresbereik (numerieke representatie);
- landcode;
- landnaam.
Deze discrepantie is kritisch en kan op een van de twee manieren worden opgelost:
- bewerk 20_convert_geolite2;
- bewerk xt_geoip_build.
In de eerste geval verkorten we tot het juiste formaat, en in de tweede — veranderen we de toewijzing van de variabele $cc en een werkende opdracht krijgen. $row->[4]. Daarna kunnen we de build uitvoeren:
/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip. . .
2239 IPv4-bereiken voor ZA
348 IPv6-bereiken voor ZA
56 IPv4-bereiken voor ZM
12 IPv6-bereiken voor ZM
56 IPv4-bereiken voor ZW
15 IPv6-bereiken voor ZWLaten we opmerken dat de auteur zijn scripts niet als productieklare versies beschouwt en aanbeveelt voor de ontwikkeling van originele scripts xt_geoip_*. Laten we overgaan naar de compilatie uit de broncodes, waarin deze scripts al zijn bijgewerkt.
Versie uit broncodes
Bij installatie vanuit broncodes worden de scripts xt_geoip_* geplaatst in de map /usr/local/libexec/xtables-addons. In deze versie van het script wordt een database gebruikt . Licentie — Creative Commons Attribution License, en uit de beschikbare gegevens zijn die drie noodzakelijke kolommen. Downloaden en de database samenstellen:
cd /usr/share/xt_geoip//usr/local/libexec/xtables-addons/xt_geoip_dl/usr/local/libexec/xtables-addons/xt_geoip_buildNa deze handelingen is iptables klaar voor gebruik.
Gebruik geoip in iptables
Module xt_geoip voegt slechts twee parameters toe:
geoip match opties:
[!] --src-cc, --source-country country[,country...]
Match pakketten komende van (een van) de gespecificeerde landen
[!] --dst-cc, --destination-country country[,country...]
Match pakketten die gaan naar (een van) de gespecificeerde landen
OPMERKING: Het land wordt ingevoerd met zijn ISO3166-code.De manieren om regels voor iptables op te stellen blijven over het algemeen ongewijzigd. Om parameters uit extra modules te gebruiken, moet u de naam van de module expliciet opgeven met de optie -m. Bijvoorbeeld, de regel voor het blokkeren van binnenkomende TCP-verbindingen op poort 443 niet uit de VS op alle interfaces:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROPBestanden, gemaakt met xt_geoip_build, worden alleen gebruikt bij het opstellen van regels, maar worden niet meegenomen bij filtering. Het is dus nodig om eerst de iv*-bestanden bij te werken voordat u alle regels die geoip in iptables gebruiken opnieuw kunt aanmaken.
Conclusie
Pakketfiltering op basis van land is een strategie die in de loop der tijd enigszins vergeten is. Desondanks blijven softwaretools voor deze filtering zich ontwikkelen en misschien komt er binnenkort een nieuwe versie van xt_geoip met een nieuwe leverancier van geoip-gegevens in de pakketbeheerders, wat het leven van systeembeheerders aanzienlijk zal vergemakkelijken.
Alleen geregistreerde gebruikers kunnen deelnemen aan de enquête. , alstublieft.
Heeft u ooit filtering op basis van land gebruikt?
59,1%Ja13
40,9%Nee9
22 gebruikers hebben gestemd. 3 gebruikers hebben zich onthouden.
Bron: habr.com
