Die Aufgabe, den Verkehr aus bestimmten Ländern zu blockieren, scheint einfach, aber der erste Eindruck täuscht. Heute werden wir Ihnen sagen, wie dies umgesetzt werden kann.
Hintergrund
Die Suchergebnisse bei Google zu diesem Thema sind beunruhigend: Die meisten Lösungen sind seit langem "faul" und manchmal scheint es, dass dieses Thema für immer zurückgestellt und vergessen wurde. Wir haben viele alte Aufzeichnungen durchgesehen und sind bereit, die moderne Version der Anleitung zu teilen.
Wir empfehlen, dass Sie den gesamten Artikel lesen, bevor Sie die angegebenen Befehle ausführen.
Betriebssystem vorbereiten
Die Filterung wird mit dem Dienstprogramm iptables konfiguriert , für das eine Erweiterung erforderlich ist, um mit GeoIP-Daten arbeiten zu können. Eine solche Erweiterung finden Sie in xtables-Addons . xtables-addons installiert iptables-Erweiterungen als eigenständige Kernelmodule, sodass der Betriebssystemkernel nicht neu kompiliert werden muss.
Zum Zeitpunkt dieses Schreibens ist die aktuelle Version von xtables-addons 3.9. In den Standard-Ubuntu 20.04 LTS-Repositorys sind jedoch nur 3.8 und in den Ubuntu 18.04-Repositorys 3.0 enthalten. 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 Status des Projekts gibt, auf die wir später noch eingehen werden. Installieren Sie alle erforderlichen Pakete, um aus Quellcodes zu erstellen:
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, aber wir interessieren uns nur für xt_geoip . Wenn Sie keine unnötigen Erweiterungen in das System ziehen möchten, können Sie sie von der Assembly ausschließen. Dazu müssen Sie die mconfig- Datei bearbeiten . Setzen Sie für alle gewünschten Module y und 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 mit folgendem Inhalt 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 aufgrund der Unfähigkeit auf, Kernelmodule zu signieren, da 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, das System erkennt es jedoch nicht. Bitten wir das System, eine Abhängigkeitskarte basierend auf dem neuen Modul zu erstellen und diese dann zu laden:
depmod -a
modprobe xt_geoip
Stellen Sie 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
Alles passt zu uns und alles, was bleibt, ist, den Namen des Moduls zu / etc / modules hinzuzufügen , damit das Modul nach dem Neustart des Betriebssystems funktioniert. Zu diesem Zeitpunkt versteht iptables Geoip-Befehle, es fehlen jedoch die Daten, mit denen gearbeitet werden kann. Beginnen wir mit dem Laden der Geoip-Datenbank.
Holen Sie sich die GeoIP-Datenbank
Erstellen Sie ein Verzeichnis, in dem Informationen für die Erweiterung iptables gespeichert werden:
mkdir /usr/share/xt_geoip
Am Anfang dieses Artikels haben wir erwähnt, dass es Unterschiede zwischen der Quellversion und der Paketmanagerversion gibt. Der auffälligste Unterschied ist die Änderung des Datenbankanbieters und des Skripts xt_geoip_dl , mit dem die tatsächlichen Daten heruntergeladen werden.
Version vom Paketmanager
Das Skript befindet sich am Pfad / usr / lib / xtables-addons. Wenn Sie jedoch versuchen zu starten, wird möglicherweise 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.
Bisher verwendet die Datenbank die GeoLite Produkt, jetzt als GeoLite Erbe bekannt ist , unter der verteilten ASA Creative Commons 4.0 Lizenz von MaxMind . Bei diesem Produkt sind zwei Ereignisse gleichzeitig aufgetreten, wodurch die Kompatibilität mit der Erweiterung für iptables "unterbrochen" wurde.
Zum einen im Januar 2018 angekündigt , dass sie das Ende der Unterstützung für das Produkt, und am 2. Januar 2019 alle Links die alte Version der Datenbank zum Download wurden von der offiziellen Website entfernt. Neuen Benutzern wird empfohlen, das GeoLite2-Produkt oder die kostenpflichtige Version GeoIP2 zu verwenden.
Zweitens gab MaxMind seit Dezember 2019 bekanntüber eine signifikante Änderung des Zugriffs auf ihre Datenbanken. Um dem kalifornischen Verbraucherschutzgesetz zu entsprechen, hat MaxMind beschlossen, die Verbreitung von GeoLite2 durch Registrierung zu „vertuschen“.
Da wir ihr Produkt verwenden möchten, werden wir uns auf dieser Seite registrieren.
Danach wird eine Nachricht an die E-Mail gesendet, in der Sie aufgefordert werden, ein Kennwort festzulegen. Nachdem wir ein Konto erstellt haben, müssen wir einen Lizenzschlüssel erstellen. Suchen Sie in Ihrem persönlichen Konto den Eintrag Meine Lizenzschlüssel und klicken Sie dann auf die Schaltfläche Neuen Lizenzschlüssel generieren .
Beim Erstellen eines Schlüssels wird uns nur eine Frage gestellt: Werden wir diesen Schlüssel im GeoIP Update-Programm verwenden? Wir verneinen und klicken auf die Schaltfläche Bestätigen . Der Schlüssel wird im 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 vollständigen Schlüssel sehen können.
Wir haben die Möglichkeit, GeoLite2-Datenbanken manuell herunterzuladen, aber ihr Format ist nicht mit dem Format kompatibel, das vom Skript xt_geoip_build erwartet wird. Hier kommen GeoLite2xtables-Skripte ins Spiel. Installieren Sie das NetAddr :: IP-Perlmodul, damit Skripte funktionieren:
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 die 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 ein Limit von 2000 Downloads pro Tag fest und bietet bei einer großen Anzahl von Servern das Zwischenspeichern von Updates auf einem Proxyserver an.Bitte beachten Sie, dass die Ausgabedatei den Namen dbip-country-lite.csv haben muss . Leider erzeugt 20_convert_geolite2 keine perfekte Datei. Das Skript xt_geoip_build erwartet drei Spalten:
- der Beginn des Adressbereichs;
- Ende des Adressbereichs;
- Ländercode in ISO-3166-Alpha2.
Die Ausgabedatei enthält sechs Spalten:
- Beginn des Adressbereichs (Zeichenfolgendarstellung);
- Ende des Adressbereichs (Zeichenfolgendarstellung);
- Beginn des Adressbereichs (numerisch);
- Ende des Adressbereichs (numerisch);
- Code des Landes;
- der Name des Landes.
Diese Diskrepanz ist kritisch und kann auf zwei Arten korrigiert werden:
- edit 20_convert_geolite2 ;
- Bearbeiten Sie xt_geoip_build .
Im ersten Fall kürzen wir printf auf das gewünschte Format ab, und im zweiten Fall ändern wir die Zuordnung der Variablen $ cc zu $ row -> [4] . Danach können Sie bauen:
/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 von GeoLite2xtables nicht seine Skripte nicht berücksichtigt für die Produktion bereit sein , und schlägt vor , dass Sie folgen der Entwicklung der ursprünglichen xt_geoip_ * Skripte. Fahren wir daher mit dem Erstellen aus dem Quellcode fort, in dem diese Skripte bereits aktualisiert wurden.
Quellversion
Bei der Installation aus dem Quellcode befinden sich die Skripte xt_geoip_ * im Verzeichnis / usr / local / libexec / xtables-addons . Diese Version des Skripts verwendet die IP to Country Lite- Datenbank . Lizenz - Creative Commons Attribution License. Aus den verfügbaren Daten sind dies die drei wichtigsten Spalten. Laden Sie die Datenbank herunter und sammeln Sie sie:
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 einsatzbereit.
Geoip in iptables verwenden
Das 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 Art und Weise, wie iptables-Regeln gebildet werden, bleibt im Allgemeinen unverändert. Um Switches aus zusätzlichen Modulen zu verwenden, müssen Sie den Modulnamen mit dem Schalter -m explizit angeben. Beispiel: Eine Regel zum Blockieren eingehender TCP-Verbindungen an Port 443 von Nicht-USA auf allen Schnittstellen:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
Die von xt_geoip_build generierten Dateien werden nur beim Erstellen von Regeln verwendet, jedoch nicht zum Filtern berücksichtigt. Um die Geoip-Datenbank korrekt zu aktualisieren, müssen Sie zuerst die iv * -Dateien aktualisieren und dann alle Regeln neu erstellen, die Geoip in iptables verwenden.
Fazit
Das Filtern von Paketen nach Ländern ist eine etwas vergessene Strategie. Trotzdem entwickeln sich Softwaretools für eine solche Filterung, und möglicherweise wird bald eine neue Version von xt_geoip mit einem neuen Geoip-Datenanbieter in Paketmanagern erscheinen, was das Leben der Systemadministratoren erheblich vereinfachen wird.