xtables-addons: Pakete nach Ländern filtern

xtables-addons: Pakete nach Ländern filtern
Die Aufgabe, den Datenverkehr aus bestimmten Ländern zu blockieren, scheint einfach zu sein, aber der erste Eindruck täuscht. Heute zeigen wir Ihnen, wie das realisiert werden kann.

Hintergrund

Die Google-Suchergebnisse zu diesem Thema sind enttäuschend: Die meisten Lösungen sind längst "veraltet" und manchmal hat man das Gefühl, dass dieses Thema auf die lange Bank geschoben und für immer vergessen wurde. Wir haben jedoch viele alte Aufzeichnungen durchforstet und sind bereit, eine moderne Version der Anleitung zu teilen.

Wir empfehlen, den Artikel vollständig zu lesen, bevor Sie die angegebenen Befehle ausführen.

Vorbereitung des Betriebssystems

Die Filterung wird mit einem Dienstprogramm konfiguriert iptables, das eine Erweiterung benötigt, um mit GeoIP-Daten zu arbeiten. Eine solche Erweiterung finden Sie in xtables-addons. xtables-addons installiert Erweiterungen für iptables als eigenständige Kernelmodule, sodass das Betriebssystem-Kernel nicht neu kompiliert werden muss.

Zum Zeitpunkt des Verfassens des Artikels ist die aktuelle Version von xtables-addons – 3.9. In den Standard-Repositories von Ubuntu 20.04 LTS ist jedoch nur 3.8 zu finden, während in den Repositories von Ubuntu 18.04 nur 3.0 verfügbar ist. Die Erweiterung kann mit dem folgenden Befehl aus dem Paketmanager installiert werden:

apt install xtables-addons-common libtext-csv-xs-perl

Es gibt einige kleine, aber wichtige Unterschiede zwischen Version 3.9 und dem aktuellen Stand des Projekts, die wir später besprechen werden. Für die Kompilierung aus dem Quellcode installieren wir alle notwendigen Pakete:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Wir klonen das Repository:

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

xtables-addons enthält viele Erweiterungen, aber uns interessiert nur xt_geoip. Wenn Sie unerwünschte Erweiterungen nicht ins System bringen möchten, können Sie diese aus dem Build ausschließen. Dazu müssen Sie die Datei mconfig. Für alle gewünschten Module setzen Sie y, und alle unnötigen markieren Sie n. Jetzt bauen wir:

./autogen.sh

./configure

make

Und installieren Sie mit Superuser-Rechten:

make install

Während der Installation der Kernelmodule kann eine Fehlermeldung wie die folgende auftreten:

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

Diese Situation tritt auf, weil es nicht möglich ist, die Kernelmodule zu signieren, da kein geeignetes Zertifikat vorhanden ist. Dieses Problem kann mit ein paar Befehlen gelöst werden:

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

Das kompilierte Kernelmodul ist installiert, wird aber vom System nicht erkannt. Lassen Sie uns das System eine Abhängigkeitskarte unter Berücksichtigung des neuen Moduls erstellen und es dann laden:

depmod -a

modprobe xt_geoip

Überprüfen wir, ob xt_geoip im System geladen ist:

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

Stellen wir zusätzlich sicher, dass die Erweiterung in iptables geladen wurde:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Alles sieht gut aus; wir müssen nur noch den Modulenamen hinzufügen /etc/modules, damit das Modul nach dem Neustart des Betriebssystems aktiv ist. Ab diesem Zeitpunkt versteht iptables die geoip-Befehle, aber es fehlen noch die notwendigen Daten. Lassen Sie uns die geoip-Datenbank laden.

Laden der GeoIP-Datenbank

Erstellen Sie ein Verzeichnis, in dem die Informationen gespeichert werden, die für die iptables-Erweiterung verständlich sind:

mkdir /usr/share/xt_geoip

Zu Beginn des Artikels haben wir erwähnt, dass es Unterschiede zwischen der Quellcode-Version und der Version aus dem Paketmanager gibt. Der auffälligste Unterschied liegt im Wechsel des Datenbankanbieters und im Skript xt_geoip_dl, das aktuelle Daten herunterlädt.

Die Version aus dem Paketmanager

Das Skript befindet sich im Verzeichnis /usr/lib/xtables-addons, jedoch sieht man beim Versuch, es auszuführen, eine wenig aussagekräftige Fehlermeldung:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

Früher wurde als Datenbank das Produkt GeoLite verwendet, das nun als GeoLite Legacy bekannt ist und unter der Lizenz Creative Commons ASA 4.0 von der Firma MaxMindvertrieben wird. Mit diesem Produkt geschahen zwei Ereignisse, die die Kompatibilität mit der Erweiterung für iptables "zerstörten".

Erstens wurde im Januar 2018 haben bekannt gegeben die Unterstützung für das Produkt eingestellt, und am zweiten Januar 2019 wurden alle Download-Links zur alten Version von der offiziellen Webseite entfernt. Neuen Nutzern wird empfohlen, das Produkt GeoLite2 oder dessen kostenpflichtige Version GeoIP2 zu verwenden.

Zweitens hat MaxMind seit Dezember 2019 gab bekannt auf eine wesentliche Änderung im Zugang zu ihren Datenbanken. Um dem kalifornischen Verbraucherschutzgesetz zu entsprechen, hat MaxMind beschlossen, die Verbreitung von GeoLite2 einzuschränken.

Da wir ihr Produkt nutzen möchten, registrieren wir uns auf dieser Seite.

xtables-addons: Pakete nach Ländern filtern
Nach der Registrierung erhalten Sie eine E-Mail mit der Aufforderung, ein Passwort festzulegen. Jetzt, da wir ein Konto haben, müssen wir einen Lizenzschlüssel erstellen. Im Benutzerbereich finden wir den Punkt My License Keys, und klicken dann auf den Button Generate new License Key.

Bei der Erstellung des Schlüssels wird uns nur eine Frage gestellt: Werden wir diesen Schlüssel im Programm GeoIP Update verwenden? Wir antworten mit 'Nein' und klicken auf den Button Bestätigen. In dem Popup-Fenster wird der Schlüssel angezeigt. Bewahren Sie diesen Schlüssel an einem sicheren Ort auf, da Sie ihn nach dem Schließen des Popup-Fensters nicht mehr vollständig einsehen können.

xtables-addons: Pakete nach Ländern filtern
Wir haben die Möglichkeit, die GeoLite2-Datenbanken manuell herunterzuladen, aber ihr Format ist nicht mit dem Format kompatibel, das das Skript xt_geoip_build erwartet. Hier kommen die Skripte GeoLite2xtables ins Spiel. Um die Skripte auszuführen, installieren wir das Perl-Modul 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

Als Nächstes klonen wir das Repository mit den Skripten und schreiben den zuvor erhaltenen Lizenzschlüssel in eine Datei:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

Wir starten die Skripte:

# Скачиваем данные 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 eine Beschränkung von 2000 Downloads pro Tag fest und empfiehlt beim Einsatz vieler Server, die Aktualisierung auf einem Proxy-Server zwischenzuspeichern.

Bitte beachten Sie, dass die Ausgabedatei unbedingt den Namen dbip-country-lite.csvtragen muss. Leider 20_convert_geolite2 liefert nicht die perfekte Datei. Das Skript xt_geoip_build erwartet drei Spalten:

  • Anfang des Adressbereichs;
  • Ende des Adressbereichs;
  • Ländercode im iso-3166-alpha2-Format.

Die Ausgabedatei enthält jedoch sechs Spalten:

  • Anfang des Adressbereichs (String-Darstellung);
  • Ende des Adressbereichs (String-Darstellung);
  • Anfang des Adressbereichs (numerische Darstellung);
  • Ende des Adressbereichs (numerische Darstellung);
  • Ländercode;
  • Landname.

Diese Diskrepanz ist kritisch und kann auf zwei Arten behoben werden:

  1. bearbeiten 20_convert_geolite2;
  2. bearbeiten xt_geoip_build.

Im ersten Fall reduzieren wir printf auf das benötigte Format, im zweiten Fall ändern wir die Zuordnung der Variablen $cc findet man $row->[4]. Danach können Sie mit dem Zusammenbau beginnen:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 IPv4-Bereiche für ZA
 348 IPv6-Bereiche für ZA
 56 IPv4-Bereiche für ZM
 12 IPv6-Bereiche für ZM
 56 IPv4-Bereiche für ZW
 15 IPv6-Bereiche für ZW

Es ist erwähnenswert, dass der Autor GeoLite2xtables seine Skripte nicht für die Produktion bereit hält und empfiehlt seine Entwicklung. Besonders interessant fanden wir das Thema der Interaktion zwischen Kafka und bei der Entwicklung der Originalskripte xt_geoip_*. Daher gehen wir zu dem Zusammenbau aus dem Quellcode über, in dem diese Skripte bereits aktualisiert wurden.

Die Version aus dem Quellcode

Bei der Installation aus den Quellcodes befinden sich die Skripte xt_geoip_* im Verzeichnis /usr/local/libexec/xtables-addons. In dieser Version des Skripts wird die Datenbank IP to Country Lite. Lizenz — Creative Commons Attribution License, und aus den verfügbaren Daten sind genau die drei erforderlichen Spalten enthalten. Laden Sie die Datenbank herunter und stellen Sie sie zusammen:

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

Nach diesen Schritten ist iptables betriebsbereit.

Verwendung von geoip in iptables

Modul xt_geoip fügt lediglich zwei Optionen hinzu:

geoip-Match-Optionen:
[!] --src-cc, --source-country land[,länder...]
	Paket, das von dem(bis zu einem) angegebenen Land(en) kommt, abgleichen
[!] --dst-cc, --destination-country land[,länder...]
	Paket, das zu dem(bis zu einem) angegebenen Land(en) geht, abgleichen

HINWEIS: Das Land wird durch seinen ISO3166-Code eingegeben.

Die Methoden zur Regelbildung für iptables bleiben grundsätzlich unverändert. Um Schlüssel aus zusätzlichen Modulen zu verwenden, muss der Modulname mit dem Schlüssel -m eindeutig angegeben werden. Zum Beispiel die Regel zur Blockierung eingehender TCP-Verbindungen an Port 443, die nicht aus den USA stammen, auf allen Schnittstellen:

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

Die von xt_geoip_build erstellten Dateien werden nur zur Erstellung von Regeln verwendet, nicht jedoch bei der Filterung berücksichtigt. Daher ist es für ein korrektes Update der geoip-Datenbank erforderlich, zuerst die iv*-Dateien zu aktualisieren und dann alle Regeln neu zu erstellen, die geoip in iptables verwenden.

Fazit

Die Paketfilterung nach Länderzugehörigkeit ist eine etwas in Vergessenheit geratene Strategie. Trotzdem entwickeln sich Softwarelösungen für eine solche Filterung weiter, und möglicherweise wird in naher Zukunft eine neue Version von xt_geoip mit einem neuen Anbieter von geoip-Daten in den Paketmanagern verfügbar sein, was das Leben von Systemadministratoren erheblich erleichtern wird.

xtables-addons: Pakete nach Ländern filtern

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte melden Sie sich an.Sind Sie an Contour interessiert?

Hatten Sie schon einmal die Notwendigkeit, eine länderspezifische Filterung zu verwenden?

  • 59,1%Ja13

  • 40,9%Nein9

22 Benutzer haben abgestimmt. 3 Benutzer haben sich enthalten.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster