Nftables Netze absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(27 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 29: Zeile 29:
 
* Wir wollen aber von vorneherein verstärkt mit Variablen arbeiten.
 
* Wir wollen aber von vorneherein verstärkt mit Variablen arbeiten.
 
* Dies macht die Skripte universeller.
 
* Dies macht die Skripte universeller.
 +
* '''vim /etc/nftables-conf.conf'''
 +
define wandev = enp0s3
 +
define wanip = 192.168.Y.213
 +
define lan = 172.26.2XX.0/24
 +
define server = 10.2XX.1.0/24
 +
define mgmt = 172.18.2XX.0/24
 +
define dmz = 10.88.2XX.0/24
 +
define local_tcp_ports = { 22 }
 +
 +
 
* '''vim /etc/nftables.conf'''
 
* '''vim /etc/nftables.conf'''
 
 
  #!/usr/sbin/nft -f
 
  #!/usr/sbin/nft -f
  define wandev = enp0s3
+
  include "/etc/nftables-vars.conf"
define wanip = 192.168.5.213
 
define lan = 172.17.213.0/24
 
define server = 172.16.213.0/24
 
define mgmt = 172.18.213.0/24
 
define dmz = 10.88.213.0/24
 
 
define local_tcp_ports = { 22 }
 
 
   
 
   
 
  flush ruleset
 
  flush ruleset
Zeile 83: Zeile 85:
 
== Aktivierung ==
 
== Aktivierung ==
  
* '''echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'''
+
*echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-ipforward.conf
* '''sysctl -p'''
+
*sysctl -p /etc/sysctl.d/99-ipforward.conf
  
 
== Weitere Tabellen ==
 
== Weitere Tabellen ==
Zeile 102: Zeile 104:
  
 
  #!/usr/sbin/nft -f
 
  #!/usr/sbin/nft -f
  define wandev = enp0s3
+
  include "/etc/nftables-vars.conf"
define wanip = 192.168.5.213
 
define lan = 172.17.213.0/24
 
define server = 172.16.213.0/24
 
define mgmt = 172.18.213.0/24
 
define dmz = 10.88.213.0/24
 
define local_tcp_ports = { 22 }
 
 
   
 
   
 
  flush ruleset
 
  flush ruleset
Zeile 166: Zeile 162:
 
=Forward von innen nach aussen=
 
=Forward von innen nach aussen=
 
*Wir wollen das unsere Clients und die Server vorerst nach aussen alles dürfen.
 
*Wir wollen das unsere Clients und die Server vorerst nach aussen alles dürfen.
 +
* '''vim /etc/nftables-vars.conf'''
 +
define wandev = enp0s3
 +
define wanip = 192.168.Y.213
 +
define lan = 172.26.2XX.0/24
 +
define server = 10.2XX.1.0/24
 +
define mgmt = 172.18.2XX.0/24
 +
define dmz = 10.88.2XX.0/24
 +
define local_tcp_ports = { 22 }
 +
<span style="color:#FF0000">define localnets = { $lan , $server , $dmz, $mgmt}</span>
 +
* '''vim /etc/nftables.conf'''
 
  #!/usr/sbin/nft -f
 
  #!/usr/sbin/nft -f
  define wandev = enp0s3
+
  include "/etc/nftables-vars.conf"
define wanip = 192.168.5.213
 
define lan = 172.17.213.0/24
 
define server = 172.16.213.0/24
 
define mgmt = 172.18.213.0/24
 
define dmz = 10.88.213.0/24
 
define local_tcp_ports = { 22 }
 
  <span style="color:#FF0000">define localnets = { $lan , $server , $dmz, $mgmt}</span>
 
 
 
 
  flush ruleset
 
  flush ruleset
 
  table inet filter {
 
  table inet filter {
Zeile 216: Zeile 214:
 
=Unsere Netze dürfen auf die Firewall andere nicht=
 
=Unsere Netze dürfen auf die Firewall andere nicht=
 
*Wir wollen das unsere Clients und die Server vorerst nach aussen alles dürfen.
 
*Wir wollen das unsere Clients und die Server vorerst nach aussen alles dürfen.
#!/usr/sbin/nft -f
+
* '''vim /etc/nftables-vars.conf'''
 
  define wandev = enp0s3
 
  define wandev = enp0s3
  <span style="color:#FF0000">define dmzdev = enp0s9</span>
+
  <span style="color:#FF0000">define dmzdev = enp0s8</span>
  <span style="color:#FF0000">define landev = enp0s8</span>
+
  <span style="color:#FF0000">define landev = enp0s9</span>
 
  <span style="color:#FF0000">define serverdev = enp0s10</span>
 
  <span style="color:#FF0000">define serverdev = enp0s10</span>
  define wanip = 192.168.5.213
+
<span style="color:#FF0000">define host = 192.168.10.200</span>
  define lan = 172.17.213.0/24
+
  define wanip = 192.168.Y.213
  define server = 172.16.213.0/24
+
  define lan = 172.26.2XX.0/24
  define mgmt = 172.18.213.0/24
+
  define server = 10.2XX.1.0/24
  define dmz = 10.88.213.0/24
+
  define mgmt = 172.18.2XX.0/24
  define local_tcp_ports = { 22 }
+
  define dmz = 10.88.2XX.0/24
  define localnets = { $lan , $server , $dmz, $server}
+
  define local_tcp_ports = { 22 }  
  <span style="color:#FF0000">define host = 192.168.10.200</span> 
+
  define localnets = { $lan , $server , $dmz, $mgmt}
 +
* '''vim /etc/nftables.conf'''
 +
  #!/usr/sbin/nft -f
 +
include "/etc/nftables-vars.conf"
 
  flush ruleset
 
  flush ruleset
 
  table inet filter {
 
  table inet filter {
Zeile 271: Zeile 272:
  
 
=Regeln von aussen nach innen=
 
=Regeln von aussen nach innen=
*Die Regel die eingefügt wurde bedeutet folgendes:
+
* Die Regel die eingefügt wurde bedeutet folgendes:
*Ein Paket welches in die Schnittstelle enp0s3 reingeht und den Rechner über enp0s9 verlässt.
+
* Ein Paket welches in die Schnittstelle enp0s3 reingeht und den Rechner über enp0s8 verlässt,
*und die Absendeadresse 192.168.5.200 hat, sowie an die Zieladresse 102.88.113.21 und an den Zielport 22 gerichtet ist.
+
* und die Absendeadresse Host hat, sowie an die Zieladresse des Nameservers und an den Zielport 22 gerichtet ist,
*wird durch gelassen und in den Conntrack Tabelle aufgenommen.
+
* wird durchgelassen und in der Conntrack-Tabelle aufgenommen.
  
#!/usr/sbin/nft -f
+
* '''vim /etc/nftables-vars.conf'''
 
  define wandev = enp0s3
 
  define wandev = enp0s3
 +
define dmzdev = enp0s8
 
  define landev = enp0s9
 
  define landev = enp0s9
  define serverdev = enp0s8
+
  define serverdev = enp0s10
 
  define mgmtdev = enp0s10
 
  define mgmtdev = enp0s10
  define wanip = 192.168.5.213
+
define host = 192.168.Y.200
  define lan = 172.17.213.0/24
+
  define wanip = 192.168.Y.213
  define server = 172.16.213.0/24
+
  define lan = 172.26.2XX.0/24
  define mgmt = 172.18.213.0/24
+
  define server = 10.2XX.1.0/24
  define dmz = 10.88.213.0/24
+
  define mgmt = 172.18.2XX.0/24
 +
  define dmz = 10.88.2XX.0/24
 
  define local_tcp_ports = { 22 }
 
  define local_tcp_ports = { 22 }
  define localnets = { $lan , $server , $dmz, $server }
+
  define localnets = { $lan , $server , $dmz, $mgmt }
 +
<span style="color:#FF0000">define ns = 10.88.2XX.21</span>
 +
 
 +
* '''vim /etc/nftables.conf'''
 +
#!/usr/sbin/nft -f
 +
include "/etc/nftables-vars.conf"
 
   
 
   
 
  flush ruleset
 
  flush ruleset
Zeile 295: Zeile 303:
 
   ct state established,related accept
 
   ct state established,related accept
 
   ct state new iifname "lo" accept
 
   ct state new iifname "lo" accept
   ct state new iifname $landev ip saddr $lan tcp dport $local_tcp_ports accept
+
   ct state new iif $landev ip saddr $lan tcp dport $local_tcp_ports accept
   ct state new iifname $dmzdev ip saddr $dmz tcp dport $local_tcp_ports accept
+
   ct state new iif $dmzdev ip saddr $dmz tcp dport $local_tcp_ports accept
   ct state new iifname $serverdev ip saddr $server tcp dport $local_tcp_ports accept
+
   ct state new iif $serverdev ip saddr $server tcp dport $local_tcp_ports accept
 
   ct state new icmp type echo-request accept
 
   ct state new icmp type echo-request accept
 
   log prefix "--nftables-drop-input--"
 
   log prefix "--nftables-drop-input--"
Zeile 305: Zeile 313:
 
   type filter hook forward priority filter; policy drop;
 
   type filter hook forward priority filter; policy drop;
 
   ct state established,related accept
 
   ct state established,related accept
    <span style="color:#FF0000">ct state new iif "enp0s3" oif "enp0s9" ip saddr 192.168.5.200 ip daddr 10.88.113.21 tcp dport 22 accept</span>
+
  <span style="color:#FF0000">ct state new iif $wandev oif $dmzdev ip saddr $host ip daddr $ns tcp dport 22 accept</span>
 
 
 
   ct state new ip saddr $localnets accept
 
   ct state new ip saddr $localnets accept
 
   log prefix "--nftables-drop-forward--"
 
   log prefix "--nftables-drop-forward--"
Zeile 334: Zeile 341:
 
;Wichtig sind die Anführungszeichen
 
;Wichtig sind die Anführungszeichen
 
  include "/etc/nftables.var"
 
  include "/etc/nftables.var"
 
=Aufgaben=
 
*[[Aufgabe nftables Filter]]
 
 
=DNAT zum client=
 
;Man soll über den port 9922 und der äusseren Ip der Firewall per ssh auf den Client auf Port 22 zugreifen
 
  <span style="color:#FF0000">define client = 172.17.213.49</span>
 
 
table inet filter {
 
    ....
 
    chain forward {
 
    type filter hook forward priority filter; policy drop;
 
    ct state established,related accept
 
    ...
 
    <span style="color:#FF0000">ct state new iif $wandev oif $landev ip daddr $client tcp dport 22 accept</span>
 
    log prefix "--nftables-drop-forward--"
 
 
}
 
 
 
table inet nat {
 
    <span style="color:#FF0000">chain prerouting {</span>
 
        <span style="color:#FF0000">type nat hook prerouting priority dstnat; policy accept;</span>
 
        <span style="color:#FF0000">ip daddr $wanip tcp dport 9922 dnat ip to $client:22</span>
 
      <span style="color:#FF0000">}</span>
 
 
;Wir wollen auf die Server ns, mail und www über 6666 auf ssh zugreifen ohne das die Ports auf den Server geändert werden.
 
 
*filter-forward-vor dem-loggen
 
<span style="color:#FF0000">ct state new iif $wandev oif $landev ip daddr { 10.88.213.21 ,10.88.213.34, 10.88.213.41 }  tcp dport 22 accept</span>
 
*nat-prerouting anhängen
 
<span style="color:#FF0000">ip daddr 10.88.213.21 tcp dport 6666 dnat ip to 10.88.213.21:22</span>
 
<span style="color:#FF0000">ip daddr 10.88.213.34 tcp dport 6666 dnat ip to 10.88.213.34:22</span>
 
<span style="color:#FF0000">ip daddr 10.88.213.41 tcp dport 6666 dnat ip to 10.88.213.41:22</span>
 
 
 
=old stuff=
 
=old stuff=
 
*[[nftables-net-oldstuff]]
 
*[[nftables-net-oldstuff]]

Aktuelle Version vom 30. April 2026, 06:41 Uhr

Einleitung

  • Nachdem wir ein Hostsystem abgesichert haben, kommen wir nun zum Absichern von Netzen.
  • Die Firewall agiert als Vermittler zwischen verschiedenen Netzen.
  • In unserem Beispiel haben wir 3 Netzbereiche.

WAN

  • Wide Area Net steht für alles was nicht die anderen beiden Netze betrifft

LAN

  • Local Area Net steht in der Regel für ein Netz das von aussen nicht erreichbar ist.
  • Meist ist es über Network Address Translation (NAT) angebunden.

DMZ

  • Demilitarized Zone ist ein Netz welches von außen erreichbar ist.
  • Die Zugriffe werden aber durch die Firewall abgesichert.
  • Dort werden meistens Dienste wie Mail oder Web gehostet. Teilweise auch Proxy Server.

Der Plan

Das Grundgerüst

  • Wir nutzen unsere Host Firewall als Ausgangsskript
  • Wir wollen aber von vorneherein verstärkt mit Variablen arbeiten.
  • Dies macht die Skripte universeller.
  • vim /etc/nftables-conf.conf
define wandev = enp0s3
define wanip = 192.168.Y.213
define lan = 172.26.2XX.0/24
define server = 10.2XX.1.0/24
define mgmt = 172.18.2XX.0/24
define dmz = 10.88.2XX.0/24
define local_tcp_ports = { 22 } 

  • vim /etc/nftables.conf
#!/usr/sbin/nft -f
include "/etc/nftables-vars.conf"

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 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 accept
               log prefix "--nftables-drop-output--"
       }
}
 
table inet nat {
   chain postrouting {
       type nat hook postrouting priority 100; policy accept;

       oif $wandev ip saddr $lan snat to $wanip
       oif $wandev ip saddr $server snat to $wanip
       oif $wandev ip saddr $mgmt snat to $wanip
       # DMZ wird genattet, außer zu 10.88.0.0/16 und 10.82.89.0/24
       oif $wandev ip saddr $dmz ip daddr != { 10.88.0.0/16, 10.82.89.0/24 } snat to $wanip
   }

Forwarding

Damit Pakete weitergeleitet werden können, muss als erstes FORWARDING im Kernel aktiviert werden.

Aktivierung

  • echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-ipforward.conf
  • sysctl -p /etc/sysctl.d/99-ipforward.conf

Weitere Tabellen

  • Eine Skizze über die Reihenfolge der Hooks.
  • Als erstes greift der Prerouting-Hook
  • Je nachdem wie geroutet wird greift dann entweder Input- oder Fowrward-Hook
  • Falls ein lokaler Prozess ein Paket sendet, dann greift der Output-Hook
  • Als letztes kann man das Paket mit dem Postrouting-Hook beeinflußen

SNAT

  • Rechner in einem LAN können nicht ohne weiteres mit dem WAN kommunizieren, da an die lokale IP-Adresse der Rechner im LAN nicht von außen geroutet werden kann.
  • Um eine Internetverbindung aufzubauen, muss die Adresse aus dem LAN in eine öffentliche umgeschrieben werden.
#!/usr/sbin/nft -f
include "/etc/nftables-vars.conf"

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 forward {
  type filter hook forward priority filter; policy drop;
  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 accept
  log prefix "--nftables-drop-output--"
 }
}

table inet nat {
 chain postrouting {
  type nat hook postrouting priority 100; policy accept;
  oif $wandev ip saddr $lan snat to $wanip
  oif $wandev ip saddr $server snat to $wanip
  oif $wandev ip saddr $mgmt snat to $wanip
  # DMZ wird genattet, außer zu 10.88.0.0/16 und 10.82.89.0/24
  oif $wandev ip saddr $dmz ip daddr != { 10.88.0.0/16, 10.82.89.0/24 } snat to $wanip
 }
}

Neu verwendete Syntax:

  • Definieren einer Variable
define variable_name = value
  • Interface des herausgehenden Paketes:
oif device_name
  • matche IPv4-Adresse des Ursprungpaketes
ip saddr <source_ip>
  • Die Ursprungs-IP auf eine andere Adresse natten
snat ip to <new_source_ip>

Forward von innen nach aussen

  • Wir wollen das unsere Clients und die Server vorerst nach aussen alles dürfen.
  • vim /etc/nftables-vars.conf
define wandev = enp0s3
define wanip = 192.168.Y.213
define lan = 172.26.2XX.0/24
define server = 10.2XX.1.0/24
define mgmt = 172.18.2XX.0/24
define dmz = 10.88.2XX.0/24
define local_tcp_ports = { 22 } 
define localnets = { $lan , $server , $dmz, $mgmt}
  • vim /etc/nftables.conf
#!/usr/sbin/nft -f
include "/etc/nftables-vars.conf"
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 forward {
  type filter hook forward priority filter; policy drop;
  ct state established,related accept
  ct state new ip saddr $localnets 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 accept
  log prefix "--nftables-drop-output--"
 }
}

table inet nat {
 chain postrouting {
  type nat hook postrouting priority 100; policy accept;
  oif $wandev ip saddr $lan snat to $wanip
  oif $wandev ip saddr $server snat to $wanip
  oif $wandev ip saddr $mgmt snat to $wanip
  # DMZ wird genattet, außer zu 10.88.0.0/16 und 10.82.89.0/24
  oif $wandev ip saddr $dmz ip daddr != { 10.88.0.0/16, 10.82.89.0/24 } snat to $wanip
 }
}

Unsere Netze dürfen auf die Firewall andere nicht

  • Wir wollen das unsere Clients und die Server vorerst nach aussen alles dürfen.
  • vim /etc/nftables-vars.conf
define wandev = enp0s3
define dmzdev = enp0s8
define landev = enp0s9
define serverdev = enp0s10
define host = 192.168.10.200
define wanip = 192.168.Y.213
define lan = 172.26.2XX.0/24
define server = 10.2XX.1.0/24
define mgmt = 172.18.2XX.0/24
define dmz = 10.88.2XX.0/24
define local_tcp_ports = { 22 } 
define localnets = { $lan , $server , $dmz, $mgmt}
  • vim /etc/nftables.conf
#!/usr/sbin/nft -f
include "/etc/nftables-vars.conf"
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 iif $landev ip saddr $lan tcp dport $local_tcp_ports accept
  ct state new iif $dmzdev ip saddr $dmz tcp dport $local_tcp_ports accept
  ct state new iif $serverdev ip saddr $server tcp dport $local_tcp_ports accept
  ct state new iif $wandev ip saddr $host tcp dport $local_tcp_ports accept
  ct state new icmp type echo-request accept
  log prefix "--nftables-drop-input--"
 }

 chain forward {
  type filter hook forward priority filter; policy drop;
  ct state established,related accept
  ct state new saddr $localnets 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 accept
  log prefix "--nftables-drop-output--"
 }
}

table inet nat {
 chain postrouting {
  type nat hook postrouting priority 100; policy accept;
  oif $wandev ip saddr $lan snat to $wanip
  oif $wandev ip saddr $server snat to $wanip
  oif $wandev ip saddr $mgmt snat to $wanip
  # DMZ wird genattet, außer zu 10.88.0.0/16 und 10.82.89.0/24
  oif $wandev ip saddr $dmz ip daddr != { 10.88.0.0/16, 10.82.89.0/24 } snat to $wanip
 }
}

Regeln von aussen nach innen

  • Die Regel die eingefügt wurde bedeutet folgendes:
  • Ein Paket welches in die Schnittstelle enp0s3 reingeht und den Rechner über enp0s8 verlässt,
  • und die Absendeadresse Host hat, sowie an die Zieladresse des Nameservers und an den Zielport 22 gerichtet ist,
  • wird durchgelassen und in der Conntrack-Tabelle aufgenommen.
  • vim /etc/nftables-vars.conf
define wandev = enp0s3
define dmzdev = enp0s8
define landev = enp0s9
define serverdev = enp0s10
define mgmtdev = enp0s10
define host = 192.168.Y.200
define wanip = 192.168.Y.213
define lan = 172.26.2XX.0/24
define server = 10.2XX.1.0/24
define mgmt = 172.18.2XX.0/24
define dmz = 10.88.2XX.0/24
define local_tcp_ports = { 22 }
define localnets = { $lan , $server , $dmz, $mgmt }
define ns = 10.88.2XX.21
  • vim /etc/nftables.conf
#!/usr/sbin/nft -f
include "/etc/nftables-vars.conf"

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 iif $landev ip saddr $lan tcp dport $local_tcp_ports accept
  ct state new iif $dmzdev ip saddr $dmz tcp dport $local_tcp_ports accept
  ct state new iif $serverdev ip saddr $server tcp dport $local_tcp_ports accept
  ct state new icmp type echo-request accept
  log prefix "--nftables-drop-input--"
 }

 chain forward {
  type filter hook forward priority filter; policy drop;
  ct state established,related accept
  ct state new iif $wandev oif $dmzdev ip saddr $host ip daddr $ns tcp dport 22 accept
  ct state new ip saddr $localnets 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 accept
  log prefix "--nftables-drop-output--"
 }
}

table inet nat {
 chain postrouting {
  type nat hook postrouting priority 100; policy accept;
  oif $wandev ip saddr $lan snat to $wanip
  oif $wandev ip saddr $server snat to $wanip
  oif $wandev ip saddr $mgmt snat to $wanip
  # DMZ wird genattet, außer zu 10.88.0.0/16 und 10.82.89.0/24
  oif $wandev ip saddr $dmz ip daddr != { 10.88.0.0/16, 10.82.89.0/24 } snat to $wanip
 }
}

Man kann die Variablen auch auslagern

Wichtig sind die Anführungszeichen
include "/etc/nftables.var"

old stuff