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:

Schematische Darstellung aus Link jensd.be:

Nftables Schema Jens D. Website

Nftables Schema Jens D. Website

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:

Nftables Schema Website: wiki.nftables.org

Nftables Schema Website: wiki.nftables.org

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!