# firewalld — Dynamische Firewall-Verwaltung unter Linux

> Praxis-Guide zu firewalld — Zones, Services, Ports und Rich Rules mit firewall-cmd, Runtime- und Permanent-Regeln für RHEL, Fedora und CentOS.

Source: https://www.jpkc.com/db/cheatsheets/security/firewalld/

<!-- PROSE:intro -->
firewalld ist der dynamische Firewall-Daemon von RHEL, Fedora und CentOS und wird über das Kommando `firewall-cmd` gesteuert. Unter der Haube setzt er auf nftables (früher iptables) auf und organisiert Regeln in **Zones** – Vertrauensstufen wie `public` oder `trusted`, denen du Interfaces, Services und Ports zuweist. Entscheidend ist der Unterschied zwischen **Runtime** und **Permanent**: Änderungen ohne `--permanent` gelten sofort, gehen aber bei `--reload` oder einem Reboot verloren. Dieser Guide zeigt dir die wichtigsten Befehle für den Alltag, vom Zonen-Status über Services und Ports bis zu Rich Rules und NAT.
<!-- PROSE:intro:end -->

## Status & Zones

`firewall-cmd --state` — Prüft, ob firewalld läuft.

```bash
firewall-cmd --state
```

`firewall-cmd --get-active-zones` — Zeigt aktive Zones und ihre Interfaces.

```bash
firewall-cmd --get-active-zones
```

`firewall-cmd --get-default-zone` — Zeigt die Default-Zone.

```bash
firewall-cmd --get-default-zone
```

`firewall-cmd --set-default-zone=<zone>` — Ändert die Default-Zone. Wirkt auf jedes Interface ohne explizite Zone, daher vor dem Umstellen die aktuelle Default-Zone prüfen.

```bash
firewall-cmd --set-default-zone=public
```

`firewall-cmd --list-all` — Listet alle Einstellungen der Default-Zone.

```bash
firewall-cmd --list-all
```

`firewall-cmd --zone=<zone> --list-all` — Listet alle Einstellungen einer bestimmten Zone.

```bash
firewall-cmd --zone=public --list-all
```

`firewall-cmd --get-zones` — Listet alle verfügbaren Zones.

```bash
firewall-cmd --get-zones
```

## Services

`firewall-cmd --add-service=<service>` — Erlaubt einen Service. Nur Runtime: geht bei `--reload` oder Reboot verloren. Die Zone `trusted` und freizügige `--add-service`-Regeln mit Bedacht einsetzen.

```bash
firewall-cmd --add-service=http
```

`firewall-cmd --add-service=<service> --permanent` — Erlaubt einen Service dauerhaft.

```bash
firewall-cmd --add-service=https --permanent
```

`firewall-cmd --remove-service=<service> --permanent` — Entfernt einen Service dauerhaft.

```bash
firewall-cmd --remove-service=ftp --permanent
```

`firewall-cmd --list-services` — Listet die aktuell erlaubten Services.

```bash
firewall-cmd --list-services
```

`firewall-cmd --get-services` — Listet alle verfügbaren vordefinierten Services.

```bash
firewall-cmd --get-services
```

`firewall-cmd --info-service=<service>` — Zeigt Details zu einem Service (Ports, Protokolle).

```bash
firewall-cmd --info-service=ssh
```

## Ports

`firewall-cmd --add-port=<port>/<proto> --permanent` — Öffnet einen Port dauerhaft.

```bash
firewall-cmd --add-port=8080/tcp --permanent
```

`firewall-cmd --add-port=<start>-<end>/<proto> --permanent` — Öffnet einen Port-Bereich dauerhaft.

```bash
firewall-cmd --add-port=3000-3100/tcp --permanent
```

`firewall-cmd --remove-port=<port>/<proto> --permanent` — Schließt einen Port dauerhaft.

```bash
firewall-cmd --remove-port=8080/tcp --permanent
```

`firewall-cmd --list-ports` — Listet alle offenen Ports.

```bash
firewall-cmd --list-ports
```

## Rich Rules

`firewall-cmd --add-rich-rule='rule family=ipv4 source address=<ip> accept' --permanent` — Erlaubt sämtlichen Traffic von einer bestimmten IP.

```bash
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.5 accept' --permanent
```

`firewall-cmd --add-rich-rule='rule family=ipv4 source address=<ip> drop' --permanent` — Blockiert sämtlichen Traffic von einer bestimmten IP.

```bash
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.100 drop' --permanent
```

`firewall-cmd --add-rich-rule='rule family=ipv4 source address=<ip> port port=<port> protocol=tcp accept' --permanent` — Erlaubt einer bestimmten IP den Zugriff auf einen Port.

```bash
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 port port=3306 protocol=tcp accept' --permanent
```

`firewall-cmd --list-rich-rules` — Listet alle Rich Rules.

```bash
firewall-cmd --list-rich-rules
```

`firewall-cmd --remove-rich-rule='<rule>' --permanent` — Entfernt eine Rich Rule.

```bash
firewall-cmd --remove-rich-rule='rule family=ipv4 source address=10.0.0.5 accept' --permanent
```

## Masquerade & Forwarding

`firewall-cmd --add-masquerade --permanent` — Aktiviert Masquerading (NAT).

```bash
firewall-cmd --add-masquerade --permanent
```

`firewall-cmd --add-forward-port=port=<src>:proto=tcp:toport=<dest> --permanent` — Leitet einen lokalen Port auf einen anderen lokalen Port weiter.

```bash
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
```

`firewall-cmd --add-forward-port=port=<src>:proto=tcp:toaddr=<ip>:toport=<dest> --permanent` — Leitet einen Port an einen entfernten Host weiter.

```bash
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080 --permanent
```

`firewall-cmd --query-masquerade` — Prüft, ob Masquerading aktiv ist.

```bash
firewall-cmd --query-masquerade
```

## Runtime vs. Permanent

`firewall-cmd --reload` — Lädt die Firewall neu und wendet die Permanent-Regeln an. Nicht persistierte Runtime-Änderungen gehen dabei verloren – wer dauerhafte Regeln will, kombiniert `--permanent` mit einem anschließenden `--reload`.

```bash
firewall-cmd --reload
```

`firewall-cmd --runtime-to-permanent` — Speichert die aktuellen Runtime-Regeln als Permanent.

```bash
firewall-cmd --runtime-to-permanent
```

`firewall-cmd --panic-on` — Aktiviert den Panic-Modus (blockiert sämtlichen Traffic). Kappt sofort auch bestehende Verbindungen – auf einem Remote-Server sperrst du damit deine eigene SSH-Sitzung aus.

```bash
firewall-cmd --panic-on
```

`firewall-cmd --panic-off` — Deaktiviert den Panic-Modus.

```bash
firewall-cmd --panic-off
```

`firewall-cmd --complete-reload` — Vollständiger Reload, der alle Runtime-Regeln verwirft.

```bash
firewall-cmd --complete-reload
```

<!-- PROSE:outro -->
## Fazit

firewalld nimmt dir die nftables-Syntax ab und macht aus Firewall-Verwaltung ein Spiel mit Zones, Services und Ports. Die häufigste Stolperfalle bleibt der Unterschied zwischen Runtime und Permanent: Teste eine Regel ruhig erst zur Laufzeit, schreibe sie aber mit `--permanent` fest und lade die Firewall neu, sobald sie sitzt – sonst ist sie nach dem nächsten Reboot weg.

## Weiterführende Links

- [firewalld – offizielle Dokumentation](https://firewalld.org/documentation/) – Konzepte, Zones und Beispiele (englisch)
- [firewall-cmd(1) – Manpage](https://man7.org/linux/man-pages/man1/firewall-cmd.1.html) – alle Optionen im Überblick (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [age](https://www.jpkc.com/db/cheatsheets/security/age/) – moderne, einfache Datei-Verschlüsselung
- [clamav](https://www.jpkc.com/db/cheatsheets/security/clamav/) – Open-Source-Virenscanner
- [fail2ban](https://www.jpkc.com/db/cheatsheets/security/fail2ban/) – sperrt IPs nach fehlgeschlagenen Login-Versuchen

