Rocky fw: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 21: Zeile 21:
 
! System !! Netz !! IP !! Dienste
 
! System !! Netz !! IP !! Dienste
 
|-
 
|-
| fw.itXX.int || WAN/DMZ/LAN || siehe oben || firewalld, Kea DHCP
+
| fw.it2XX.int || WAN/DMZ/LAN || siehe oben || firewalld, Kea DHCP
 
|-
 
|-
| ns.itXX.int || DMZ || 10.88.2XX.21 || BIND9 (DNS)
+
| ns.it2XX.int || DMZ || 10.88.2XX.21 || BIND9 (DNS)
 
|-
 
|-
| http.itXX.int || DMZ || 10.88.2XX.11 || Apache
+
| http.it2XX.int || DMZ || 10.88.2XX.11 || Apache
 
|-
 
|-
| ldap.itXX.int || LAN || 172.26.2XX.3 || OpenLDAP
+
| ldap.it2XX.int || DMZ || 10.88.2XX.31 || OpenLDAP
 
|-
 
|-
| client.itXX.int || LAN || per DHCP || Ansible Control Node
+
| client.it2XX.int || LAN || per DHCP || Ansible Control Node
 
|}
 
|}
  
Zeile 42: Zeile 42:
 
! Von !! Nach !! Erlaubt !! Gesperrt
 
! Von !! Nach !! Erlaubt !! Gesperrt
 
|-
 
|-
| LAN || WAN || alles (Masquerading) || —
+
| LAN || WAN || alles || —
 
|-
 
|-
| LAN || DMZ || alles (SSH, DNS, HTTP, HTTPS ...) || —
+
| LAN || DMZ || alles (SSH für Ansible, DNS, HTTP ...) || —
 
|-
 
|-
| DMZ || WAN || alles (Masquerading) || —
+
| DMZ || WAN || alles || —
 
|-
 
|-
 
| WAN || DMZ || UDP+TCP/53 nur auf ns, TCP/80+443 nur auf http || alles andere
 
| WAN || DMZ || UDP+TCP/53 nur auf ns, TCP/80+443 nur auf http || alles andere
Zeile 52: Zeile 52:
 
| WAN || LAN || — || alles
 
| WAN || LAN || — || alles
 
|-
 
|-
| DMZ || LAN || TCP/636 (LDAPS) || alles andere
+
| DMZ || LAN || || alles
 
|}
 
|}
  
;LAN ist vertrauenswürdig: Aus dem internen Netz darf alles raus – sowohl ins WAN als auch in die DMZ. So kann Ansible von client.it2XX.int per SSH alle Maschinen erreichen.
+
;LAN ist vertrauenswürdig: Aus dem internen Netz darf alles raus – sowohl ins WAN als auch in die DMZ. So kann Ansible von client.it2XX.int per SSH alle DMZ-Maschinen erreichen.
 
;WAN → DMZ gezielt: Aus dem Internet kommen nur die Dienste rein, die wirklich öffentlich sein sollen – und nur auf die jeweilige Ziel-IP. Dafür werden Rich Rules verwendet.
 
;WAN → DMZ gezielt: Aus dem Internet kommen nur die Dienste rein, die wirklich öffentlich sein sollen – und nur auf die jeweilige Ziel-IP. Dafür werden Rich Rules verwendet.
;DMZ → LAN nur LDAPS: Die DMZ-Server (ns, http) authentifizieren sich über SSSD gegen den LDAP-Server im LAN. Alle anderen Verbindungen von der DMZ ins LAN sind gesperrt – ein kompromittierter DMZ-Server soll keinen freien Zugriff auf das interne Netz bekommen.
+
;DMZ → LAN gesperrt: LDAP liegt jetzt in der DMZ – kein Grund mehr für Verbindungen aus der DMZ ins LAN.
  
 
= Umsetzung =
 
= Umsetzung =
Zeile 64: Zeile 64:
  
 
=== enp0s3 (WAN) ===
 
=== enp0s3 (WAN) ===
;Die WAN-Verbindung bekommt eine feste IP im Schulungsnetz sowie Gateway und DNS des KIT-Routers
+
;Die WAN-Verbindung bekommt eine feste IP. Da die Connection bereits existiert, wird sie per mod angepasst.
* nmcli con mod enp0s3 ipv4.addresses 192.168.HS.2XX/24
+
* nmcli con mod enp0s3 ipv4.method manual ipv4.addresses 192.168.HS.2XX/24 ipv4.gateway 192.168.HS.254 ipv4.dns 192.168.HS.88
* nmcli con mod enp0s3 ipv4.gateway 192.168.HS.254
 
* nmcli con mod enp0s3 ipv4.dns 192.168.HS.88
 
* nmcli con mod enp0s3 ipv4.method manual
 
 
* nmcli con up enp0s3
 
* nmcli con up enp0s3
  
===Tabula Rasa===
+
=== Tabula Rasa ===
;Wir nennen die Connection wie die Schnittstellen
+
;Rocky legt für neue Interfaces automatisch Connections mit generischen Namen an – diese werden gelöscht
*nmcli con delete "Wired connection 1"
+
* nmcli con delete "Wired connection 1"
*nmcli con delete "Wired connection 2"
+
* nmcli con delete "Wired connection 2"
  
 
=== enp0s8 (DMZ) ===
 
=== enp0s8 (DMZ) ===
;Das DMZ-Interface bekommt die Gateway-IP für das DMZ-Netz – kein Gateway, kein DNS nötig
+
;Neue Connection mit explizitem Namen – kein Gateway, kein DNS nötig
*nmcli con add type ethernet ifname enp0s8 con-name enp0s8 ipv4.addresses 10.88.2XX.1/24 ipv4.method manual
+
* nmcli con add type ethernet ifname enp0s8 con-name enp0s8 ipv4.method manual ipv4.addresses 10.88.2XX.1/24
*nmcli con up enp0s8
+
* nmcli con up enp0s8
  
 
=== enp0s9 (LAN) ===
 
=== enp0s9 (LAN) ===
 
;Das LAN-Interface wird Gateway für alle internen Clients
 
;Das LAN-Interface wird Gateway für alle internen Clients
*nmcli con add type ethernet ifname enp0s9 con-name enp0s9 ipv4.addresses 172.26.2XX.1/24 ipv4.method manual
+
* nmcli con add type ethernet ifname enp0s9 con-name enp0s9 ipv4.method manual ipv4.addresses 172.26.2XX.1/24
*nmcli con up enp0s9
+
* nmcli con up enp0s9
 +
 
 +
=== Zonen über NetworkManager setzen ===
 +
;Der saubere Weg: NetworkManager teilt firewalld mit welche Zone ein Interface bekommt – reproduzierbar auch nach Reboot
 +
* nmcli con mod enp0s3 connection.zone external
 +
* nmcli con mod enp0s8 connection.zone dmz
 +
* nmcli con mod enp0s9 connection.zone internal
 +
* nmcli con up enp0s3
 +
* nmcli con up enp0s8
 +
* nmcli con up enp0s9
  
 
=== IP-Forwarding aktivieren ===
 
=== IP-Forwarding aktivieren ===
Zeile 98: Zeile 104:
 
* systemctl enable --now firewalld
 
* systemctl enable --now firewalld
  
=== Interfaces den Zonen zuweisen ===
+
=== Policies für inter-zone Forwarding ===
;Jedes Interface wird einer Zone zugeordnet – darüber entscheidet firewalld welche Regeln gelten
+
;In modernem firewalld regeln Policies den Verkehr zwischen Zonen – nicht die Zonen selbst. Ohne Policy wird Forwarding zwischen Zonen standardmäßig geblockt.
* firewall-cmd --permanent --zone=external --change-interface=enp0s3
+
 
* firewall-cmd --permanent --zone=dmz --change-interface=enp0s8
+
;LAN → WAN: Clients kommen ins Internet, Masquerading ersetzt die private Quell-IP
* firewall-cmd --permanent --zone=internal --change-interface=enp0s9
+
* firewall-cmd --permanent --new-policy lan-to-wan
 +
* firewall-cmd --permanent --policy lan-to-wan --add-ingress-zone internal
 +
* firewall-cmd --permanent --policy lan-to-wan --add-egress-zone external
 +
* firewall-cmd --permanent --policy lan-to-wan --set-target ACCEPT
 +
* firewall-cmd --permanent --policy lan-to-wan --add-masquerade
  
=== Masquerading ===
+
;DMZ → WAN: DMZ-Server kommen ins Internet, ebenfalls mit Masquerading
;Masquerading ersetzt die Quell-IP ausgehender Pakete durch die externe IP der Firewall – so kommen LAN und DMZ hinter einer einzigen öffentlichen Adresse ins Internet
+
* firewall-cmd --permanent --new-policy dmz-to-wan
* firewall-cmd --permanent --zone=external --add-masquerade
+
* firewall-cmd --permanent --policy dmz-to-wan --add-ingress-zone dmz
 +
* firewall-cmd --permanent --policy dmz-to-wan --add-egress-zone external
 +
* firewall-cmd --permanent --policy dmz-to-wan --set-target ACCEPT
 +
* firewall-cmd --permanent --policy dmz-to-wan --add-masquerade
  
=== LAN → alles: uneingeschränkt raus ===
+
;LAN → DMZ: Ansible und andere interne Zugriffe auf DMZ-Server
;Das interne Netz ist vertrauenswürdig – von hier darf alles raus, auch SSH für Ansible
+
* firewall-cmd --permanent --new-policy lan-to-dmz
* firewall-cmd --permanent --zone=internal --add-masquerade
+
* firewall-cmd --permanent --policy lan-to-dmz --add-ingress-zone internal
 +
* firewall-cmd --permanent --policy lan-to-dmz --add-egress-zone dmz
 +
* firewall-cmd --permanent --policy lan-to-dmz --set-target ACCEPT
  
 
=== WAN → DMZ: nur gezielt per Rich Rule ===
 
=== WAN → DMZ: nur gezielt per Rich Rule ===
;Statt ganze Dienste freizugeben, erlauben Rich Rules den Zugriff auf eine bestimmte Ziel-IP.
 
;So landet DNS-Traffic nur auf dem Nameserver und HTTP nur auf dem Webserver.
 
 
;DNS auf ns.it2XX.int (10.88.2XX.21):
 
;DNS auf ns.it2XX.int (10.88.2XX.21):
 
* firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.21" service name="dns" accept'
 
* firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.21" service name="dns" accept'
Zeile 121: Zeile 134:
 
* firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.11" service name="https" accept'
 
* firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.11" service name="https" accept'
  
=== DMZ → LAN: nur LDAPS ===
+
=== ICMP überall erlauben ===
;Die DMZ-Server müssen sich gegen LDAP im LAN authentifizieren – nur Port 636 (LDAPS) wird durchgelassen
+
;Ping wird in allen Zonen und Policies freigeschaltet – erleichtert die Fehlersuche im Labor
* firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="10.88.2XX.0/24" destination address="172.26.2XX.3" service name="ldaps" accept'
+
* firewall-cmd --permanent --zone=external --add-protocol=icmp
 +
* firewall-cmd --permanent --zone=dmz --add-protocol=icmp
 +
* firewall-cmd --permanent --zone=internal --add-protocol=icmp
 +
* firewall-cmd --permanent --policy lan-to-wan --add-protocol=icmp
 +
* firewall-cmd --permanent --policy dmz-to-wan --add-protocol=icmp
 +
* firewall-cmd --permanent --policy lan-to-dmz --add-protocol=icmp
  
 
=== Konfiguration laden ===
 
=== Konfiguration laden ===
;Alle permanent gesetzten Regeln werden erst nach reload aktiv
 
 
* firewall-cmd --reload
 
* firewall-cmd --reload
  
 
=== Kontrolle ===
 
=== Kontrolle ===
;Jede Zone einzeln prüfen – Interfaces, Services und Rich Rules müssen stimmen
 
 
* firewall-cmd --list-all --zone=external
 
* firewall-cmd --list-all --zone=external
 
* firewall-cmd --list-all --zone=dmz
 
* firewall-cmd --list-all --zone=dmz
 
* firewall-cmd --list-all --zone=internal
 
* firewall-cmd --list-all --zone=internal
 +
* firewall-cmd --info-policy lan-to-wan
 +
* firewall-cmd --info-policy dmz-to-wan
 +
* firewall-cmd --info-policy lan-to-dmz
  
 
== Kea DHCP4 für das LAN ==
 
== Kea DHCP4 für das LAN ==
Zeile 141: Zeile 160:
  
 
=== Konfiguration ===
 
=== Konfiguration ===
;Kea lauscht nur auf enp0s9 (LAN) und verteilt IPs im Bereich .100–.200. Als Gateway und DNS-Server werden fw und ns eingetragen.
+
;Kea lauscht nur auf enp0s9 (LAN) und verteilt IPs im Bereich .100–.200.
 
* vim /etc/kea/kea-dhcp4.conf
 
* vim /etc/kea/kea-dhcp4.conf
 
<pre>
 
<pre>
Zeile 157: Zeile 176:
 
     "subnet4": [
 
     "subnet4": [
 
       {
 
       {
 +
        "id": 1,
 
         "subnet": "172.26.2XX.0/24",
 
         "subnet": "172.26.2XX.0/24",
 
         "pools": [ { "pool": "172.26.2XX.100 - 172.26.2XX.200" } ],
 
         "pools": [ { "pool": "172.26.2XX.100 - 172.26.2XX.200" } ],
Zeile 174: Zeile 194:
  
 
=== Kontrolle ===
 
=== Kontrolle ===
 +
* ss -lnup | grep 67
 
* systemctl status kea-dhcp4
 
* systemctl status kea-dhcp4
 +
* journalctl -fu kea-dhcp4
 
* cat /var/lib/kea/kea-leases4.csv
 
* cat /var/lib/kea/kea-leases4.csv

Aktuelle Version vom 20. Mai 2026, 05:40 Uhr

Die Firewall

Ziel

Die Firewall trennt drei Netzbereiche voneinander: das Schulungsnetz (WAN), die DMZ und das interne LAN. Sie übernimmt gleichzeitig die Aufgaben eines Routers, eines DHCP-Servers für das LAN und kontrolliert den gesamten Netzverkehr zwischen den Zonen.

Netzplan

Interface Zone Netz IP Firewall
enp0s3 external 192.168.HS.0/24 (Schulungsnetz) 192.168.HS.2XX
enp0s8 dmz 10.88.2XX.0/24 10.88.2XX.1
enp0s9 internal 172.26.2XX.0/24 172.26.2XX.1

Feste IP-Adressen

System Netz IP Dienste
fw.it2XX.int WAN/DMZ/LAN siehe oben firewalld, Kea DHCP
ns.it2XX.int DMZ 10.88.2XX.21 BIND9 (DNS)
http.it2XX.int DMZ 10.88.2XX.11 Apache
ldap.it2XX.int DMZ 10.88.2XX.31 OpenLDAP
client.it2XX.int LAN per DHCP Ansible Control Node

Dienste auf der Firewall

firewalld
Zonenverwaltung, Paketfilterung, Masquerading
Kea DHCP4
IP-Vergabe für das LAN (172.26.2XX.0/24)

Regelwerk

Von Nach Erlaubt Gesperrt
LAN WAN alles
LAN DMZ alles (SSH für Ansible, DNS, HTTP ...)
DMZ WAN alles
WAN DMZ UDP+TCP/53 nur auf ns, TCP/80+443 nur auf http alles andere
WAN LAN alles
DMZ LAN alles
LAN ist vertrauenswürdig
Aus dem internen Netz darf alles raus – sowohl ins WAN als auch in die DMZ. So kann Ansible von client.it2XX.int per SSH alle DMZ-Maschinen erreichen.
WAN → DMZ gezielt
Aus dem Internet kommen nur die Dienste rein, die wirklich öffentlich sein sollen – und nur auf die jeweilige Ziel-IP. Dafür werden Rich Rules verwendet.
DMZ → LAN gesperrt
LDAP liegt jetzt in der DMZ – kein Grund mehr für Verbindungen aus der DMZ ins LAN.

Umsetzung

Netzwerkkonfiguration

enp0s3 (WAN)

Die WAN-Verbindung bekommt eine feste IP. Da die Connection bereits existiert, wird sie per mod angepasst.
  • nmcli con mod enp0s3 ipv4.method manual ipv4.addresses 192.168.HS.2XX/24 ipv4.gateway 192.168.HS.254 ipv4.dns 192.168.HS.88
  • nmcli con up enp0s3

Tabula Rasa

Rocky legt für neue Interfaces automatisch Connections mit generischen Namen an – diese werden gelöscht
  • nmcli con delete "Wired connection 1"
  • nmcli con delete "Wired connection 2"

enp0s8 (DMZ)

Neue Connection mit explizitem Namen – kein Gateway, kein DNS nötig
  • nmcli con add type ethernet ifname enp0s8 con-name enp0s8 ipv4.method manual ipv4.addresses 10.88.2XX.1/24
  • nmcli con up enp0s8

enp0s9 (LAN)

Das LAN-Interface wird Gateway für alle internen Clients
  • nmcli con add type ethernet ifname enp0s9 con-name enp0s9 ipv4.method manual ipv4.addresses 172.26.2XX.1/24
  • nmcli con up enp0s9

Zonen über NetworkManager setzen

Der saubere Weg
NetworkManager teilt firewalld mit welche Zone ein Interface bekommt – reproduzierbar auch nach Reboot
  • nmcli con mod enp0s3 connection.zone external
  • nmcli con mod enp0s8 connection.zone dmz
  • nmcli con mod enp0s9 connection.zone internal
  • nmcli con up enp0s3
  • nmcli con up enp0s8
  • nmcli con up enp0s9

IP-Forwarding aktivieren

Ohne IP-Forwarding leitet der Kernel keine Pakete zwischen den Interfaces weiter – die Firewall wäre kein Router
  • echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-forwarding.conf
  • sysctl -p /etc/sysctl.d/99-forwarding.conf

firewalld

Installation und Start

firewalld ist auf Rocky meist vorinstalliert, zur Sicherheit
  • dnf install -y firewalld
  • systemctl enable --now firewalld

Policies für inter-zone Forwarding

In modernem firewalld regeln Policies den Verkehr zwischen Zonen – nicht die Zonen selbst. Ohne Policy wird Forwarding zwischen Zonen standardmäßig geblockt.
LAN → WAN
Clients kommen ins Internet, Masquerading ersetzt die private Quell-IP
  • firewall-cmd --permanent --new-policy lan-to-wan
  • firewall-cmd --permanent --policy lan-to-wan --add-ingress-zone internal
  • firewall-cmd --permanent --policy lan-to-wan --add-egress-zone external
  • firewall-cmd --permanent --policy lan-to-wan --set-target ACCEPT
  • firewall-cmd --permanent --policy lan-to-wan --add-masquerade
DMZ → WAN
DMZ-Server kommen ins Internet, ebenfalls mit Masquerading
  • firewall-cmd --permanent --new-policy dmz-to-wan
  • firewall-cmd --permanent --policy dmz-to-wan --add-ingress-zone dmz
  • firewall-cmd --permanent --policy dmz-to-wan --add-egress-zone external
  • firewall-cmd --permanent --policy dmz-to-wan --set-target ACCEPT
  • firewall-cmd --permanent --policy dmz-to-wan --add-masquerade
LAN → DMZ
Ansible und andere interne Zugriffe auf DMZ-Server
  • firewall-cmd --permanent --new-policy lan-to-dmz
  • firewall-cmd --permanent --policy lan-to-dmz --add-ingress-zone internal
  • firewall-cmd --permanent --policy lan-to-dmz --add-egress-zone dmz
  • firewall-cmd --permanent --policy lan-to-dmz --set-target ACCEPT

WAN → DMZ: nur gezielt per Rich Rule

DNS auf ns.it2XX.int (10.88.2XX.21)
  • firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.21" service name="dns" accept'
HTTP und HTTPS auf http.it2XX.int (10.88.2XX.11)
  • firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.11" service name="http" accept'
  • firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" destination address="10.88.2XX.11" service name="https" accept'

ICMP überall erlauben

Ping wird in allen Zonen und Policies freigeschaltet – erleichtert die Fehlersuche im Labor
  • firewall-cmd --permanent --zone=external --add-protocol=icmp
  • firewall-cmd --permanent --zone=dmz --add-protocol=icmp
  • firewall-cmd --permanent --zone=internal --add-protocol=icmp
  • firewall-cmd --permanent --policy lan-to-wan --add-protocol=icmp
  • firewall-cmd --permanent --policy dmz-to-wan --add-protocol=icmp
  • firewall-cmd --permanent --policy lan-to-dmz --add-protocol=icmp

Konfiguration laden

  • firewall-cmd --reload

Kontrolle

  • firewall-cmd --list-all --zone=external
  • firewall-cmd --list-all --zone=dmz
  • firewall-cmd --list-all --zone=internal
  • firewall-cmd --info-policy lan-to-wan
  • firewall-cmd --info-policy dmz-to-wan
  • firewall-cmd --info-policy lan-to-dmz

Kea DHCP4 für das LAN

Installation

  • dnf install -y kea

Konfiguration

Kea lauscht nur auf enp0s9 (LAN) und verteilt IPs im Bereich .100–.200.
  • vim /etc/kea/kea-dhcp4.conf
{
  "Dhcp4": {
    "interfaces-config": {
      "interfaces": [ "enp0s9" ]
    },
    "lease-database": {
      "type": "memfile",
      "persist": true,
      "name": "/var/lib/kea/kea-leases4.csv"
    },
    "valid-lifetime": 3600,
    "subnet4": [
      {
        "id": 1,
        "subnet": "172.26.2XX.0/24",
        "pools": [ { "pool": "172.26.2XX.100 - 172.26.2XX.200" } ],
        "option-data": [
          { "name": "routers", "data": "172.26.2XX.1" },
          { "name": "domain-name-servers", "data": "10.88.2XX.21" },
          { "name": "domain-name", "data": "it2XX.int" }
        ]
      }
    ]
  }
}

Start

  • systemctl enable --now kea-dhcp4

Kontrolle

  • ss -lnup | grep 67
  • systemctl status kea-dhcp4
  • journalctl -fu kea-dhcp4
  • cat /var/lib/kea/kea-leases4.csv