xtables-addons: filter pakketten op land

xtables-addons: filter pakketten op land
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 xtables-add-ons. xtables-addons installeert extensies voor iptables als onafhankelijke kernelmodules, dus het is niet nodig om de OS-kernel opnieuw te compileren.

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 Creative Commons ASA 4.0 door het bedrijf MaxMind. Er gebeurden twee gebeurtenissen tegelijk met dit product die de compatibiliteit met de iptables-extensie “verbraken”.

Ten eerste in januari 2018 bekend gemaakt over de beëindiging van de ondersteuning voor het product en op 2019 januari 2 werden alle links naar het downloaden van de oude versie van de database verwijderd van de officiële website. Nieuwe gebruikers wordt aangeraden het GeoLite2-product of de betaalde versie GeoIPXNUMX te gebruiken.

Ten tweede sinds december 2019 MaxMind hij verklaarde over een aanzienlijke verandering in de toegang tot hun databases. Om te voldoen aan de California Consumer Privacy Act, heeft MaxMind besloten de distributie van GeoLite2 te "dekken" met registratie.

Omdat we hun product willen gebruiken, zullen we ons op deze pagina registreren.

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

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

  1. bewerking 20_convert_geoliet2;
  2. bewerking xt_geoip_build.

In het eerste geval verminderen we printf naar het vereiste formaat, en in het tweede geval veranderen we de toewijzing aan de variabele $ cc op $rij->[4]. Hierna kun je bouwen:

/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 GeoLite2xtabellen beschouwt zijn scripts niet als gereed voor productie en aanbiedingen volgen voor de ontwikkeling van originele xt_geoip_*-scripts. Laten we daarom verder gaan met de assemblage van broncodes, waarin deze scripts al zijn bijgewerkt.

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 IP naar Country Lite. De licentie is een Creative Commons Attribution License en op basis van de beschikbare gegevens zijn er de broodnodige drie kolommen. Download en verzamel de 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.

xtables-addons: filter pakketten op land

Alleen geregistreerde gebruikers kunnen deelnemen aan het onderzoek. Inloggen, Alsjeblieft.

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

Voeg een reactie