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

#!/bin/bash
# Version: 1.0
# Packet: ufw
# Shellcheck: OK
# Skriptpfad: /root/scripts/
# Skriptname: sec-ufw-server.sh
# Autor: Hackspoiler
# URL: https://hackspoiler.de
# Description: Debian based OG Firewall for a sexy Server Security. Custom SSH-Port is 63007

# Set les Variablés
UFW="$(which ufw)"
IPFW="$(which iptables)"
IPFW_IPV6="$(which ip6tables)"

# Activate UFW on startup
sed -i '/ENABLED=no/c\ENABLED=yes' /etc/ufw/ufw.conf

# Deactivate IPv6
sed -i '/IPV6=yes/c\IPV6=no' /etc/default/ufw
 
# Reset Firewall-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

# Set da custom Firewall-Rules
$UFW allow in 25,53,80,123,143,443,465,587,993,63007/tcp comment 'Standard Incomming Ports'
$UFW allow out 22,25,53,80,123,143,443,587,993,63007/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'
 
# Limit da custom SSH-Connections.
$UFW limit 63007/tcp comment 'SSH-Port Rate Limit'
 
# 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         63007

# 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

Der UFW Firewall Systemd-Dienst

# /lib/systemd/system/ufw.service
[Unit]
Description=Uncomplicated firewall
Documentation=man:ufw(8)
DefaultDependencies=no
Before=network.target
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/root/scripts/sec-ufw-firewall.sh start quit
ExecStop=/lib/ufw/ufw-init stop
 
[Install]
WantedBy=multi-user.target

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.