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
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,
there are some errors in filennames. if you correct them its working