4 mins read

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. 🙂



technische Probleme auf

Leave a Reply

Your email address will not be published. Required fields are marked *