GeoIP Firewallregeln mit nftables

Musste man bei der Verwendung von iptables noch den GeoIP Support durch die Installation der xtables Add-ons manuell hinzufügen, inklusive der Kompilierung der Kernelmodule nach jedem Kernelupdate, so ist dies ein fertig integriertes Feature von nftables.

Abseits von nftables benötigen wir noch ein Script für den Download und die Umwandlung der GeoIP Daten in ein passendes Format:

git clone https://github.com/pvxe/nftables-geoip.git
cd nftables-geoip
./nft_geoip.py --file-location location.csv --download

Folgende Dateien finden sich nach dem Download der GeoIP Daten in dem Ordner:

geoip-def-africa.nft
geoip-def-all.nft
geoip-def-americas.nft
geoip-def-antarctica.nft
geoip-def-asia.nft
geoip-def-europe.nft
geoip-def-oceania.nft
geoip-ipv4.nft
geoip-ipv6.nft

In unserem Fall wollen wir alle Länder im Regelwerk nutzen können, daher verschieben wir folgende Dateien nach /etc/:

mv geoip-def-all.nft /etc/
mv geoip-ipv4.nft /etc/
mv geo-ipv6.nft /etc/

In der nftables Konfigurationsdatei /etc/nftables.conf werden die GeoIP Daten nun importiert und zwei Chains zur GeoIP-Markierung der eingehenden und ausgehenden Pakete hinzugefügt:

table inet filter {
....
       include "geoip-def-all.nft"
       include "geoip-ipv4.nft"
       include "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
       }
....
}

Die Priorität der neu hinzugefügten Chains sollte niedriger als die anderer Chains sein, damit die GeoIP Markierung der Pakete früh durchgeführt wird.

Nun kommen wir zu der tatsächlichen Nutzung der GeoIP-Informationen im Firewallregelwerk, dazu werden die bekannten ISO Ländercodes bspw. „DE“ für Deutschland verwendet.

Sollen beispielsweise bestimmte Länder von der Kommunikation mit einem Linuxserver ausgeschlossen werden, so könnte die notwendige Regel in der Input Chain wie folgt aussehen:

table inet filter {
....
       chain input {
        meta mark {$CN,$RU} ct state new
       }
....
}

Ebenso können Freischaltungen auf Basis von GeoIP Informationen durchgeführt werden.
In diesem Beispiel wird der Zugriff auf den SSH Port ausschließlich für IP-Adressen aus Deutschland erlaubt:

table inet filter {                                   
....
       chain input {
        meta mark $DE tcp dport 22 ct state new accept
       }

....
}                                                      

Zum Abschluss der Konfigurationsarbeiten sollte dann das Firewallregelwerk erneut eingelesen werden:
nft -f /etc/nftables.conf

Die GeoIP Daten des Scripts kommen übrigens von dem Anbieter „dbip“, hierbei handelt es sich um den kostenfreien Datensatz „IP Country Lite“:
https://db-ip.com/db/download/ip-to-country-lite


2 comments

  • it seems this doesnt work anymore:

    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:259:20-20: Error: syntax error, unexpected ‚{‚, expecting string
    map continent_code {
    ^
    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 file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:262:2-9: Error: syntax error, unexpected elements
    elements = {
    ^^^^^^^^
    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:263:3-3: Error: syntax error, unexpected ‚$‘
    $AF : $asia,
    ^
    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:264:3-3: Error: syntax error, unexpected ‚$‘
    $AX : $europe,
    ^
    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:265:3-3: Error: syntax error, unexpected ‚$‘
    $AL : $europe,
    ^
    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:266:3-3: Error: syntax error, unexpected ‚$‘
    $DZ : $africa,
    ^
    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:267:3-3: Error: syntax error, unexpected ‚$‘
    $AS : $oceania,
    ^
    In file included from /etc/nftables.conf:8:1-33:
    /etc/geoip-def-all.nft:268:3-3: Error: syntax error, unexpected ‚$‘
    $AD : $europe,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert