Nftables Host absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 132: Zeile 132:
 
         chain input {
 
         chain input {
 
                   type filter hook input priority filter; policy drop;
 
                   type filter hook input priority filter; policy drop;
                  ct state established,related accept
+
                ct state established,related accept
                  ct state new iif "lo" accept
+
                ct state new iif "lo" accept
 
                 ct state new iif "enp0s8" ip saddr 10.88.213.0/24 tcp dport 22 accept
 
                 ct state new iif "enp0s8" ip saddr 10.88.213.0/24 tcp dport 22 accept
 
  ct state new iif "enp0s9" ip saddr 172.26.213.0/24 tcp dport 22 accept
 
  ct state new iif "enp0s9" ip saddr 172.26.213.0/24 tcp dport 22 accept

Version vom 7. Mai 2026, 14:52 Uhr

Die ersten wirklichen Regeln die etwas bewirken

  • Momentan wollen wir nur den Host absichern.
  • Darum können wir die forward Kette erstmal aussen vor lassen.
  • Wir beziehen uns also nur auf den Host selbst.
  • Wir wollen nun folgendes tun:
  • Der Rechner soll mit sich selbst über das Loopback Interface kommunizieren können.
  • Vom Rechner selbst nach aussen soll alles zugelassen werden
  • Auf den Rechner soll per "ssh" zugegriffen werden können.

Die erste sinnvolle Konfiguration

  • cat /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset 


table inet filter {
        chain input {
                type filter hook input priority filter; policy drop;
                ct state established,related accept
                ct state new iif "lo" accept
                ct state new tcp dport 22 accept 

        }
     

        chain output {
                type filter hook output priority filter; policy drop;
                ct state established,related accept
                ct state new accept
          }
}
# NAT-Tabelle erstellen/verwenden
table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        
        # DMZ nach $KIT - kein NAT (RETURN)
        ip saddr $DMZ ip daddr $KIT return
        
        # DMZ nach 10.88.0.0/16 - kein NAT (RETURN)
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        
        # DMZ nach außen (enp0s3) - Masquerade
        ip saddr $DMZ oif $WANDEV masquerade
        
        # LAN nach außen - Masquerade
        ip saddr $LAN oif $WANDEV masquerade
        
        # SERVER nach außen - Masquerade
        ip saddr $SERVER oif $WANDEV masquerade
    }
}

Wir schalten ping frei

  • cat /etc/nftables.conf
#!/usr/sbin/nft -f
define local_tcp_ports = { 22 }

flush ruleset
table inet filter {
        chain input {
                type filter hook input priority filter; policy drop;
                ct state established,related accept
                ct state new iif "lo" accept
                ct state new tcp dport 22 accept
                ct state new icmp type echo-request accept 
        }
     

        chain output {
                type filter hook output priority filter; policy drop;
                ct state established,related accept
                ct state new accept
          }
}
# NAT-Tabelle erstellen/verwenden
table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        
        # DMZ nach $KIT - kein NAT (RETURN)
        ip saddr $DMZ ip daddr $KIT return
        
        # DMZ nach 10.88.0.0/16 - kein NAT (RETURN)
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        
        # DMZ nach außen (enp0s3) - Masquerade
        ip saddr $DMZ oif $WANDEV masquerade
        
        # LAN nach außen - Masquerade
        ip saddr $LAN oif $WANDEV masquerade
        
        # SERVER nach außen - Masquerade
        ip saddr $SERVER oif $WANDEV masquerade
    }
}

Wir laden nun die Konfiguration

  • nft -f /etc/nftables.conf

Wir loggen

  • Wir wollen die abgelehnten Pakete loggen.
  • Die Idee dahinter ist, wir schreiben eine Regel kurz bevor die Default Policy greift.
  • Neu: Wir fügen in jeder Kette eine log-Regel ein, um verworfene Pakete zu protokollieren
  • cat /etc/nftables.conf
#!/usr/sbin/nft -f


flush ruleset
table inet filter {
        chain input {
                type filter hook input priority filter; policy drop;
                ct state established,related accept
                ct state new iif "lo" accept
                ct state new tcp dport 22 accept
                ct state new icmp type echo-request accept 
                log prefix " --nftables-drop-input-- "
        }

     

        chain output {
                type filter hook output priority filter; policy drop;
                ct state established,related accept
                ct state new oif "lo" accept
                ct state new accept
                log prefix " --nftables-drop-output-- "
        }
}
# NAT-Tabelle erstellen/verwenden
table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        
        # DMZ nach $KIT - kein NAT (RETURN)
        ip saddr $DMZ ip daddr $KIT return
        
        # DMZ nach 10.88.0.0/16 - kein NAT (RETURN)
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        
        # DMZ nach außen (enp0s3) - Masquerade
        ip saddr $DMZ oif $WANDEV masquerade
        
        # LAN nach außen - Masquerade
        ip saddr $LAN oif $WANDEV masquerade
        
        # SERVER nach außen - Masquerade
        ip saddr $SERVER oif $WANDEV masquerade
    }
}


nftables Logging über journalctl

Erklärung
  • journalctl -k -f -g nftables
Nur Logtext ohne Metadaten
  • journalctl -k -f -g nftables -o cat
Logausgabe mit ISO-Zeitformat
  • journalctl -k -f -g nftables -o short-iso
Nur drop-input
  • journalctl -k -f -g nftables-drop-input

Aktivieren der Firewall beim Systemstart

  • systemctl enable nftables --now

Source oder Destination IP oder Netze

Hinweis für die Aufgaben.

Source Ips oder Netze werden mit einem ip saddr IP angeben

Destination Ips oder Netze werden mit einem ip daddr IP angeben

Beispiele
ct state new iif "enp0s9" ip saddr 172.26.213.0/24 tcp dport 22 accept

Aufgabe

  • Grenzt den Zugriff per ssh so ein das folgende Bereiche zugelassen:
    • DMZ
    • LAN
    • SERVER
    • HOST
Testet ob die Regel greifen positiv wie negativ :)


#!/usr/sbin/nft -f


flush ruleset
table inet filter {
        chain input {
                 type filter hook input priority filter; policy drop;
                ct state established,related accept
                ct state new iif "lo" accept
                ct state new iif "enp0s8" ip saddr 10.88.213.0/24 tcp dport 22 accept

ct state new iif "enp0s9" ip saddr 172.26.213.0/24 tcp dport 22 accept

	 	 ct state new iif "enp0s10" ip saddr 10.213.1.0/24 tcp dport 22 accept
		 ct state new iif "enp0s3" ip saddr 192.168.6.200 tcp dport 22 accept
                ct state new icmp type echo-request accept 
                log prefix " --nftables-drop-input-- "
        }

     

        chain output {
                type filter hook output priority filter; policy drop;
                ct state established,related accept
                ct state new oif "lo" accept
                ct state new accept
                log prefix " --nftables-drop-output-- "
        }
}
# NAT-Tabelle erstellen/verwenden
table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        
        # DMZ nach $KIT - kein NAT (RETURN)
        ip saddr $DMZ ip daddr $KIT return
        
        # DMZ nach 10.88.0.0/16 - kein NAT (RETURN)
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        
        # DMZ nach außen (enp0s3) - Masquerade
        ip saddr $DMZ oif $WANDEV masquerade
        
        # LAN nach außen - Masquerade
        ip saddr $LAN oif $WANDEV masquerade
        
        # SERVER nach außen - Masquerade
        ip saddr $SERVER oif $WANDEV masquerade
    }
}

Handling

Regelsatz anzeigen
  • nft list ruleset
Regelsatz neuladen
  • systemctl restart nftables

oder

  • nft -f /etc/nftables.conf
Regelsatz löschen
  • systemctl stop nftables

oder

  • nft flush ruleset
Firewall für den System aktiveren
  • systemctl enable nftables
Ist die Firewall enabled?
  • systemctl is-enabled nftables
Firewall start
  • systemctl start nftables
Firewall start und enabled
  • systemctl enable nftables --now
Logging
  • journalctl -fkg nftables