Einrichten von Geoblocking-NFTables – IT-Praxis Oberschwaben
Zuletzt aktualisiert am 29. Mai 2024 um 13:05:35
Viele Artikel im Internet sprechen darüber Geoblocking basierend auf dem verwendeten Webserver. Aber das geht mir persönlich nicht weit genug bzw. es geht nicht direkt auf das Betriebssystem ein. Verbindungen müssen direkt hergestellt oder mit der Debian/Ubuntu-Firewall ausgehandelt werden.
Im Folgenden beschreibe ich, wie man Geoblocking mithilfe von nftables auf Ubuntu Server 22.04 LTS konfiguriert. Die allgemeinen Anforderungen lauten, dass etwa 384 MB RAM frei sein sollten. Wenn der Arbeitsspeicher nicht ausreicht und nicht erweitert werden kann oder soll, kann die SWAP-Datei eine gute Alternative sein (siehe hier).
Laden Sie Geo-IP-Informationen herunter.
git clone /opt/nftables-geoip/ /opt/nftables-geoip/nft_geoip.py --file-location /opt/nftables-geoip/location.csv --download --output-dir /opt/nftables-geoip/
Separates Verzeichnis für Plugins nftable die Dateien
mkdir /etc/nftables
Geoblock-Dateien kopieren.
cp /opt/nftables-geoip/geoip-def-all.nft /etc/nftables/ cp /opt/nftables-geoip/geoip-ipv4.nft /etc/nftables/ cp /opt/nftables-geoip/geoip-ipv6.nft /etc/nftables/
Sicherung der Originaldatei nftable.
cp /etc/nftables.conf /etc/nftables.conf.original
Erstellen Sie eine benutzerdefinierte Konfiguration.
cat << \EOF > /etc/nftables.conf #!/usr/sbin/nft -f flush ruleset table inet filter { include "/etc/nftables/geoip-def-all.nft" include "/etc/nftables/geoip-ipv4.nft" include "/etc/nftables/geoip-ipv6.nft" chain geoip-mark-output { type filter hook output priority -1; policy accept; meta mark set ip daddr map @geoip4 meta mark set ip6 daddr map @geoip6 } chain geoip-mark-input { type filter hook input priority -1; policy accept; meta mark set ip saddr map @geoip4 meta mark set ip6 saddr map @geoip6 } chain input { type filter hook input priority 0; iif lo accept ct state established,related counter accept meta nfproto ipv4 icmp type { echo-request } counter accept meta nfproto ipv6 icmpv6 type echo-request counter accept meta nfproto ipv6 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} ip6 hoplimit 1 accept meta nfproto ipv6 icmpv6 type { nd-neighbor-advert, nd-neighbor-solicit, nd-router-advert} ip6 hoplimit 255 counter accept meta mark $DE tcp dport 22 counter accept # tcp dport 22 counter accept tcp dport 0-65535 counter reject udp dport 0-65535 counter drop counter drop } chain forward { type filter hook forward priority 0; } chain output { type filter hook output priority 0; } } EOF
In diesem Fall sind SSH-Verbindungen nur von IPv4/IPv6-Adressen erlaubt, die Deutschland zugeordnet sind (Zeile 37). Weitere Länder können mit einer neuen Konfigurationszeile und einem neuen Ländercode hinzugefügt werden.
Einlesen der neuen Konfiguration.
nft -f /etc/nftables.conf
Der Versuch, die neue Konfiguration einzulesen, kann zu Fehlern führen wie:
In file included from /etc/nftables.conf:8:1-33: /etc/geoip-def-all.nft:260:2-5: Error: syntax error, unexpected type type mark : mark ^^^^ In file included from /etc/nftables.conf:8:1-33: /etc/geoip-def-all.nft:261:2-6: Error: syntax error, unexpected flags flags interval ^^^^^
In diesem Fall werden Tabulatoren und keine Leerzeichen verwendet, um die Konfiguration einzurücken. Das bedeutet, dass Sie mit der Leertaste wieder einrücken können.
Aktivieren Sie den Dienst und starten Sie ihn erneut.
systemctl enable nftables.service systemctl restart nftables.service
Überprüfen Sie, ob die Regeln korrekt erstellt wurden.
nft list chain inet filter input nft list chain inet filter outout
Erstellen eines Skripts zum Herunterladen und Importieren neuer Geoblock-Dateien sowie zum Aktualisieren der Firewall-Regeln.
cat << \EOF > /opt/nftables-geoip/update.sh #!/bin/bash # Download new files /opt/nftables-geoip/nft_geoip.py --file-location /opt/nftables-geoip/location.csv --download --output-dir /opt/nftables-geoip/ # Copy files to productive folder cp /opt/nftables-geoip/geoip-def-all.nft /etc/nftables/ cp /opt/nftables-geoip/geoip-ipv4.nft /etc/nftables/ cp /opt/nftables-geoip/geoip-ipv6.nft /etc/nftables/ # Reload new map nft delete table inet filter nft -f /etc/nftables.conf EOF
Passen Sie die Dateiberechtigungen an.
chmod 700 /opt/nftables-geoip/update.sh
Konfigurieren Sie das Update-Skript als Cron-Job.
ln -s /opt/nftables-geoip/update.sh /etc/cron.daily/nftables-geoip
Viel Spaß beim Ausprobieren. 🙂