Skip to main content

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.

UFW Firewall-Repository

sec-ufw-server.sh