xtables-addons: Pakete nach Ländern filtern

xtables-addons: Pakete nach Ländern filtern
Die Aufgabe der Verkehrsblockierung aus bestimmten Ländern scheint einfach zu sein, aber der erste Eindruck trügt. Heute erzählen wir, wie das realisiert werden kann.

Vorgeschichte

Die Suchergebnisse bei Google zu diesem Thema sind enttäuschend: Die meisten Lösungen sind längst "veraltet" und manchmal hat man das Gefühl, dieses Thema wurde auf die lange Bank geschoben und für immer vergessen. Wir haben viele alte Beiträge 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 dem Tool iptableskonfiguriert, das ein Erweiterung für die Arbeit mit GeoIP-Daten benötigt. Eine solche Erweiterung findet man in xtables-addons. xtables-addons installiert Erweiterungen für iptables in Form eigenständiger Kernelmodule, wodurch eine Neukompilierung des Kernel nicht erforderlich ist.

Zum Zeitpunkt der Erstellung dieses Artikels ist die aktuelle Version von xtables-addons - 3.9. Dennoch findet man in den Standard-Repositories von Ubuntu 20.04 LTS nur 3.8 und in den Repositories von Ubuntu 18.04 - 3.0. Die Erweiterung aus dem Paketmanager kann mit folgendem Befehl installiert werden:

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

Es sei angemerkt, dass zwischen Version 3.9 und dem aktuellen Stand des Projekts kleine, aber wichtige Unterschiede bestehen, über die wir später sprechen werden. Um aus dem Quellcode zu kompilieren, 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 unnötige Erweiterungen nicht ins System ziehen möchten, können Sie diese von der Kompilierung ausschließen. Dazu muss die Datei mconfigbearbeitet werden. Für alle gewünschten Module setzen Sie y, und alle unnötigen markieren Sie n. Kompilieren wir:

./autogen.sh

./configure

make

Und installieren wir mit Superuser-Rechten:

make install

Während der Installation der Kernelmodule kann ein Fehler ungefähr folgender Art 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

Eine solche Situation entsteht, weil die Kernelmodule nicht signiert werden können, da es nichts gibt, um diese zu signieren. Diese Problematik lässt sich mit ein paar Befehlen lösen:

cd /lib/modules/(uname -r)/build/certs

cat < x509.genkey

[ req ]
widthen_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Module

[ myexts ]
basicConstraints=kritisch,CA:FALSCH
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 jedoch vom System nicht erkannt. Lassen Sie uns das System bitten, eine Abhängigkeitskarte unter Berücksichtigung des neuen Moduls zu erstellen und es dann zu laden:

depmod -a

modprobe xt_geoip

Lassen Sie uns sicherstellen, dass xt_geoip im System geladen ist:

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

Zusätzlich stellen wir sicher, dass die Erweiterung in iptables geladen wurde:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Uns gefällt alles und es bleibt nur, den Modulnamen hinzuzufügen /etc/modules, damit das Modul nach dem Neustart des Betriebssystems funktioniert. Ab diesem Zeitpunkt versteht iptables die geoip-Befehle, aber es fehlen die Daten für die Nutzung. Wir beginnen mit dem Laden der geoip-Datenbank.

Erhalt der GeoIP-Datenbank

Wir erstellen ein Verzeichnis, in dem die für die iptables-Erweiterung verständlichen Informationen gespeichert werden:

mkdir /usr/share/xt_geoip

Zu Beginn des Artikels erwähnten wir, dass es Unterschiede zwischen der Version aus dem Quellcode und der Version aus dem Paketmanager gibt. Der auffälligste Unterschied besteht darin, dass der Datenbankanbieter und das Skript gewechselt wurden xt_geoip_dl, das die aktuellen Daten herunterlädt.

Die Version aus dem Paketmanager

Das Skript befindet sich unter /usr/lib/xtables-addons, allerdings sieht man bei dem Versuch, es auszuführen, einen nicht besonders informativen Fehler:

# ./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 das Produkt GeoLite als Datenbank verwendet, das heute als GeoLite Legacy bekannt ist und unter der Lizenz Creative Commons ASA 4.0 von der Firma MaxMind. Mit diesem Produkt gab es gleich zwei Ereignisse, die die Kompatibilität mit der Erweiterung für iptables "gebrochen" haben.

Erstens gab es im Januar 2018 haben bekannt gegeben eine Ankündigung über die Einstellung der Unterstützung des Produkts, und am zweiten Januar 2019 wurden alle Links zum Herunterladen der alten Version von der offiziellen Website entfernt. Neuen Nutzern wird empfohlen, das Produkt GeoLite2 oder seine kostenpflichtige Version GeoIP2 zu verwenden.

Zweitens gab es ab Dezember 2019 eine bedeutende Änderung beim Zugang zu ihren Datenbanken. Um dem kalifornischen Gesetz zum Schutz der Verbraucherrechte zu entsprechen, entschied sich die Firma MaxMind, die Verbreitung von GeoLite2 durch Registrierung einzuschränken. hat erklärt Da wir ihr Produkt nutzen möchten, registrieren wir uns auf dieser Seite.

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 Bitte, ein Passwort festzulegen. Jetzt, da wir ein Konto eingerichtet haben, müssen wir einen Lizenzschlüssel erstellen. Im persönlichen Bereich finden wir den Punkt Meine Lizenzschlüssel, und dann klicken wir auf die Schaltfläche Neuen Lizenzschlüssel generieren.

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 die Schaltfläche Bestätigen. Im Popup-Fenster wird der Schlüssel angezeigt. Bewahren Sie diesen Schlüssel an einem sicheren Ort auf, da Sie nach dem Schließen des Popup-Fensters den Schlüssel nicht mehr vollständig anzeigen können.

xtables-addons: Pakete nach Ländern filtern
Wir haben die Möglichkeit, GeoLite2-Datenbanken manuell herunterzuladen, aber ihr Format ist nicht kompatibel mit dem Format, das das Skript xt_geoip_build erwartet. Hier kommen die Skripte GeoLite2xtables ins Spiel. Um die Skripte zu verwenden, 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 fügen den zuvor erhaltenen Lizenzschlüssel in die Datei ein:

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 begrenzt die Downloads auf 2000 pro Tag und bei einer großen Anzahl von Servern wird empfohlen, 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 erzeugt keine ideale Datei. Das Skript xt_geoip_build erwartet drei Spalten:

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

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;
  • Ländernamen.

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

  1. ändern 20_convert_geolite2;
  2. ändern xt_geoip_build.

Im ersten Fall reduzieren wir printf auf das erforderliche Format, und im zweiten Fall ändern wir die Zuweisung der Variablen $cc auf $row->[4]. Danach können wir mit dem Aufbau fortfahren:

/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 sei darauf hingewiesen, dass der Autor GeoLite2xtables seine Skripte nicht als produktionsbereit erachtet und vorschlägt und verfolgen für die Erstellung von originalen Skripten xt_geoip_*. Daher kommen wir zur Zusammenstellung aus dem Quellcode, in dem diese Skripte bereits aktualisiert wurden.

Version aus dem Quellcode

Bei der Installation aus dem Quellcode befinden sich die Skripte xt_geoip_* im Verzeichnis /usr/local/libexec/xtables-addons. In dieser Skriptversion wird eine Datenbank verwendet, die IP to Country Lite. Lizenz — Creative Commons Attribution License, und aus den verfügbaren Daten sind die drei benötigten Spalten. 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 bereit zur Nutzung.

Verwenden Sie geoip in iptables

Modul xt_geoip fügt insgesamt zwei Optionen hinzu:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Paket abgleichen, das aus (einem der) angegebenen Länder kommt
[!] --dst-cc, --destination-country country[,country...]
	Paket abgleichen, das in (ein eines der) angegebenen Länder geht

HINWEIS: Das Land wird mit seinem ISO3166-Code eingegeben.

Die Methoden zur Erstellung von Regeln für iptables bleiben im Allgemeinen unverändert. Um die Schlüssel aus zusätzlichen Modulen verwenden zu können, müssen Sie den Modulnamen explizit mit dem Schlüssel -m angeben. Zum Beispiel, eine Regel zum Blockieren von eingehenden TCP-Verbindungen auf Port 443, die nicht aus den USA kommen, 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 beim Erstellen von Regeln verwendet, jedoch nicht bei der Filterung berücksichtigt. Daher ist es notwendig, zunächst die iv*-Dateien zu aktualisieren, bevor alle Regeln, die geoip in iptables verwenden, neu erstellt werden.

Fazit

Die Paketfilterung je nach Länderzugehörigkeit ist eine etwas in Vergessenheit geratene Strategie. Trotz dessen entwickeln sich die Softwaremittel 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 den Systemadministratoren das Leben erheblich erleichtern wird.

xtables-addons: Pakete nach Ländern filtern

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte einloggen.

Haben Sie jemals die Filterung nach Ländern verwendet?

  • 59,1%Ja13

  • 40,9%Nein9

22 Benutzer haben abgestimmt. 3 Benutzer haben sich enthalten.

Quelle: habr.com

60GB SSD 8Gb DDR4