xtables-addons: pakketten filteren op land.

xtables-addons: pakketten filteren op land.
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. 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-perl

We 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-perl

We klonen 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 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

./configure

make

En installeren met superuserrechten:

make install

Tijdens 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 directory

Deze 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/certs

cat < 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 herkent deze niet. Laten we het systeem vragen om een afhankelijkheidskaart te maken met inachtneming van de nieuwe module en deze vervolgens laden:

depmod -a

modprobe xt_geoip

Laten 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_tables

Laten we ook controleren of de extensie is geladen in iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

We 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_geoip

Aan 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 Creative Commons ASA 4.0 door het bedrijf MaxMind. Met dit product zijn er meteen twee gebeurtenissen gebeurd die de compatibiliteit met de extensie voor iptables "gebroken" hebben.

Ten eerste, in januari 2018 de aanvang aan van de distributie van het laatste blok /8. Vanaf dat moment kon elke klant van de registrar slechts 1024 adressen verkrijgen, wat de uitputting van de voorraad enigszins vertraagde. Maar in 2015 had RIPE nog 16 miljoen beschikbare IP-adressen, en in de zomer van 2019 was dit aantal gedaald 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 verklapte 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.

xtables-addons: pakketten filteren op land.
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.

xtables-addons: pakketten filteren op land.
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.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 de scripts en schrijven we de eerder verkregen licentiesleutel in een bestand:

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

We 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.csv

MaxMind 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:

  1. bewerk 20_convert_geolite2;
  2. bewerk xt_geoip_build.

In de eerste geval verkorten we printf 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 ZW

Laten we opmerken dat de auteur GeoLite2xtables zijn scripts niet als productieklare versies beschouwt en aanbeveelt toezicht houden 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 IP to Country Lite. 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_build

Na 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 DROP

Bestanden, 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.

xtables-addons: pakketten filteren op land.

Alleen geregistreerde gebruikers kunnen deelnemen aan de enquête. Log in, 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

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster