Nftables Netze absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(69 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
* Nachdem wir ein Hostsystem abgesichert haben, kommen wir nun zum Absichern von Netzen.
* Nachdem wir ein Hostsystem abgesichert haben, kommen wir nun zum Absichern von Netzen.
* Die Firewall agiert als Vermittler zwischen verschiedenen Netzen.
* Die Firewall agiert als Vermittler zwischen verschiedenen Netzen.
* In unserem Beispiel haben wir 3 Netzbereiche.
* In unserem Beispiel haben wir 4 Netzbereiche.


= WAN =
= WAN =


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


= LAN =
= LAN =
Zeile 19: Zeile 19:
* Die Zugriffe werden aber durch die Firewall abgesichert.
* Die Zugriffe werden aber durch die Firewall abgesichert.
* Dort werden meistens Dienste wie Mail oder Web gehostet. Teilweise auch Proxy Server.
* Dort werden meistens Dienste wie Mail oder Web gehostet. Teilweise auch Proxy Server.
=SERVER=
* Hier stehen die internen SERVER
* Fileserver oder LDAP Server


= Der Plan =
= Der Plan =
Zeile 29: Zeile 33:
* 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'''
===vim /etc/nftables-vars.conf===
define wandev = enp0s3
{{vorlage:nftables-vars.conf}}
define wanip = 192.168.Y.213
===vim /etc/nftables.conf===
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
  #!/usr/sbin/nft -f
  include "/etc/nftables-vars.conf"
  include "/etc/nftables-vars.conf"
  flush ruleset
  flush ruleset
  table inet filter {
  table inet filter {
        chain input {
{{vorlage:input.conf}}
                type filter hook input priority filter; policy drop;
<span style="color:#FF0000">chain forward {</span>
                ct state established,related accept
                <span style="color:#FF0000">type filter hook forward priority filter; policy drop;</span>
                ct state new iifname "lo" accept
                <span style="color:#FF0000">ct state established,related accept</span>
                ct state new tcp dport $local_tcp_ports accept
                <span style="color:#FF0000">log prefix "--nftables-drop-forward--"</span>
                ct state new icmp type echo-request accept
      <span style="color:#FF0000">}</span>
                log prefix "--nftables-drop-input--"
        }
      <span style="color:#FF0000">chain forward {</span>
                <span style="color:#FF0000">type filter hook forward priority filter; policy drop;</span>
                <span style="color:#FF0000">ct state established,related accept</span>
                <span style="color:#FF0000">log prefix "--nftables-drop-forward--"</span>
      <span style="color:#FF0000">}</span>
   
   
        chain output {
{{vorlage:output.conf}}
                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--"
        }
  }
  }
 
{{vorlage:nat2}}
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 ==
== Weitere Tabellen ==
Zeile 92: Zeile 55:
* Eine Skizze über die Reihenfolge der Hooks.
* Eine Skizze über die Reihenfolge der Hooks.
* Als erstes greift der Prerouting-Hook
* Als erstes greift der Prerouting-Hook
* Je nachdem wie geroutet wird greift dann entweder Input- oder Fowrward-Hook
* Je nachdem wie geroutet wird greift dann entweder Input- oder Forward-Hook
* Falls ein lokaler Prozess ein Paket sendet, dann greift der Output-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
* Als letztes kann man das Paket mit dem Postrouting-Hook beeinflußen
Zeile 98: Zeile 61:
{{#drawio:nft-inet1}}
{{#drawio:nft-inet1}}


== SNAT ==
== Checken der forward Kette ==
 
*nft list chain inet filter forward
* 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 {
  table inet filter {
  chain input {
chain forward {
  type filter hook input priority filter; policy drop;
type filter hook forward priority filter; policy drop;
  ct state established,related accept
ct state established,related accept
  ct state new iifname "lo" accept
log prefix "--nftables-drop-forward--"
  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--"
  }
  }
  }
<span style="color:#FF0000">table inet nat {</span>
<span style="color:#FF0000"> chain postrouting {</span>
<span style="color:#FF0000">  type nat hook postrouting priority 100; policy accept;</span>
<span style="color:#FF0000">  oif $wandev ip saddr $lan snat to $wanip</span>
<span style="color:#FF0000">  oif $wandev ip saddr $server snat to $wanip</span>
<span style="color:#FF0000">  oif $wandev ip saddr $mgmt snat to $wanip</span>
<span style="color:#FF0000">  # DMZ wird genattet, außer zu 10.88.0.0/16 und 10.82.89.0/24</span>
<span style="color:#FF0000">  oif $wandev ip saddr $dmz ip daddr != { 10.88.0.0/16, 10.82.89.0/24 } snat to $wanip</span>
<span style="color:#FF0000"> }</span>
<span style="color:#FF0000">}</span>
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=
=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'''
===vim /etc/nftables-vars.conf===
define wandev = enp0s3
{{vorlage:nftables-vars.conf}}
define wanip = 192.168.Y.213
===vim /etc/nftables.conf===
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
  include "/etc/nftables-vars.conf"
  include "/etc/nftables-vars.conf"
  flush ruleset
  flush ruleset
  table inet filter {
  table inet filter {
  chain input {
{{vorlage:input.conf}}
  type filter hook input priority filter; policy drop;
      chain forward {
  ct state established,related accept
            type filter hook forward priority filter; policy drop;
  ct state new iifname "lo" accept
            ct state established,related accept
  ct state new tcp dport $local_tcp_ports accept
            <span style="color:#FF0000">ct state new ip saddr $LOCALNETS accept</span>
  ct state new icmp type echo-request accept
            log prefix "--nftables-drop-forward--"
  log prefix "--nftables-drop-input--"
        }
  }
{{vorlage:output.conf}}
  chain forward {
  type filter hook forward priority filter; policy drop;
  <span style="color:#FF0000">ct state established,related accept</span>
  <span style="color:#FF0000">ct state new ip saddr $localnets accept</span>
  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
<span style="color:#FF0000">define dmzdev = enp0s8</span>
<span style="color:#FF0000">define landev = enp0s9</span>
<span style="color:#FF0000">define serverdev = enp0s10</span>
<span style="color:#FF0000">define host = 192.168.10.200</span>
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
  <span style="color:#FF0000">ct state new iif $landev ip saddr $lan tcp dport $local_tcp_ports accept</span>
  <span style="color:#FF0000">ct state new iif $dmzdev ip saddr $dmz tcp dport $local_tcp_ports accept</span>
  <span style="color:#FF0000">ct state new iif $serverdev ip saddr $server tcp dport $local_tcp_ports accept</span>
  <span style="color:#FF0000">ct state new iif $wandev ip saddr $host tcp dport $local_tcp_ports accept</span>
  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
  }
  }
  }
{{vorlage:nat2}}


=Regeln von aussen nach innen=
=Regeln von aussen nach innen=
* Die Regel die eingefügt wurde bedeutet folgendes:
* Die Regel die eingefügt wird bedeuten folgendes:
* Ein Paket welches in die Schnittstelle enp0s3 reingeht und den Rechner über enp0s8 verlässt,
* 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,
* Sowie an die Zieladresse des Nameservers und an den UDP Zielport 53 gerichtet ist,
* wird durchgelassen und in der Conntrack-Tabelle aufgenommen.
* wird durchgelassen und in der Conntrack-Tabelle aufgenommen.
===vim /etc/nftables-vars.conf===
{{vorlage:nftables-vars.conf}}
<span style="color:#FF0000">define NS = 10.88.2XX.21</span>


* '''vim /etc/nftables-vars.conf'''
===vim /etc/nftables.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 }
<span style="color:#FF0000">define ns = 10.88.2XX.21</span>
 
* '''vim /etc/nftables.conf'''
  #!/usr/sbin/nft -f
  #!/usr/sbin/nft -f
  include "/etc/nftables-vars.conf"
  include "/etc/nftables-vars.conf"
  flush ruleset
  flush ruleset
  table inet filter {
  table inet filter {
  chain input {
{{vorlage:input.conf}}
  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 {
   chain forward {
  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 $wandev oif $dmzdev ip saddr $host ip daddr $ns tcp dport 22 accept</span>
            <span style="color:#FF0000">ct state new iif $WANDEV oif $DMZDEV ip daddr $NS udp dport 53 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--"
  }
        }
  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 {
{{vorlage:output.conf}}
  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
  }
  }
  }
{{vorlage:nat2}}
=Erklärungen=
ct state new iif $WANDEV oif $DMZDEV ip saddr $HOST ip daddr $WWW tcp dport 80 accept
{| class="wikitable"
! Schlüsselwort / Variable !! Typ !! Erklärung
|-
| <code>ct state new</code> || nftables-Ausdruck || Paket-Tracking via Connection Tracking: Trifft auf neue Verbindungen zu (kein bestehendes ct-Entry)
|-
| <code>iif</code> || Schlüsselwort || Eingehendes Interface (Input Interface Flag)
|-
| <code>$WANDEV</code> || Variable || Enthält den Namen des WAN-Interfaces (z. B. <code>eth0</code>), über das das Paket eingeht
|-
| <code>oif</code> || Schlüsselwort || Ausgehendes Interface (Output Interface Flag)
|-
| <code>$DMZDEV</code> || Variable || Enthält den Namen des DMZ-Interfaces (z. B. <code>eth2</code>), über das das Paket weitergeleitet wird
|-
| <code>ip saddr</code> || Schlüsselwort || Quelladresse auf IPv4-Ebene (Source Address)
|-
| <code>$HOST</code> || Variable || Enthält die IPv4-Adresse des erlaubten Quell-Hosts
|-
| <code>ip daddr</code> || Schlüsselwort || Zieladresse auf IPv4-Ebene (Destination Address)
|-
| <code>$WWW</code> || Variable || Enthält die IPv4-Adresse des Ziel-Webservers
|-
| <code>tcp dport 80</code> || Ausdruck || Protokoll TCP, Zielport 80 (HTTP)
|-
| <code>accept</code> || Aktion || Paket wird akzeptiert und passiert die Regel
|}


=Man kann die Variablen auch auslagern=
;Wichtig sind die Anführungszeichen
include "/etc/nftables.var"
=old stuff=
=old stuff=
*[[nftables-net-oldstuff]]
*[[nftables-net-oldstuff]]

Aktuelle Version vom 28. September 2026, 08:28 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 4 Netzbereiche.

WAN

  • Wide Area Net steht für alles was nicht die anderen 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.

SERVER

  • Hier stehen die internen SERVER
  • Fileserver oder LDAP Server

Der Plan

netzplan-nftables-1

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-vars.conf

define WANDEV = enp0s3
define DMZDEV = enp0s8
define LANDEV = enp0s9
define SERVERDEV = enp0s10
define WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define SERVER = 10.2XX.1.0/24
define MGMT = 172.27.2XX.0/24
define DMZ = 10.88.2XX.0/24
define KIT = <SCHULUNGS NETZ>
define HOST = <EUER HOST>
define LOCALNETS = { $DMZ, $LAN, $SERVER, $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 iif "lo" accept
                 ct state new iif $DMZDEV ip saddr $DMZ tcp dport 22 accept
 	     	 ct state new iif $LANDEV ip saddr $LAN tcp dport 22 accept
 	  	 ct state new iif $SERVERDEV ip saddr $SERVER tcp dport 22 accept
 	 	 ct state new iif $WANDEV ip saddr $HOST 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 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 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
     }
  }

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 Forward-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
nft-inet1

Checken der forward Kette

  • nft list chain inet filter forward
table inet filter {
	chain forward {
		type filter hook forward priority filter; policy drop;
		ct state established,related accept
		log prefix "--nftables-drop-forward--"
	}
}

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 DMZDEV = enp0s8
define LANDEV = enp0s9
define SERVERDEV = enp0s10
define WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define SERVER = 10.2XX.1.0/24
define MGMT = 172.27.2XX.0/24
define DMZ = 10.88.2XX.0/24
define KIT = <SCHULUNGS NETZ>
define HOST = <EUER HOST>
define LOCALNETS = { $DMZ, $LAN, $SERVER, $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 iif "lo" accept
                 ct state new iif $DMZDEV ip saddr $DMZ tcp dport 22 accept
 	     	 ct state new iif $LANDEV ip saddr $LAN tcp dport 22 accept
 	  	 ct state new iif $SERVERDEV ip saddr $SERVER tcp dport 22 accept
 	 	 ct state new iif $WANDEV ip saddr $HOST 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 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 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
     }
  }

Regeln von aussen nach innen

  • Die Regel die eingefügt wird bedeuten folgendes:
  • Ein Paket welches in die Schnittstelle enp0s3 reingeht und den Rechner über enp0s8 verlässt,
  • Sowie an die Zieladresse des Nameservers und an den UDP Zielport 53 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 WANIP = <WANIP der Firewall>
define LAN = 172.26.2XX.0/24
define SERVER = 10.2XX.1.0/24
define MGMT = 172.27.2XX.0/24
define DMZ = 10.88.2XX.0/24
define KIT = <SCHULUNGS NETZ>
define HOST = <EUER HOST>
define LOCALNETS = { $DMZ, $LAN, $SERVER, $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 iif "lo" accept
                 ct state new iif $DMZDEV ip saddr $DMZ tcp dport 22 accept
 	     	 ct state new iif $LANDEV ip saddr $LAN tcp dport 22 accept
 	  	 ct state new iif $SERVERDEV ip saddr $SERVER tcp dport 22 accept
 	 	 ct state new iif $WANDEV ip saddr $HOST 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 forward {
            type filter hook forward priority filter; policy drop;
            ct state established,related accept
            ct state new iif $WANDEV oif $DMZDEV ip daddr $NS udp dport 53 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 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
     }
  }

Erklärungen

ct state new iif $WANDEV oif $DMZDEV ip saddr $HOST ip daddr $WWW tcp dport 80 accept
Schlüsselwort / Variable Typ Erklärung
ct state new nftables-Ausdruck Paket-Tracking via Connection Tracking: Trifft auf neue Verbindungen zu (kein bestehendes ct-Entry)
iif Schlüsselwort Eingehendes Interface (Input Interface Flag)
$WANDEV Variable Enthält den Namen des WAN-Interfaces (z. B. eth0), über das das Paket eingeht
oif Schlüsselwort Ausgehendes Interface (Output Interface Flag)
$DMZDEV Variable Enthält den Namen des DMZ-Interfaces (z. B. eth2), über das das Paket weitergeleitet wird
ip saddr Schlüsselwort Quelladresse auf IPv4-Ebene (Source Address)
$HOST Variable Enthält die IPv4-Adresse des erlaubten Quell-Hosts
ip daddr Schlüsselwort Zieladresse auf IPv4-Ebene (Destination Address)
$WWW Variable Enthält die IPv4-Adresse des Ziel-Webservers
tcp dport 80 Ausdruck Protokoll TCP, Zielport 80 (HTTP)
accept Aktion Paket wird akzeptiert und passiert die Regel

old stuff