Nftables Netze absichern: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 137: | Zeile 137: | ||
} | } | ||
{{vorlage:nat2}} | {{vorlage:nat2}} | ||
| − | + | =Erklärungen= | |
| − | + | {| 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 daddr</code> || Schlüsselwort || Zieladresse auf IPv4-Ebene (Destination Address) | |
| − | + | |- | |
| − | ip | + | | <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 | |
| − | + | |} | |
| − | daddr | ||
| − | |||
| − | $WWW | ||
| − | |||
| − | tcp | ||
| − | |||
| − | dport | ||
| − | |||
| − | |||
| − | |||
| − | |||
=old stuff= | =old stuff= | ||
*[[nftables-net-oldstuff]] | *[[nftables-net-oldstuff]] | ||
Version vom 8. Mai 2026, 07:31 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.
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-- "
}
# NAT-Tabelle erstellen/verwenden
table ip nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
# DMZ nach $KIT - kein NAT (RETURN)
ip saddr $DMZ ip daddr $KIT return
# DMZ nach 10.88.0.0/16 - kein NAT (RETURN)
ip saddr $DMZ ip daddr 10.88.0.0/16 return
# DMZ nach außen (enp0s3) - Masquerade
ip saddr $DMZ oif $WANDEV masquerade
# LAN nach außen - Masquerade
ip saddr $LAN oif $WANDEV masquerade
# SERVER nach außen - Masquerade
ip saddr $SERVER oif $WANDEV masquerade
}
}
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 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
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.
- Wir haben das im am Anfang der Kurses schon gemacht
- Wir wollen dies nun verbessern.
- Wie stellen von masquerade auf SNAT um dies ist schneller
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
}
}
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
| 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 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 |

