Nftables Host absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(38 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Vorüberlegung=
 
*Sowohl nftables als auch der Vorgänger arbeiten mit Tabellen und Ketten.
 
*Beim Vorgänger gab es diese praktisch schon von Haus aus.
 
*Bei nftables müssen wir diese selbst anlegen.
 
*Dies geschieht in dem man sie mit dem richtigen Hacken(Hook) verbindet.
 
*Dies könnte man auf der Kommandozeile machen.
 
*Eleganter ist es allerdings dies in eine Konfigurations Datei zu tun.
 
*Bei einem frisch installierten Debian oder Ubuntu System sieht die Konfiguration so aus
 
*Diese stellt ein Zustand da, der an iptables erinnert.
 
*Wir haben die filter Tabelle und 3 Ketten: input, output und forward erstellt.
 
*Wenn wir die Konfiguration laden wird impliziet die Default Policy accept gesetzt.
 
  
=Datei=
 
*cat /etc/nftables.conf
 
<pre>
 
#!/usr/sbin/nft -f
 
 
flush ruleset
 
 
table inet filter {
 
        chain input {
 
                type filter hook input priority 0;
 
        }
 
        chain forward {
 
                type filter hook forward priority 0;
 
        }
 
        chain output {
 
                type filter hook output priority 0;
 
        }
 
}
 
 
</pre>
 
 
=Laden der Konfigurationsdatei=
 
*nft -f /etc/nftables.conf
 
=Listen der aktuellen Konfiguration=
 
*nft list ruleset
 
<pre>
 
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;
 
}
 
}
 
</pre>
 
=Welchen Zustand haben wir denn nun?=
 
*Ein Paket geht grundsätzlich nur durch eine filter Kette.
 
*Ist das Paket für den Rechner selbst bestimmt, ist es die input Kette.
 
*Wird das Paket von einem lokalen Prozess generiert geht es durch die output Kette raus.
 
*Kommt es von einem anderen Rechner und wird es weitergeleietet ist es die forward Kette.
 
 
{{#drawio:nftables-filter}}
 
=Funktionsweise=
 
==Regeln==
 
*Jede dieser Kette hat nun eine Aneinanderreihung von Regeln.
 
*Diese werden von oben nach unten durchlaufen.
 
*Trift eine wird sie angewandt, das bedeutet das sie nicht weiter geprüft wird.
 
*Es gibt hier aber auch je nach Ziel Ausnahmen
 
*Am Ende wird die Default Policy angewandt.
 
==Ziele der Filter Ketten==
 
*ACCEPT: das Paket kann passieren
 
*REJECT: das Paket wird zurückgewiesen und ein Fehlerpaket wird gesendet
 
*LOG: schreibt einen Eintrag in die syslog
 
*DROP: das Paket wird ignoriert und keine Antwort gesendet
 
 
{| class="wikitable"
 
!colspan="6"|filter table
 
|-style="font-style: italic; color: blue;"
 
||input||output||forward
 
|-
 
||rule 1 ||rule 1 ||rule 1
 
|-
 
||rule 2 ||rule 2 ||rule 2
 
|-
 
||rule 3 ||rule 3 ||
 
|-
 
||rule 4 ||||
 
|-style="font-style: italic; color: red;"
 
||DEFAULT POLICY||DEFAULT POLICY||DEFAULT POLICY
 
|}
 
 
=Wir ändern nun die Default Policy auf drop=
 
*cat /etc/nftables.conf
 
<pre>
 
#!/usr/sbin/nft -f
 
 
flush ruleset
 
table inet filter {
 
chain input {
 
type filter hook input priority filter; policy drop;
 
}
 
 
chain forward {
 
type filter hook forward priority filter; policy drop;
 
}
 
 
chain output {
 
type filter hook output priority filter; policy drop;
 
}
 
}
 
</pre>
 
=Überlegung=
 
*Es ist momentan keine Idee das Firewallscript zu aktivieren.
 
*Wenn wir per ssh eingelogt wären, würden wir uns selbst abschiessen.
 
*Wir warten also noch mit der Aktivierung
 
=Connection Tracking=
 
*Beim Connection Tracking wird über jede Verbindung die durchgelassen wird, Buch geführt.
 
*Eine Verbindung die neu initiert wird, hat den Status '''new'''.
 
*Ein Paket das zu einer bestehenden Verbindung gehört, hat den Status '''established'''.
 
*Es gibt noch den Zustand '''related'''. Dies bezieht sich auf icmp Pakete die einen Bezug zu dieser Verbindung haben.
 
*Oder auch Mehr Kanal Verbindungen wie beispielsweise ftp oder sip.
 
*Dazu braucht man helper Module(prüfen)
 
*Bei den Verbindung wird auch das eigentlich Verbindungslose Protokoll '''udp''' mit einbezogen.
 
*Dies wird über einen Timer geregelt.
 
 
=Die Idee hinter dem Connection Tracking=
 
*Die Idee ist nun alle '''established''' und '''related''' Pakekte freizuschalten.
 
*Und nur bestimmte Verbindungsinitiativen freizuschalten.
 
*Das Firewall Framework lässt dann jeweils nur die Pakete durch die zu einer bestehenden Verbindung gehören.
 
 
=Einbauen des Connection Tracking Grundgerüst=
 
*Wir erlauben alle Pakete die zu einer bestehenden Verbindung gehören.
 
*Wir erlauben alle Pakete die in einer Relation zu einer bestehenden Verbindung stehen.
 
*'''Achtung''' Die Firwall lässt immer noch nichts durch, weil wir noch keine neue Verbindung erlauben.
 
 
*cat /etc/nftables.conf
 
<pre>
 
#!/usr/sbin/nft -f
 
 
flush ruleset
 
table inet filter {
 
chain input {
 
type filter hook input priority filter; policy drop;
 
                ct state established,related accept
 
}
 
 
chain forward {
 
type filter hook forward priority filter; policy drop;
 
                ct state established,related accept
 
        }
 
 
chain output {
 
type filter hook output priority filter; policy drop;
 
                ct state established,related accept
 
}
 
}
 
</pre>
 
 
=Die ersten wirklichen Regeln die etwas bewirken=
 
=Die ersten wirklichen Regeln die etwas bewirken=
 
*Momentan wollen wir nur den Host absichern.  
 
*Momentan wollen wir nur den Host absichern.  
Zeile 159: Zeile 6:
 
*Wir wollen nun folgendes tun:
 
*Wir wollen nun folgendes tun:
 
*<span style="color:#202FF0">Der Rechner soll mit sich selbst über das Loopback Interface kommunizieren können.</span>
 
*<span style="color:#202FF0">Der Rechner soll mit sich selbst über das Loopback Interface kommunizieren können.</span>
*<span style="color:#004334">Vom Rechner selbst nach aussen soll zugelassen werden tcp 22,25,53,80,465,443, udp 53 und icmp</span>
+
*<span style="color:#004334">Vom Rechner selbst nach aussen soll alles zugelassen werden </span>
 
*<span style="color:#8a2be2">Auf den Rechner soll per "ssh, http und https" zugegriffen werden können.</span>
 
*<span style="color:#8a2be2">Auf den Rechner soll per "ssh, http und https" zugegriffen werden können.</span>
 +
 
=Die erste sinnvolle Konfiguration=
 
=Die erste sinnvolle Konfiguration=
 
*cat /etc/nftables.conf
 
*cat /etc/nftables.conf
 
  #!/usr/sbin/nft -f
 
  #!/usr/sbin/nft -f
  <span style="color:#004334">define remote_tcp_ports = { 22,25,53,80,465,443 }</span>
+
  flush ruleset
<span style="color:#004334">define remote_udp_ports = { 53 }</span>
+
 
  <span style="color:#8a2be2">define local_tcp_ports = { 22,80,443 }</span>
+
  <span style="color:#8a2be2">define local_tcp_ports = { 22 }</span>
 
   
 
   
flush ruleset
 
 
  table inet filter {
 
  table inet filter {
 
         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
 +
                <span style="color:#8a2be2">ct state new iif "lo" accept</span>
 
                 <span style="color:#8a2be2">ct state new tcp dport $local_tcp_ports accept</span>  
 
                 <span style="color:#8a2be2">ct state new tcp dport $local_tcp_ports accept</span>  
 
   
 
   
 
         }
 
         }
         chain forward {
+
     
                 type filter hook forward priority filter; policy drop;
+
 +
        chain output {
 +
                type filter hook output priority filter; policy drop;
 +
                ct state established,related accept
 +
                <span style="color:#004334">ct state new accept</span>
 +
          }
 +
}
 +
 
 +
=Wir schalten ping frei=
 +
*cat /etc/nftables.conf
 +
#!/usr/sbin/nft -f
 +
<span style="color:#8a2be2">define local_tcp_ports = { 22 }</span>
 +
 +
flush ruleset
 +
table inet filter {
 +
         chain input {
 +
                 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 tcp dport $local_tcp_ports accept
 +
                <span style="color:#8a2be2">ct state new icmp type echo-request accept</span>
 
         }
 
         }
 +
     
 
   
 
   
 
         chain output {
 
         chain output {
 
                 type filter hook output priority filter; policy drop;
 
                 type filter hook output priority filter; policy drop;
 
                 ct state established,related accept
 
                 ct state established,related accept
                <span style="color:#202FF0">ct state new oifname "lo" accept</span>
+
                 <span style="color:#004334">ct state new accept</span>
                <span style="color:#004334">ct state new tcp dport $remote_tcp_ports accept</span>
+
          }
                <span style="color:#004334">ct state new udp dport $remote_udp_ports accept</span>
 
                 <span style="color:#004334">ct state new icmp type echo-request accept</span>
 
        }
 
 
  }
 
  }
 +
 
=Wir laden nun die Konfiguration=
 
=Wir laden nun die Konfiguration=
 
*nft -f /etc/nftables.conf
 
*nft -f /etc/nftables.conf
Zeile 195: Zeile 61:
 
=Wir loggen=
 
=Wir loggen=
 
*Wir wollen die abgelehnten Pakete loggen.  
 
*Wir wollen die abgelehnten Pakete loggen.  
*Die Idee dahinter ist wir schreiben ein Regel kurz bevor die Default Policy greift.
+
*Die Idee dahinter ist, wir schreiben eine Regel kurz bevor die Default Policy greift.
 +
*<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
 
*cat /etc/nftables.conf
<pre>
+
#!/usr/sbin/nft -f
#!/usr/sbin/nft -f
+
define local_tcp_ports = { 22 }
define remote_tcp_ports = { 22,25,53,80,465,443 }
+
define remote_udp_ports = { 53 }
+
flush ruleset
define local_tcp_ports = { 22,80,443 }
+
table inet filter {
 +
        chain input {
 +
                type filter hook input priority filter; policy drop;
 +
                ct state established,related accept
 +
                ct state new iifname "lo" accept
 +
                ct state new tcp dport $local_tcp_ports 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 oifname "lo" accept
 +
                ct state new accept
 +
                <span style="color:#FF0000">log prefix " --nftables-drop-output-- "</span>
 +
        }
 +
}
 +
</pre>
  
flush ruleset
 
table inet filter {
 
        chain input {
 
                type filter hook input priority filter; policy drop;
 
                ct state established,related accept
 
                ct state new tcp dport $local_tcp_ports accept
 
                log prefix "--nftables-drop-input--"
 
        }
 
        chain forward {
 
                type filter hook forward priority filter; policy drop;
 
                ct state established,related accept
 
                log prefix "--nftables-drop-forward--"
 
        }
 
  
        chain output {
 
                type filter hook output priority filter; policy drop;
 
                ct state established,related accept
 
                ct state new oifname "lo" accept
 
                ct state new tcp dport $remote_tcp_ports accept
 
                ct state new udp dport $remote_udp_ports accept
 
                log prefix "--nftables-drop-output--"
 
        }
 
}
 
</pre>
 
  
=Wir schauen und die Log Datei an=
+
==nftables Logging über journalctl ==
*tail -f /var/log/syslog
+
;Erklärung
2022-11-09T19:07:57.409090+01:00 fedora kernel: --nftables-drop-output--IN= OUT=ens18 SRC=10.0.10.115 DST=8.8.8.8 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=43885 DF PROTO=TCP SPT=55566 DPT=87 WINDOW=64240 RES=0x00 SYN URGP=0
+
*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=
 
=Aktivieren der Firewall beim Systemstart=
 
*systemctl enable nftables --now
 
*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 ip daddr 192.168.2.8 tcp dport 22 accept
 +
*ct state new ip saddr 192.168.2.8 tcp dport 22 accept

Aktuelle Version vom 25. Juli 2025, 11:53 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, http und https" zugegriffen werden können.

Die erste sinnvolle Konfiguration

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

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 $local_tcp_ports accept 

        }
     

        chain output {
                type filter hook output priority filter; policy drop;
                ct state established,related accept
                ct state new accept
          }
}

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 $local_tcp_ports 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
          }
}

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
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 iifname "lo" accept
                ct state new tcp dport $local_tcp_ports 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 oifname "lo" accept
                ct state new accept
                log prefix " --nftables-drop-output-- "
        }
}


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 ip daddr 192.168.2.8 tcp dport 22 accept
  • ct state new ip saddr 192.168.2.8 tcp dport 22 accept