Firewall Builder

Firewall Builder (fwbuilder, fwb) ist ein Regelgenerator mit intuitiver Drag-and-Drop-Oberfläche für Linux, Windows und macOS, der vor allem in komplexen Umgebungen nützlich ist. Das Programm ist in C und Qt geschrieben. Es gehört mit über zehn Jahren mehr oder weniger kontinuierlicher Entwicklungszeit zu den Dinosauriern unter den GUI-Tools für Firewalls. Unterstützte Firewalls und Userspace-Utilities sind:

  • Cisco ASA / Cisco PIX

  • Cisco FWSM

  • Cisco Router IOS ACL

  • HP ProCurve ACL

  • ipfilter

  • ipfw

  • iptables

  • PF

firewalld- und nftables-Syntax wird nicht unterstützt - für letzteres hilft unser Patch (siehe weiter unten).

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 eth0

  • Outbound: OUTPUT -o eth0 -d myhost

  • Both: INPUT -i eth0; OUTPUT -o eth0 -d myhost

myhost > any:

  • Inbound: INPUT -i eth0 -s myhost; FORWARD -i eth0 -s myhost

  • Outbound: OUTPUT -o eth0

  • Both: INPUT -i eth0 -s myhost; FORWARD -i eth0 -s myhost; OUTPUT -o eth0

Installation und Konfiguration

FwBuilder 5.3

Damit Fwbuilder 5.3.7 unter Fedora 34+ funktioniert, geht man wie folgt vor:

VER=5.3.7-60.118
wget http://download.opensuse.org/repositories/security/openSUSE_Tumbleweed/x86_64/fwbuilder-$VER.x86_64.rpm
sudo rpm --install --file --nodeps fwbuilder-$VER.x86_64.rpm
# or
sudo rpm --upgrade --file --nodeps fwbuilder-$VER.x86_64.rpm

Das SRPM liegt auf http://download.opensuse.org/repositories/security/SLE_15_SP2/src/

FwBuilder 5.1

Damit Fwbuilder 5.1 unter Fedora 30+ funktioniert, geht man wie folgt vor:

sudo dnf -y install net-snmp-libs
wget http://download.opensuse.org/repositories/security/SLE_11_SP4/x86_64/fwbuilder-5.1.0.3599-31.1.x86_64.rpm
sudo rpm --install --file --nodeps fwbuilder-5.1.0.3599-31.1.x86_64.rpm
sudo ln -s /usr/lib64/libnetsnmp.so.30 /usr/lib64/libnetsnmp.so.40.1.0
sudo ln -s /usr/lib64/libssl.so.1.1.1k /usr/lib64/libssl.so.10
sudo ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.10

Fwbuilder als Systemd-Service

/etc/systemd/system/fwb.service
[Unit]
Description=Firewall Builder
After=default.target openvpn-server@server.service fail2ban.service

[Service]
Type=oneshot
ExecStart=/etc/fwb.sh start
ExecStop=/etc/fwb.sh stop
ExecReload=/etc/fwb.sh start
RemainAfterExit=yes

[Install]
WantedBy=default.target

Pro- und Epilog für OpenVPN und Fail2ban

Wenn Fwbuilder gestartet wird, aber die OpenVPN-Schnittstelle tun0 noch nicht bereit ist, wird Fwbuilder 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 Fwbuilder 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.

Prolog
### 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 fwb script regardless..."
    else
        log "Found $device! Continuing with the fwb 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 fwb script..."
else
    log "fail2ban not running, continuing with fwb script..."
fi
Epilog
if [ "$stopped_fail2ban" -eq 1 ]; then
    log "Restarting fail2ban.service"
    systemctl restart fail2ban
fi

Fwbuilder und nftables

Firewall Builder beherrscht noch kein nftables, was z.B. ab RHEL 8 zum Einsatz kommt. Folgender Patch auf der eigenen Maschine, die FwBuilder ausführt, hilft:

cat << 'EOF' | sudo tee /usr/local/bin/fwb_nft
#!/usr/bin/env bash

args="$@"

while [[ $# -gt 0 ]]
do
    key="$1"

    case $key in
        -d)
            OUTPUT_DIR="$2"
            shift # past argument
            shift # past value
            ;;
        -o)
            OUTPUT_FILE="$2"
            shift # past argument
            shift # past value
            ;;
        *)    # unknown option
            shift # past argument
            ;;
    esac
done

FWB_IPT=$(which fwb_ipt)
"$FWB_IPT" $args

sed --in-place '/^reset_all()/{N;s/$/\n    nft flush ruleset/}' "$OUTPUT_DIR/$OUTPUT_FILE"
echo 'Adjusted for nftables'
EOF
chmod +x /usr/local/bin/fwb_nft

Unter macOS muss das Script folgendermassen aussehen und gsed muss installiert sein (brew install gsed):

#!/usr/bin/env bash

args="$@"

while [[ $# -gt 0 ]]
do
    key="$1"

    case $key in
    -d)
        OUTPUT_DIR="$2"
        shift # past argument
        shift # past value
        ;;
    -o)
        OUTPUT_FILE="$2"
        shift # past argument
        shift # past value
        ;;
    *)    # unknown option
        shift # past argument
        ;;
    esac
done

FWB_IPT="/Applications/Firewall Builder.app/Contents/MacOS/fwb_ipt"
"$FWB_IPT" $args

/usr/local/bin/gsed --in-place '/^reset_all()/{N;s/$/\n    nft flush ruleset/}' "$OUTPUT_DIR/$OUTPUT_FILE"
echo 'Adjusted for nftables'

Danach im Firewall Builder einfach den Compiler für die RHEL 8-basierte Firewalls auf „Firewall > Firewall Settings > Compiler > Compiler: /usr/local/bin/fwb_nft setzen.

FwBuilder Installer via Non-Root User mit Sudo

Falls man die Firewalls nicht direkt mit dem root-User deployen will oder kann, reicht auch ein normaler User, 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: /tmp

  • A command that installer should execute on the firewall in order to activate the policy: sudo mv /tmp/fwb.sh /etc/fwb.sh && sudo chown root:root /etc/fwb.sh && if command -v restorecon 1> /dev/null; then sudo restorecon -F /etc/fwb.sh; fi && sudo /etc/fwb.sh

FwBuilder und Custom Modules

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

Log-Dateien auf DENY untersuchen

grep DENY /var/log/messages* | grep -Ev '( FIN | SYN | RST | ACK )'

Troubleshooting

Firewall lässt sich grafisch nicht mehr editieren, Doppelklick geht nicht, Objekte lassen sich nicht verschieben usw.?

Einträge zur spezifische fwb-Datei im Config-File sind wohl kaputt. Was hilft: Firewall Builder beenden, und alle Zeilen, die auf die betroffene fwb-Datei verweisen (bei mir zum Beispiel git\linuxfabrik\fwbuilder\4711\4711.fwb), aus der Datei $HOME/.config/netcitadel.com/FirewallBuilder*.conf entfernen.

Built on 2024-04-18