Rocky fw: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 21: | Zeile 21: | ||
! System !! Netz !! IP !! Dienste | ! System !! Netz !! IP !! Dienste | ||
|- | |- | ||
| − | | fw. | + | | fw.it2XX.int || WAN/DMZ/LAN || siehe oben || firewalld, Kea DHCP |
|- | |- | ||
| − | | ns. | + | | ns.it2XX.int || DMZ || 10.88.2XX.21 || BIND9 (DNS) |
|- | |- | ||
| − | | http. | + | | http.it2XX.int || DMZ || 10.88.2XX.11 || Apache |
|- | |- | ||
| − | | ldap. | + | | ldap.it2XX.int || DMZ || 10.88.2XX.31 || OpenLDAP |
|- | |- | ||
| − | | client. | + | | client.it2XX.int || LAN || per DHCP || Ansible Control Node |
|} | |} | ||
| Zeile 42: | Zeile 42: | ||
! Von !! Nach !! Erlaubt !! Gesperrt | ! Von !! Nach !! Erlaubt !! Gesperrt | ||
|- | |- | ||
| − | | LAN || WAN || alles | + | | LAN || WAN || alles || — |
|- | |- | ||
| − | | LAN || DMZ || alles (SSH, DNS, HTTP | + | | LAN || DMZ || alles (SSH für Ansible, DNS, HTTP ...) || — |
|- | |- | ||
| − | | DMZ || WAN || alles | + | | 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 || | + | | 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 | + | ;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 | + | ;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 up enp0s3 | * nmcli con up enp0s3 | ||
| − | ===Tabula Rasa=== | + | === 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 1" |
| − | *nmcli con delete "Wired connection 2" | + | * nmcli con delete "Wired connection 2" |
=== enp0s8 (DMZ) === | === enp0s8 (DMZ) === | ||
| − | ; | + | ;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 | + | * 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 | + | * 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 | ||
| − | === | + | === 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. |
| − | * firewall-cmd --permanent --zone | + | |
| − | * firewall-cmd --permanent -- | + | ;LAN → WAN: Clients kommen ins Internet, Masquerading ersetzt die private Quell-IP |
| − | * firewall-cmd --permanent -- | + | * 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 --zone | + | * 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 --zone | + | * 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 === | ||
| − | |||
| − | |||
;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' | ||
| − | === | + | === ICMP überall erlauben === |
| − | ; | + | ;Ping wird in allen Zonen und Policies freigeschaltet – erleichtert die Fehlersuche im Labor |
| − | * firewall-cmd --permanent --zone=internal --add- | + | * 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 === | ||
| − | |||
* firewall-cmd --reload | * firewall-cmd --reload | ||
=== Kontrolle === | === Kontrolle === | ||
| − | |||
* 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 | + | ;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