UFW (Uncomplicated Firewall) ist ein überaus einfaches, aber dennoch stabiles Open-Source (GPLv3) Firewall-Frontend, das die verflochtene Komplexität des alteingesessenen Türstehers iptables um ein vielfaches down-minimiert. Aus dem Grund der Einfachheit gibt es hier ein kleines, Debian-basiertes Firewall-Skript. Das Vorführskript stammt von einem Ubuntu 18.04 Root-Server, der einen Webserver und einen knuffigen Mail-Server beheimatet.
Was genau macht dieses Firewall-Skript? Das Skript aktiviert zuerst die Firewall beim booten (tschüsch), deaktiviert das auf dem Vorführserver nicht benötigte IPv6 (optional), resettet die Firewall-Regeln damit alles fresh ist, setzt das Firewall-Logging auf „low“, damit das Logfile nicht vollgeballert wird, dann wird die strengere Firewall-Richtlinie gesetzt (erst einmal alles verbieten), dann wiederum werden die eigenen Firewall-Regeln gesetzt, dann gibt es auf dem SSH-Port (hier 63007) ein Rate-Limit (ab 6 Connection-Versuchen innerhalb 30 Sekunden wird IP gedroppt) gegen fiese Brute-Force-Attacken. Am Ende des Skripts wird die Firewall sharp geschaltet und es gibt noch ein wenig Dokumentation zu den benutzen Ports und zu wichtigen UFW-Befehlen.
Damit man das Skript über den Systemd-Dienst steuern kann, wird die schon vorhandene UFW-Systemd-Konfiguration missbraucht und mit dem Pfad (ExecStart) zum Firewall-Skript angepasst. Zuguterletzt wird der Systemd-Deamon noch einmal schön durchreloaded.
UFW-Firewall installieren
apt install ufw
Das UFW Firewall-Skript
#!/usr/bin/env bash #========================================================== # Autor: Hackspoiler # URL: https://hackspoiler.de # Scriptname: sec-ufw-server.sh # Scriptpath: /root/server-scripts/ # Usage: sec-ufw-server.sh # Version: 1.0 # Date: 03.02.2021 # Shellcheck: True # Package: ufw # Modification: 09.04.2023 # Descritpion: Debian based OG Firewall for a sexy Server Security. Custom SSH-Port is 63007 #========================================================== # Set Bash-Defaults set -o errexit # Beenden, falls ein Befehl fehlschlägt set -o nounset # Beenden, falls ungesetzte Variable geused wird set -o pipefail # Beenden, falls eine Pipeline fehlschlägt # Set les Variablés readonly UFW="$(command -v ufw)" readonly IPFW="$(command -v iptables)" readonly IPFW_IPV6="$(command -v ip6tables)" # Activate UFW on startup sed -i '/ENABLED=no/c\ENABLED=yes' /etc/ufw/ufw.conf # Deactivate IPv6 if nix needed # sed -i '/IPV6=yes/c\IPV6=no' /etc/default/ufw # Reset Feuerwand-Settings "${UFW}" --force reset "${IPFW}" -F "${IPFW}" -X "${IPFW_IPV6}" -F "${IPFW_IPV6}" -X # Activate Logging "${UFW}" logging low # Set stabile Firewall-Policies "${UFW}" default deny incoming "${UFW}" default deny outgoing "${UFW}" default deny forward # Limit custom SSH-Connections. "${UFW}" limit 60007/tcp comment 'SSH-Port Rate Limit' # Set da custom Firewall-Rules "${UFW}" allow in 25,53,80,123,143,443,465,587,993,60007/tcp comment 'Standard Incomming Ports' "${UFW}" allow out 22,25,53,80,123,143,443,587,993,60007/tcp comment 'Standard Outgoing Ports' "${UFW}" allow in 53,123/udp comment 'Allow NTP and DNS in' "${UFW}" allow out 53,123/udp comment 'Allow NTP and DNS out' # Enable this super-crispy Firewall "${UFW}" --force enable #------------------------------------------ # Documentation #------------------------------------------ # Default Rules/Policy #------------------------------------------ # /etc/ufw/before.rules # /var/lib/ufw/user.rules # /etc/ufw/after.rules # Default Policy: deny (incoming), allow (outgoing), deny (routing) # Used Ports #------------------------------------------ # OpenSSH TCP 22 # OpenSSH Custom TCP 60007 # DNS-Server TCP/UDP 53 # HTTP(S) TCP 80/443 # NTP TCP/UDP 123 # Postfix SMTP TCP 25 # Postfix SMTPS TCP 465 # Postfix Submission TCP 587 # Dovecot IMAP TCP 143 # Dovecot IMAPS TCP 993 #https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports #------------------------------------------ # Common UFW Commands #------------------------------------------ # UFW Control #------------------------------------------ # ufw (enable|disable|reset) # Set a strong Firewall-Policy #------------------------------------------ # ufw default deny # Set da fresh Logging #------------------------------------------ # ufw logging (off|low|medium|high|full) # Show Infos #------------------------------------------ # ufw show (raw|listening) # ufw status (verbose|numbered) # Delet a special Rule #------------------------------------------ # ufw delete $NUMBER # ufw delete deny 80/tcp # Allow special Port-Range #------------------------------------------ # ufw allow 3000:3005/tcp comment 'Allow Port-Range' # Allow $IP for SSH-Sessions #------------------------------------------ # ufw allow from $IP to any port 63007 comment 'Subnet - FFM' # Whitelist a $IP - Its important to set it above the deny-Rules #------------------------------------------ # ufw insert 1 allow from $IP comment 'Whitelist $IP' # Allow a $IP-Subnet to a special Port #------------------------------------------ # ufw allow from $IP/$CIDR to any port 63007 comment 'Subnet - FFM' # Limit Port/Connection against Brute-Force-Attacks. Customize the Rate Limit in /etc/ufw/user.rules #------------------------------------------ # ufw limit $PORT/$PROTOCOL comment 'Rate Limit Port/$PROTOCOL' # Show da UFW-Rule Result before apply dem roughly #------------------------------------------ # ufw --dry-run # ufw --dry-run limit ssh # Aktuelle Rules anzeigen #------------------------------------------ # ufw show listening # ufw show added
Der UFW Firewall Systemd-Dienst
# /lib/systemd/system/ufw.service [Unit] Description=Uncomplicated firewall Documentation=man:ufw(8) DefaultDependencies=no # Keine standardmäßigen Abhängigkeiten verwenden Before=network.target # Vor dem Netzwerkziel ausführen Conflicts=shutdown.target # Automatisches Beenden des Dienstes beim Herunterfahren After=syslog.target # Starte nach dem Syslog-Ziel [Service] Type=oneshot # Der Dienst wird einmalig ausgeführt und beendet nicht RemainAfterExit=yes # Der Dienst bleibt nach dem Beenden aktiv ExecStart=/bin/bash /root/server-scripts/sec-ufw-server.sh # Führe das benutzerdefinierte Firewall-Skript aus ExecStop=/usr/sbin/ufw --force disable # Deaktiviere die Firewall zwangsweise [Install] WantedBy=multi-user.target # Beim multi-user.target aktivieren Alias=ufw.service # Erstelle einen Alias für den Dienst
Systemd-Deamon reloaden
systemctl daemon-reload
PS: Es versteht sich von selbst das Skripte immer zuerst durchgetestet werden bevor diese in die freie Wildbahn gelassen werden, da es sonst vorkommen kann, dass man selber nicht mehr auf den Server draufkommt.