FirewallFabrik
FirewallFabrik (fwf) ist der Nachfolger von Firewall Builder (fwbuilder) und ein zentrales Tool für Design, Kompilierung und Deployment von Firewall-Policies auf mehreren Firewalls gleichzeitig. Das Programm ist in Python (ab 3.14) und Qt6 (PySide6) geschrieben und steht unter der GPLv2+-Lizenz. FirewallFabrik ist kein Firewall-Appliance, sondern ein Regelgenerator: Policies werden in einer grafischen Oberfläche per Drag-and-Drop erstellt, kompiliert und anschliessend per SSH/SCP auf die Ziel-Firewalls verteilt.
Unterstützte Backends:
iptables (Netfilter)
nftables
- Links:
Tipp
Was ist der Unterschied zwischen der Direction-Angabe „Inbound“, „Outbound“ und „Both“? Die übersetzten Rules - hier für iptables.
any > myhost:
Inbound:
INPUT -i eth0Outbound:
OUTPUT -o eth0 -d myhostBoth:
INPUT -i eth0; OUTPUT -o eth0 -d myhost
myhost > any:
Inbound:
INPUT -i eth0 -s myhost; FORWARD -i eth0 -s myhostOutbound:
OUTPUT -o eth0Both:
INPUT -i eth0 -s myhost; FORWARD -i eth0 -s myhost; OUTPUT -o eth0
Installation
Voraussetzung ist Python >= 3.14.
- uv (empfohlen)
# einmalig starten ohne Installation uvx --from 'firewallfabrik[gui]' fwf # oder fest installieren uv tool install 'firewallfabrik[gui]'
- pipx
pipx install 'firewallfabrik[gui]'
- pip
pip install --user 'firewallfabrik[gui]'
Das Extra [gui] installiert PySide6 für die grafische Oberfläche. Ohne [gui] stehen nur die CLI-Compiler fwf-ipt und fwf-nft zur Verfügung.
Desktop-Integration unter Linux:
cp assets/ch.linuxfabrik.firewallfabrik.desktop $HOME/.local/share/applications/
cp src/firewallfabrik/gui/ui/Icons/firewallfabrik.svg $HOME/.local/share/icons/hicolor/scalable/apps/
CLI-Tools
fwfGrafische Oberfläche (Qt6).
fwf-iptKommandozeilen-Compiler für iptables. Kompiliert eine
.fwf- oder.fwb-Datei zu einem Shell-Skript mit iptables-Kommandos. Akzeptiert mehrere Firewall-Namen und ein--all-Flag, um alle iptables-Firewalls in der Datenbank in einem Durchgang zu kompilieren.fwf-nftKommandozeilen-Compiler für nftables. Kompiliert eine
.fwf- oder.fwb-Datei zu einem nft-Batch-File. Akzeptiert mehrere Firewall-Namen und ein--all-Flag, um alle nftables-Firewalls in der Datenbank in einem Durchgang zu kompilieren.
Dateiformat
FirewallFabrik verwendet .fwf-Dateien im YAML-Format. Diese sind menschenlesbar und eignen sich für die Versionskontrolle mit Git. Intern arbeitet FirewallFabrik mit einer SQLite-Datenbank im Arbeitsspeicher (via SQLAlchemy).
Bestehende .fwb-Dateien (Firewall Builder XML) können importiert und beim Speichern automatisch in das .fwf-Format konvertiert werden.
Objekt-Modell
Alle Regeln werden auf benannte Objekte aufgebaut (keine rohen IP-Adressen in Regeln). Objekte können über mehrere Firewalls und Regelsätze hinweg wiederverwendet werden.
- Adress-Objekte
Firewall (mit Interfaces, Policy-/NAT-/Routing-Regelsätzen)
Cluster (Hochverfügbarkeit mit mehreren Member-Firewalls)
Host
Network
Address Range
IPv4/IPv6 Addresses
DNS Name
Address Table (extern ladbare Adresslisten)
Dynamic Groups (kriterienbasierte Gruppen, die automatisch passende Objekte enthalten)
Object Groups
- Service-Objekte
TCP, UDP (mit Port-Ranges)
ICMP, ICMPv6
IP-Protokolle
Custom Services
Service Groups
- Time-Objekte
Wiederkehrende Zeitfenster (Tageszeit, Wochentag) für zeitbasierte Regeln.
Regelwerk
Jede Firewall besitzt drei Typen von Regelsätzen:
- Access Policy
Filterregeln für Traffic. Regel-Elemente: Source, Destination, Service, Interface, Direction (Inbound/Outbound/Both), Time. Aktionen: Accept, Deny, Reject, Accounting, Queue, Custom, Branch (Sprung in anderen Regelsatz), Continue. First-Match-Prinzip.
- NAT
Adress- und Port-Übersetzung: SNAT, DNAT, Masquerade, Redirect, Load Balancing, SDNAT, NONAT.
- Routing
Statische Routen mit ECMP-Unterstützung (Equal Cost Multi Path).
Die Regelverarbeitung unterstützt Negation, IPv4/IPv6-Dual-Stack (ein Regelsatz generiert beide Konfigurationen), Rule Shadowing Detection (Erkennung von Regeln, die nie matchen) und Logging pro Regel.
Custom Services
Beispiel: es soll die Regel iptables -I INPUT -m geoip ! --src-cc CH -j DROP abgebildet werden, also das xtables GeoIP-Modul verwendet und Traffic ausserhalb der Schweiz geblockt werden.
Service > Custom > Add
Name: „IP from CH“
Code String:
-m geoip --src-cc CH
Connection Tracking
Connection Tracking ist ein stateful Firewalling-Mechanismus, der Pakete, die zu einer erlaubten Verbindung gehören, ohne eine explizite Regel durch die Firewall lässt, z.B. TCP ACK-Pakete. Solche Pakete werden als RELATED markiert und können somit generell durchgelassen werden. In FirewallFabrik geschieht dies über die „Firewall Settings“ > „Accept ESTABLISHED and RELATED packets before the first rule“.
Das Connection Tracking kann durch Helper-Module erweitert werden, z.B. für FTP. Ab Kernel v4.7+ (also RHEL8+) werden aus Sicherheitsgründen die Helper-Module nicht mehr automatisch aktiviert:
sysctl net.netfilter.nf_conntrack_helper
# net.netfilter.nf_conntrack_helper = 0
# 0 => disabled
# 1 => enabled
Die Module müssen nun explizit für einen Port aktiviert werden:
iptables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp
FirewallFabrik unterstützt das Einrichten von raw Regeln leider nicht direkt. Das obige Kommando kann aber per „Firewall Settings > „Prolog/Epilog“ als Prolog ausgeführt werden. Wichtig ist dabei, dass „Insert prolog script“ auf „after policy reset“ steht.
Alternativ kann auch das alte Verhalten, d.h. die automatische Aktivierung der Helfer-Module, wieder aktiviert werden:
echo 'net.netfilter.nf_conntrack_helper = 1' >> /etc/sysctl.conf
sysctl -p
Kompilierung und Deployment
- Kompilierung
Der Compiler übersetzt die grafisch erstellten Policies in ausführbare Shell-Skripte (
.fw). Die Ausgabe ist idempotent - das Skript kann gefahrlos mehrfach angewendet werden, da es zuerst alle Regeln flusht und dann neu aufbaut. Die GUI kompiliert mehrere Firewalls parallel (bis zur Anzahl CPU-Kerne), die CLI-Compiler laden die Datenbank einmal und kompilieren sequenziell.Einzelne Regeln können mit der Taste
Xdirekt im Editor testweise kompiliert werden, um die generierten Kommandos zu prüfen.- Deployment
Automatisch: SSH/SCP über die eingebaute Installer-Funktion (unterstützt Sudo, Key-basierte Authentifizierung, alternative SSH-Ports, Batch-Installation auf mehrere Firewalls)
Manuell: generiertes
.fw-Skript per SCP kopieren und per SSH ausführenCI/CD: generierte Skripte lassen sich in Ansible, GitLab CI, GitHub Actions o.ä. integrieren
Installer via Non-Root User mit Sudo
Falls man die Firewalls nicht direkt mit dem root-User verteilen will oder kann, genügt auch ein Standard-Benutzer, solange dieser sudo ohne Passwort verwenden darf.
Dazu muss in der jeweiligen Firewall unter Firewall Settings im Tab Installer folgendes gesetzt sein:
Directory on the firewall where script should be installed:
/tmpA command that installer should execute on the firewall in order to activate the policy:
sudo mv /tmp/fwf.sh /etc/fwf.sh && sudo chown root:root /etc/fwf.sh && if command -v restorecon 1> /dev/null; then sudo restorecon -F /etc/fwf.sh; fi && sudo /etc/fwf.sh
FirewallFabrik als Systemd-Service
[Unit]
Description=FirewallFabrik
After=default.target openvpn-server@server.service fail2ban.service
[Service]
Type=oneshot
ExecStart=/etc/fwf.sh start
ExecStop=/etc/fwf.sh stop
ExecReload=/etc/fwf.sh start
RemainAfterExit=yes
[Install]
WantedBy=default.target
Pro- und Epilog für OpenVPN und Fail2ban
Wenn FirewallFabrik gestartet wird, die OpenVPN-Schnittstelle tun0 verwendet, aber noch nicht bereit ist, wird der Start des .fw-Skriptes fehlschlagen. Es wird daher empfohlen, im Prolog zu warten, bis das Interface verfügbar ist.
Andere Probleme treten im Zusammenspiel mit Fail2Ban auf: Die Chains und Regeln von Fail2Ban werden beim (Re-)Start von FirewallFabrik gelöscht. Daher muss Fail2Ban im Prolog gestoppt und im Epilog wieder gestartet werden.
Die folgenden Skripte können auf allen Servern eingerichtet werden, da zuerst geprüft wird, ob OpenVPN oder Fail2Ban vorhanden und aktiv ist.
Bemerkung
Unter Debian ist /bin/sh ein Link zu dash, das heisst, die Skripte müssen zwingend POSIX kompatibel sein. Erweitere Features wie if [[ ... ]] funktionieren in den Prolog- und Epilog-Skripten daher nicht. Unter RHEL zeigt /bin/sh dagegen auf bash.
### Wait for OpenVPN interface ###
# returns 1 either if the service is disabled, or if it does not exist
if systemctl is-enabled openvpn-server@server.service > /dev/null 2>&1; then
log 'Enabled OpenVPN Server found, waiting for the OpenVPN interface'
device="tun0"
timeout=60
found=0
while [ $timeout -gt 0 ]; do
if ip link show $device > /dev/null 2>&1; then
found=1
break
else
timeout=$((timeout-=1))
sleep 1
fi
done
if [ "$found" -eq 0 ]; then
log "Cannot find $device! Trying to run the fwf script regardless..."
else
log "Found $device! Continuing with the fwf script..."
fi
fi
### Kill fail2ban ###
stopped_fail2ban=0
if systemctl is-active fail2ban.service > /dev/null 2>&1; then
stopped_fail2ban=1
systemctl stop --signal SIGKILL fail2ban
log "fail2ban.service killed, continuing with fwf script..."
else
log "fail2ban not running, continuing with fwf script..."
fi
if [ "$stopped_fail2ban" -eq 1 ]; then
log "Restarting fail2ban.service"
systemctl restart fail2ban
fi
Log-Dateien auf DENY untersuchen
grep DENY /var/log/messages* | grep -Ev '(FIN|SYN|RST|ACK)'
Dead Man’s Switch
Wenn man Firewalls auf Systeme verteilt, auf die man keinen physischen (oder virtuellen Hypervisor-)Zugriff hat, will man unbedingt vermeiden, sich selbst auszusperren. Zu diesem Zweck kann man einen Job auf dem Host erstellen, der die Firewall nach z.B. 10 Minuten wieder deaktiviert. Falls das Deployment und der Zugriff erfolgreich waren, kann der Job entfernt werden. Falls es Probleme gibt, müssen einfach die 10 Minuten abgewartet werden.
dnf install at nftables
systemctl enable --now atd.service
echo /usr/sbin/nft flush ruleset | at now +10 minutes
# job 2 at Wed Aug 13 12:03:00 2025
# remember the job id and deploy the firewall
# if the access works, remove the job
atrm 2
# double-check the at queue
atq
Migration von Firewall Builder
Bestehende
.fwb-Datei in FirewallFabrik öffnen.Die Datei wird automatisch importiert und in das interne Format konvertiert.
Beim Speichern wird eine
.fwf-Datei (YAML) erzeugt.Alle Objekte, Regeln und Firewall-Definitionen werden übernommen.
Built on 2026-03-09