Nftables Host absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(31 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 10: Zeile 10:
  
 
=Die erste sinnvolle Konfiguration=
 
=Die erste sinnvolle Konfiguration=
−
*cat /etc/nftables.conf
+
{{nftabels-var1
−
  #!/usr/sbin/nft -f
+
| kit = 172.22.0.0/16
−
  flush ruleset  
+
}}
−
+
  # Alte Regeln löschen (flush)
−
+
  flush ruleset
 +
 
 
  table inet filter {
 
  table inet filter {
 
         chain input {
 
         chain input {
Zeile 31: Zeile 32:
 
           }
 
           }
 
  }
 
  }
−
{{vorlage:nat1}}
+
{{vorlage:nat2}}
 +
==Aktivieren und Kontrolliere==
 +
;Aktivieren
 +
*nft -f /etc/nftables.conf
 +
;Kontrollieren
 +
*nft list ruleset
  
 
=Wir schalten ping frei=
 
=Wir schalten ping frei=
−
*cat /etc/nftables.conf
+
{{nftabels-var1
−
#!/usr/sbin/nft -f
+
| kit = 172.22.0.0/16
−
define local_tcp_ports = { 22 }
+
}}
−
   
+
  # Alte Regeln löschen (flush)
 
  flush ruleset
 
  flush ruleset
 +
 
  table inet filter {
 
  table inet filter {
 
         chain input {
 
         chain input {
Zeile 55: Zeile 62:
 
           }
 
           }
 
  }
 
  }
−
{{vorlage:nat1}}
+
{{vorlage:nat2}}
  
−
=Wir laden nun die Konfiguration=
+
==Aktivieren und Kontrolliere==
 +
;Aktivieren
 
*nft -f /etc/nftables.conf
 
*nft -f /etc/nftables.conf
 +
;Kontrollieren
 +
*nft list ruleset
  
 
=Wir loggen=
 
=Wir loggen=
Zeile 65: Zeile 75:
 
*<span style="color:#FF0000">Neu: Wir fügen in jeder Kette eine log-Regel ein, um verworfene Pakete zu protokollieren</span>
 
*<span style="color:#FF0000">Neu: Wir fügen in jeder Kette eine log-Regel ein, um verworfene Pakete zu protokollieren</span>
  
−
*cat /etc/nftables.conf
+
{{nftabels-var1
−
#!/usr/sbin/nft -f
+
| kit = 172.22.0.0/16
−
   
+
}}
−
   
+
# Alte Regeln löschen (flush)
 +
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
 +
                  <span style="color:#8a2be2">log prefix " --nftables-drop-input-- "</span>
 +
        }
 +
   
 +
 
 +
        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
 +
                  <span style="color:#8a2be2">log prefix " --nftables-drop-output-- "</span>
 +
        }
 +
}
 +
 
 +
{{vorlage:nat2}}
 +
 
 +
*nft -f /etc/nftables.conf
 +
*nft list ruleset
 +
 
 +
;Checken von eurem Host
 +
*netcat -vz 192.168.HS.2XX 80
 +
;Kontrolle auf der firewall
 +
*journalctl -fkg nft
 +
 
 +
=DHCP für das Lan freischalten=
 +
*<span style="color:#FF0000">Neu: Wir schalten für das LAN UDP Port 67 frei</span>
 +
 
 +
{{nftabels-var1
 +
| kit = 172.22.0.0/16
 +
}}
 +
  <span style="color:#8a2be2">define LANDEV = enp0s9</span>
 +
  # Alte Regeln löschen (flush)
 
  flush ruleset
 
  flush ruleset
 
  table inet filter {
 
  table inet filter {
Zeile 77: Zeile 126:
 
                 ct state new tcp dport 22 accept
 
                 ct state new tcp dport 22 accept
 
                 ct state new icmp type echo-request accept  
 
                 ct state new icmp type echo-request accept  
−
                 <span style="color:#FF0000">log prefix " --nftables-drop-input-- "</span>
+
                 <span style="color:#8a2be2">ct state new iif $LANDEV udp dport 67 accept</span>
 +
                log prefix " --nftables-drop-input-- "
 
         }
 
         }
−
+
   
−
     
+
 
−
 
 
         chain output {
 
         chain output {
 
                 type filter hook output priority filter; policy drop;
 
                 type filter hook output priority filter; policy drop;
Zeile 87: Zeile 136:
 
                 ct state new oif "lo" accept
 
                 ct state new oif "lo" accept
 
                 ct state new accept
 
                 ct state new accept
−
                 <span style="color:#FF0000">log prefix " --nftables-drop-output-- "</span>
+
                 log prefix " --nftables-drop-output-- "
 
         }
 
         }
 
  }
 
  }
−
</pre>
 
−
{{vorlage:nat1}}
 
  
 +
{{vorlage:nat2}}
  
 
==nftables Logging über journalctl ==
 
==nftables Logging über journalctl ==
Zeile 109: Zeile 157:
 
=Source oder Destination IP oder Netze=
 
=Source oder Destination IP oder Netze=
 
;Hinweis für die Aufgaben.
 
;Hinweis für die Aufgaben.
−
Source Ips oder Netze werden mit einem '''ip saddr IP''' angeben
+
Source Ips oder Netze werden mit einem '''ip saddr <IP>''' angeben
  
−
Destination Ips oder Netze werden mit einem '''ip daddr IP''' angeben
+
Destination Ips oder Netze werden mit einem '''ip daddr <IP>''' angeben
 
;Beispiele  
 
;Beispiele  
  
Zeile 117: Zeile 165:
  
 
=Aufgabe=
 
=Aufgabe=
−
*Grenzt den Zugriff per ssh so ein das folgende Bereiche zugelassen:
+
;Tip - Es werden nur Änderungen in der input Kette vorgenommen.
 +
*Grenzt den Zugriff auf die Firewall per ssh so ein das folgende Bereiche zugelassen:
 
**DMZ
 
**DMZ
 
**LAN
 
**LAN
 
**SERVER
 
**SERVER
−
**HOST
+
**HOST (Der Rechner vor dem sitzt)
 
;Testet ob die Regel greifen positiv wie negativ <nowiki>:)</nowiki>
 
;Testet ob die Regel greifen positiv wie negativ <nowiki>:)</nowiki>
−
 
−
 
−
#!/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
 
−
                <span style="color:#FF0000">log prefix " --nftables-drop-input-- "</span>
 
−
        }
 
−
 
−
     
 
−
 
−
        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
 
−
                <span style="color:#FF0000">log prefix " --nftables-drop-output-- "</span>
 
−
        }
 
−
}
 
−
</pre>
 
−
{{vorlage:nat1}}
 
  
 
=Handling=
 
=Handling=

Aktuelle Version vom 28. September 2026, 06:47 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

# Variablen
define WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define MGMT = 172.27.2XX.0/24
define SERVER = 10.2XX.1.0/24
define DMZ = 10.88.2XX.0/24
define KIT = 172.22.0.0/16
define WANDEV = enp0s3
# Alte Regeln löschen (flush)
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
          }
}
 table inet nat {
  chain postrouting {
   type nat hook postrouting priority 100; policy accept;
        ip saddr $DMZ ip daddr $KIT return
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        ip saddr $DMZ oif $WANDEV snat to $WANIP
        ip saddr $LAN oif $WANDEV snat to $WANIP
        ip saddr $SERVER oif $WANDEV snat to $WANIP
        ip saddr $MGMT oif $WANDEV snat to $WANIP
     }
  }

Aktivieren und Kontrolliere

Aktivieren
  • nft -f /etc/nftables.conf
Kontrollieren
  • nft list ruleset

Wir schalten ping frei

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

# Variablen
define WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define MGMT = 172.27.2XX.0/24
define SERVER = 10.2XX.1.0/24
define DMZ = 10.88.2XX.0/24
define KIT = 172.22.0.0/16
define WANDEV = enp0s3
# Alte Regeln löschen (flush)
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
          }
}
 table inet nat {
  chain postrouting {
   type nat hook postrouting priority 100; policy accept;
        ip saddr $DMZ ip daddr $KIT return
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        ip saddr $DMZ oif $WANDEV snat to $WANIP
        ip saddr $LAN oif $WANDEV snat to $WANIP
        ip saddr $SERVER oif $WANDEV snat to $WANIP
        ip saddr $MGMT oif $WANDEV snat to $WANIP
     }
  }

Aktivieren und Kontrolliere

Aktivieren
  • nft -f /etc/nftables.conf
Kontrollieren
  • nft list ruleset

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

# Variablen
define WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define MGMT = 172.27.2XX.0/24
define SERVER = 10.2XX.1.0/24
define DMZ = 10.88.2XX.0/24
define KIT = 172.22.0.0/16
define WANDEV = enp0s3
# Alte Regeln löschen (flush)
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-- "
        }
}
 table inet nat {
  chain postrouting {
   type nat hook postrouting priority 100; policy accept;
        ip saddr $DMZ ip daddr $KIT return
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        ip saddr $DMZ oif $WANDEV snat to $WANIP
        ip saddr $LAN oif $WANDEV snat to $WANIP
        ip saddr $SERVER oif $WANDEV snat to $WANIP
        ip saddr $MGMT oif $WANDEV snat to $WANIP
     }
  }
  • nft -f /etc/nftables.conf
  • nft list ruleset
Checken von eurem Host
  • netcat -vz 192.168.HS.2XX 80
Kontrolle auf der firewall
  • journalctl -fkg nft

DHCP für das Lan freischalten

  • Neu: Wir schalten für das LAN UDP Port 67 frei
  • cat /etc/nftables.conf
#!/usr/sbin/nft -f

# Variablen
define WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define MGMT = 172.27.2XX.0/24
define SERVER = 10.2XX.1.0/24
define DMZ = 10.88.2XX.0/24
define KIT = 172.22.0.0/16
define WANDEV = enp0s3
define LANDEV = enp0s9
# Alte Regeln löschen (flush)
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 
                ct state new iif $LANDEV udp dport 67 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-- "
        }
}
 table inet nat {
  chain postrouting {
   type nat hook postrouting priority 100; policy accept;
        ip saddr $DMZ ip daddr $KIT return
        ip saddr $DMZ ip daddr 10.88.0.0/16 return
        ip saddr $DMZ oif $WANDEV snat to $WANIP
        ip saddr $LAN oif $WANDEV snat to $WANIP
        ip saddr $SERVER oif $WANDEV snat to $WANIP
        ip saddr $MGMT oif $WANDEV snat to $WANIP
     }
  }

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

Tip - Es werden nur Änderungen in der input Kette vorgenommen.
  • Grenzt den Zugriff auf die Firewall per ssh so ein das folgende Bereiche zugelassen:
    • DMZ
    • LAN
    • SERVER
    • HOST (Der Rechner vor dem sitzt)
Testet ob die Regel greifen positiv wie negativ :)

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