Nftables Netze absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(118 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 =
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'''
+
===vim /etc/nftables-vars.conf===
 
+
{{vorlage:nftables-vars.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.113
 
define lan = 172.17.113.0/24
 
define server = 172.16.113.0/24
 
define mgmt = 172.18.113.0/24
 
define dmz = 10.88.113.0/24
 
 
define local_tcp_ports = { 22 }
 
 
 
  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.conf'''
 
* '''sysctl -p'''
 
  
 
== Weitere Tabellen ==
 
== Weitere Tabellen ==
Zeile 90: 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 96: Zeile 61:
 
{{#drawio:nft-inet1}}
 
{{#drawio:nft-inet1}}
  
== 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
 
define wandev = enp0s3
 
define wanip = 192.168.5.113
 
define lan = 172.17.113.0/24
 
define server = 172.16.113.0/24
 
define mgmt = 172.18.113.0/24
 
define dmz = 10.88.113.0/24
 
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 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===
 +
{{vorlage:nftables-vars.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.113
 
define lan = 172.17.113.0/24
 
define server = 172.16.113.0/24
 
define mgmt = 172.18.113.0/24
 
define dmz = 10.88.113.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 {
  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.
 
#!/usr/sbin/nft -f
 
define wandev = enp0s3
 
<span style="color:#FF0000">define dmzdev = enp0s9</span>
 
<span style="color:#FF0000">define landev = enp0s8</span>
 
<span style="color:#FF0000">define serverdev = enp0s10</span>
 
define wanip = 192.168.5.113
 
define lan = 172.17.113.0/24
 
define server = 172.16.113.0/24
 
define mgmt = 172.18.113.0/24
 
define dmz = 10.88.113.0/24
 
define local_tcp_ports = { 22 }
 
define localnets = { $lan , $server , $dmz, $server}
 
 
 
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>
 
  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 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.
+
* Sowie an die Zieladresse des Nameservers und an den UDP Zielport 53 gerichtet ist,
*wird durch gelassen und in den 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.conf===
 
  #!/usr/sbin/nft -f
 
  #!/usr/sbin/nft -f
  define wandev = enp0s3
+
  include "/etc/nftables-vars.conf"
define landev = enp0s9
 
define serverdev = enp0s8
 
define mgmtdev = enp0s10
 
define wanip = 192.168.5.113
 
define lan = 172.17.113.0/24
 
define server = 172.16.113.0/24
 
define mgmt = 172.18.113.0/24
 
define dmz = 10.88.113.0/24
 
define local_tcp_ports = { 22 }
 
define localnets = { $lan , $server , $dmz, $server }
 
 
 
  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 iifname $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 iifname $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 "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 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}}
=Man kann die Variablen auch auslagern=
+
=Erklärungen=
;Wichtig sind die Anführungszeichen
+
ct state new iif $WANDEV oif $DMZDEV ip saddr $HOST ip daddr $WWW tcp dport 80 accept
include "/etc/nftables.var"
+
{| class="wikitable"
 
+
! Schlüsselwort / Variable !! Typ !! Erklärung
=Aufgabe=
+
|-
==kit Host==
+
| <code>ct state new</code> || nftables-Ausdruck || Paket-Tracking via Connection Tracking: Trifft auf neue Verbindungen zu (kein bestehendes ct-Entry)
Der Kit Host soll Vollzugriff auf die Firewall haben.
+
|-
==mail.it1xx.int==
+
| <code>iif</code> || Schlüsselwort || Eingehendes Interface (Input Interface Flag)
22/tcp  open  ssh    (openssh)) (Wir verlegen den Port auf 6666) (Partnernetz und Host  freischalten, ansonsten vpn)
+
|-
25/tcp  open  smtp  (postfix) (wird frei geschaltet)
+
| <code>$WANDEV</code> || Variable || Enthält den Namen des WAN-Interfaces (z. B. <code>eth0</code>), über das das Paket eingeht
80/tcp  open  http  (apache2)  (wird nicht frei geschaltet)
+
|-
443/tcp  open  http  (apache2)  (wird frei geschaltet)  
+
| <code>oif</code> || Schlüsselwort || Ausgehendes Interface (Output Interface Flag)
143/tcp open  imap (dovecot) (wird nicht frei geschaltet) 
+
|-
465/tcp open  smtps (postfix) (wird frei geschaltet)
+
| <code>$DMZDEV</code> || Variable || Enthält den Namen des DMZ-Interfaces (z. B. <code>eth2</code>), über das das Paket weitergeleitet wird
993/tcp open  imaps  (dovecot) (wird frei geschaltet)
+
|-
3306 /tcp open mysqld (127.0.0.1)  (mariadb)
+
| <code>ip saddr</code> || Schlüsselwort || Quelladresse auf IPv4-Ebene (Source Address)
 
+
|-
==www.it1xx.int==
+
| <code>$HOST</code> || Variable || Enthält die IPv4-Adresse des erlaubten Quell-Hosts
22/tcp  open  ssh    (openssh)) (Wir verlegen den Port auf 6666) (Partnernetz und Host freischalten, ansonsten vpn)
+
|-
80/tcp  open  http  (apache2)  (wird nicht frei geschaltet)
+
| <code>ip daddr</code> || Schlüsselwort || Zieladresse auf IPv4-Ebene (Destination Address)
443/tcp open  https  (apache2) (wird frei geschaltet)
+
|-
 
+
| <code>$WWW</code> || Variable || Enthält die IPv4-Adresse des Ziel-Webservers
==ns.it1xx.int==
+
|-
22/tcp  open  ssh    (openssh)) (Wir verlegen den Port auf 6666) (Partnernetz und Host freischalten, ansonsten vpn)
+
| <code>tcp dport 80</code> || Ausdruck || Protokoll TCP, Zielport 80 (HTTP)
53/tcp open  domain  (kan mann abschalten, eventuell freigeben für den secondary Nameserver)
+
|-
53/udp open  domain  (wird frei geschaltet)
+
| <code>accept</code> || Aktion || Paket wird akzeptiert und passiert die Regel
 
+
|}
==fw.itxx.int==
 
22/tcp  open  ssh    (openssh)) (Wir verlegen den Port auf 6666) (Partnernetz und Host freischalten, ansonsten vpn)
 
 
 
Für den Anfang schalten wir allen anderen ausgehenden Verkehr frei
 
Später gehen wir hin und werden nach und nach restriktiver.
 
=DNAT zum client=
 
define client = 172.17.113.49
 
 
 
table inet nat {
 
    ....
 
    chain forward {
 
    type filter hook forward priority filter; policy drop;
 
    ct state established,related accept
 
    ...
 
    ct state new iif $wandev oif $landev ip daddr $client tcp dport 22 accept
 
    log prefix "--nftables-drop-forward--"
 
 
 
}
 
 
 
 
 
table inet nat {
 
    chain prerouting {
 
        type nat hook prerouting priority dstnat; policy accept;
 
        ip daddr $wanip tcp dport 9922 dnat ip to $client:22
 
        .....
 
  }
 
  
 
=old stuff=
 
=old stuff=
 
*[[nftables-net-oldstuff]]
 
*[[nftables-net-oldstuff]]

Aktuelle Version vom 22. Mai 2026, 09: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 4 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.

SERVER

  • Hier stehen die internen SERVER
  • Fileserver oder LDAP 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-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

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