xtables-addons: Pakete nach Land filtern

xtables-addons: Pakete nach Land filtern
Die Aufgabe, den Datenverkehr aus bestimmten Ländern zu blockieren, erscheint einfach, doch der erste Eindruck kann täuschen. Heute verraten wir Ihnen, wie das umgesetzt werden kann.

Vorgeschichte

Die Ergebnisse einer Google-Suche zu diesem Thema sind enttäuschend: Die meisten Lösungen sind längst „verrottet“ und manchmal scheint es, als sei dieses Thema für immer auf Eis gelegt und vergessen worden. Wir haben viele alte Aufzeichnungen durchgesehen und sind bereit, eine moderne Version der Anweisungen zu teilen.

Wir empfehlen Ihnen, den gesamten Artikel zu lesen, bevor Sie diese Befehle ausführen.

Vorbereitung des Betriebssystems

Die Filterung wird mit dem Dienstprogramm konfiguriert iptables, was eine Erweiterung erfordert, um mit GeoIP-Daten arbeiten zu können. Diese Erweiterung finden Sie in xtables-addons. xtables-addons installiert Erweiterungen für iptables als unabhängige Kernelmodule, sodass der Betriebssystemkernel nicht neu kompiliert werden muss.

Zum Zeitpunkt des Verfassens dieses Artikels ist die aktuelle Version von xtables-addons 3.9. Allerdings ist nur 20.04 in den standardmäßigen Ubuntu 3.8 LTS-Repositories und 18.04 in den Ubuntu 3.0-Repositories zu finden. Sie können die Erweiterung über den Paketmanager mit dem folgenden Befehl installieren:

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

Beachten Sie, dass es kleine, aber wichtige Unterschiede zwischen Version 3.9 und dem aktuellen Stand des Projekts gibt, auf die wir später noch eingehen werden. Um aus dem Quellcode zu erstellen, installieren Sie alle erforderlichen Pakete:

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

Klonen Sie 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, die uns aber nur interessieren xt_geoip. Wenn Sie keine unnötigen Erweiterungen in das System ziehen möchten, können Sie diese vom Build ausschließen. Dazu müssen Sie die Datei bearbeiten mconfig. Für alle gewünschten Module installieren y, und markieren Sie alle unnötigen n. Wir sammeln:

./autogen.sh

./configure

make

Und mit Superuser-Rechten installieren:

make install

Während der Installation von Kernelmodulen kann ein Fehler ähnlich dem folgenden 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 entsteht aufgrund der Unmöglichkeit, Kernelmodule zu signieren, weil nichts zu unterschreiben. Sie können dieses Problem mit ein paar Befehlen lösen:

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

Das kompilierte Kernelmodul ist installiert, wird aber vom System nicht erkannt. Bitten wir das System, eine Abhängigkeitskarte unter Berücksichtigung des neuen Moduls zu erstellen und diese dann zu laden:

depmod -a

modprobe xt_geoip

Stellen wir sicher, dass xt_geoip in das System geladen ist:

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

Stellen Sie außerdem sicher, dass die Erweiterung in iptables geladen ist:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Wir sind mit allem zufrieden und müssen nur noch den Modulnamen hinzufügen / etc / modulesdamit das Modul nach dem Neustart des Betriebssystems funktioniert. Von nun an versteht iptables GeoIP-Befehle, verfügt jedoch nicht über genügend Daten, um damit zu arbeiten. Beginnen wir mit dem Laden der GeoIP-Datenbank.

Abrufen der GeoIP-Datenbank

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

mkdir /usr/share/xt_geoip

Am Anfang des Artikels haben wir erwähnt, dass es Unterschiede zwischen der Version aus dem Quellcode und der Version aus dem Paketmanager gibt. Der auffälligste Unterschied ist die Änderung des Datenbankanbieters und des Skripts xt_geoip_dl, das die neuesten Daten herunterlädt.

Paketmanagerversion

Das Skript befindet sich im Pfad /usr/lib/xtables-addons, aber wenn Sie versuchen, es auszuführen, wird ein nicht sehr informativer Fehler angezeigt:

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

Zuvor wurde als Datenbank das unter Lizenz vertriebene Produkt GeoLite verwendet, das heute als GeoLite Legacy bekannt ist Creative Commons ASA 4.0 Firma MaxMind. Bei diesem Produkt sind gleichzeitig zwei Ereignisse aufgetreten, die die Kompatibilität mit der iptables-Erweiterung „unterbrochen“ haben.

Erstens im Januar 2018 kündigte die über die Einstellung des Supports für das Produkt und am 2019. Januar 2 wurden alle Links zum Herunterladen der alten Version der Datenbank von der offiziellen Website entfernt. Neuen Benutzern wird empfohlen, das GeoLite2-Produkt oder die kostenpflichtige Version GeoIPXNUMX zu verwenden.

Zweitens seit Dezember 2019 MaxMind sagte, über eine wesentliche Änderung beim Zugriff auf ihre Datenbanken. Um dem California Consumer Privacy Act zu entsprechen, hat MaxMind beschlossen, den Vertrieb von GeoLite2 durch die Registrierung „abzudecken“.

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

xtables-addons: Pakete nach Land filtern
Anschließend erhalten Sie eine E-Mail mit der Bitte, ein Passwort festzulegen. Nachdem wir nun ein Konto erstellt haben, müssen wir einen Lizenzschlüssel erstellen. In Ihrem persönlichen Konto finden wir den Artikel Meine Lizenzschlüssel, und klicken Sie dann auf die Schaltfläche Generieren Sie einen neuen Lizenzschlüssel.

Beim Erstellen eines Schlüssels wird uns nur eine Frage gestellt: Werden wir diesen Schlüssel im GeoIP-Update-Programm verwenden? Wir antworten negativ und drücken den Knopf Schichtannahme. Der Schlüssel wird in einem Popup-Fenster angezeigt. Bewahren Sie diesen Schlüssel an einem sicheren Ort auf, da Sie nach dem Schließen des Popup-Fensters nicht mehr den gesamten Schlüssel anzeigen können.

xtables-addons: Pakete nach Land filtern
Wir haben die Möglichkeit, GeoLite2-Datenbanken manuell herunterzuladen, ihr Format ist jedoch nicht mit dem vom xt_geoip_build-Skript erwarteten Format kompatibel. Hier kommen GeoLite2xtables-Skripte zur Rettung. Um Skripte auszuführen, installieren Sie 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 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

Lassen Sie uns die Skripte ausführen:

# Скачиваем данные 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 ein Limit von 2000 Downloads pro Tag fest und bietet bei einer großen Anzahl von Servern an, das Update auf einem Proxyserver zwischenzuspeichern.

Bitte beachten Sie, dass die Ausgabedatei aufgerufen werden muss dbip-country-lite.csv... Leider, 20_convert_geolite2 erzeugt keine perfekte Datei. Skript xt_geoip_build erwartet drei Spalten:

  • Beginn des Adressbereichs;
  • Ende des Adressbereichs;
  • Ländercode in ISO-3166-Alpha2.

Und die Ausgabedatei enthält sechs Spalten:

  • Anfang des Adressbereichs (String-Darstellung);
  • Ende des Adressbereichs (String-Darstellung);
  • Beginn des Adressbereichs (numerische Darstellung);
  • Ende des Adressbereichs (numerische Darstellung);
  • Code des Landes;
  • der Name des Landes.

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

  1. regieren 20_convert_geolite2;
  2. regieren xt_geoip_build.

Im ersten Fall reduzieren wir printf in das erforderliche Format und im zweiten Schritt ändern wir die Zuweisung zur Variablen $cc auf $row->[4]. Danach können Sie Folgendes erstellen:

/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

Beachten Sie, dass der Autor GeoLite2xtables betrachtet seine Drehbücher noch nicht als produktionsreif und bietet sie an folgen für die Entwicklung originaler xt_geoip_*-Skripte. Fahren wir daher mit der Assemblierung von Quellcodes fort, in denen diese Skripte bereits aktualisiert wurden.

Quellversion

Bei der Installation von Quellcode-Skripten xt_geoip_* finden Sie im Katalog /usr/local/libexec/xtables-addons. Diese Version des Skripts verwendet eine Datenbank IP zu Country Lite. Die Lizenz ist eine Creative Commons Attribution License, und aus den verfügbaren Daten ergeben sich die unbedingt notwendigen drei 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 betriebsbereit.

Verwendung von Geoip in iptables

Modul xt_geoip fügt nur zwei Schlüssel hinzu:

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.

Die Methoden zum Erstellen von Regeln für iptables bleiben im Allgemeinen unverändert. Um Schlüssel von zusätzlichen Modulen zu verwenden, müssen Sie den Namen des Moduls explizit mit dem Schalter -m angeben. Beispielsweise eine Regel zum Blockieren eingehender TCP-Verbindungen auf 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

Von xt_geoip_build erstellte Dateien werden nur beim Erstellen von Regeln verwendet, aber beim Filtern nicht berücksichtigt. Um die GeoIP-Datenbank korrekt zu aktualisieren, müssen Sie daher zunächst die iv*-Dateien aktualisieren und dann alle Regeln, die GeoIP verwenden, in iptables neu erstellen.

Abschluss

Das Filtern von Paketen nach Ländern ist eine Strategie, die mit der Zeit etwas in Vergessenheit geraten ist. Trotzdem werden Softwaretools für eine solche Filterung entwickelt und vielleicht erscheint bald eine neue Version von xt_geoip mit einem neuen GeoIP-Datenanbieter in Paketmanagern, was das Leben von Systemadministratoren erheblich vereinfachen wird.

xtables-addons: Pakete nach Land filtern

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

Haben Sie jemals die Filterung nach Ländern verwendet?

  • 59,1%Ja13

  • 40,9%Nr. 9

22 Benutzer haben abgestimmt. 3 Benutzer enthielten sich der Stimme.

Source: habr.com

Kommentar hinzufügen