Netfilter¶
Nachdem die letzten Iptables auch bereits die Netfilter-Techniken der Linux-Kernel nutzten
(siehe iptables-nft
) haben die meisten Distributionen komplett auf Netfilter umgestellt.
Wir werden also über (z.B.) dpkg -l | grep nftables
die Softwareinstallation vorfinden.
Die entscheidende Frage ist aber, ober der nftables.service auch gestartet/genutzt wird?
root@vm-lpic-router:~# systemctl status nftables.service
nftables.service - nftables
Loaded: loaded (/lib/systemd/system/nftables.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2021-09-15 17:20:48 CEST; 2min 34s ago
Docs: man:nft(8)
http://wiki.nftables.org
Main PID: 994 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 2259)
Memory: 0B
CPU: 0
CGroup: /system.slice/nftables.service
Sep 15 17:20:48 vm-lpic-router systemd[1]: Starting nftables...
Sep 15 17:20:48 vm-lpic-router systemd[1]: Finished nftables.
Die Entwickler von Netfilter und Verwalter der Distributionen schlagen dann auch gleich noch firewalld
als Frontend vor. Wir bleiben aber in unseren Seminaren komplett in der Konsole bei den Basistechniken
der eigentlichen Software - also keine Oberfläche für die Firewall oder zusätzliche firewall-cmd
Aufrufe!
Hinweis
Über eine einfache Prozessliste, kann man die Netfilter-Firewall-Technik nicht finden, da
das Tool nft
nur einmal ausgeführt wird.
Die Konfiguration für Netfilter ist in /etc/nftables.conf
bei Debian
oder aber /etc/sysconfig/nftables.conf
bei CentOS/RHEL.
Wir sollten auch schauen, ob der Netfilter / nftables - Dienst läuft und ihn gegebenfalls für Starts aktivieren.
root@vm-lpic-router:~# systemctl enable nftables.service
Created symlink /etc/systemd/system/sysinit.target.wants/nftables.service → /lib/systemd/system/nftables.service.
Aktuelle Firewall-Analyse mit Tool nft
:
root@vm-lpic-router:~# nft list tables
table inet filter
root@vm-lpic-router:~# nft list table inet filter
table inet filter {
chain input {
type filter hook input priority filter; policy accept;
}
chain forward {
type filter hook forward priority filter; policy accept;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
Links zu Netfilter:
https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes
https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables
https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server
https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_home_router
https://jensd.be/1086/linux/forward-a-tcp-port-to-another-ip-or-port-using-nat-with-nftables
Schematische Darstellung aus Link jensd.be:
Aus dem Link für das Simple Ruleset for a Home Router kann man die wichtigsten Einstellungen für ein klassisches NAT-Routing entnehmen.
Im Original: This example shows the configuration of an IPv4-only home router using a ppp interface to go out to the Internet.
Wir ersetzen hier einfach das öffentliche PPP durch unsere WAN-Seite des Routers und passen die anderen Vorgaben/Einstellungen an.
Das wird unsere neue /etc/nftables.conf
:
flush ruleset
define DEV_PRIVATE = eth1
define DEV_WORLD = eth0
define NET_PRIVATE = 172.16.100.0/24
table ip global {
chain inbound_world {
# accepting ping (icmp-echo-request) for diagnostic purposes.
# However, it also lets probes discover this host is alive.
# This sample accepts them within a certain rate limit:
#
icmp type echo-request limit rate 5/second accept
# allow SSH connections from some well-known (internet) host
ip saddr 10.200.82.1 tcp dport ssh accept
# komplettem Teilnetz den Zugriff ermöglichen
# ip saddr 10.200.82.0/24 tcp dport ssh accept
}
chain inbound_private {
# accepting ping (icmp-echo-request) for diagnostic purposes.
icmp type echo-request limit rate 5/second accept
# allow DHCP, DNS and SSH from the private network
ip protocol . th dport vmap { tcp . 22 : accept, udp . 53 : accept, tcp . 53 : accept, udp . 67 : accept}
}
chain inbound {
type filter hook input priority 0; policy drop;
# Allow traffic from established and related packets, drop invalid
ct state vmap { established : accept, related : accept, invalid : drop }
# allow loopback traffic, anything else jump to chain for further evaluation
iifname vmap { lo : accept, $DEV_WORLD : jump inbound_world, $DEV_PRIVATE : jump inbound_private }
# the rest is dropped by the above policy
}
chain forward {
type filter hook forward priority 0; policy drop;
# Allow traffic from established and related packets, drop invalid
ct state vmap { established : accept, related : accept, invalid : drop }
# connections from the internal net to the internet or to other
# internal nets are allowed
iifname $DEV_PRIVATE accept
# erlaube Forwarding für DNAT
# iifname $DEV_WORLD accept
# iifname $DEV_WORLD tcp port 22 accept
# the rest is dropped by the above policy
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
# masquerade private IP addresses
ip saddr $NET_PRIVATE oifname $DEV_WORLD masquerade
}
# DNAT - Port-Forwarding
# chain prerouting {
# type nat hook prerouting priority -100; policy accept;
# ip daddr 10.100.200.1 tcp dport { 22223 } dnat to 172.16.100.10:22
# }
}
Zu beachten: im nft-Code wurde nur speziell für eine Maschine (10.200.81.1)
der Zugang per SSH ermöglicht. Nach dem Aktivieren dieses Regelsatzes
(nft list ruleset
) kann nur noch dieser PC sich per SSH mit dem
Router verbinden.
Gefahr
Noch ein kleiner Hinweis und Tipp:
Bitte niemals SSH-Zugänge komplett zumachen, wenn man keine Möglichkeiten hat noch direkt an die Maschine zu kommen!
Und falls es noch nicht gesagt wurde: Firewalling ist nicht gerade easy ;-)
Die Nftables Website schlägt für die Orientierung die folgende Grafik vor:
Link zum Wiki und der Darstellung mit den sogenannten Netfilter hooks.
Hinweis
Und wie bei den Schemata zu Iptables ist hier auch sehr wichtig, dass man die Darstellung als Schema für einen Netzadapter erkennt. Ein Router hat dann hiervon mindestens zwei!