Linux ist für die Rolle als Server prädestiniert – egal ob es sich dabei um ein System handelt, das speziell als Server abgestellt wird oder auch als Arbeitsrechner dient. Keinen geringen Anteil daran hat das Paketfilter-Modul des Linux-Kernels, das über „iptables“ konfiguriert wird. In vielen Fällen dienen die damit definierten Regeln auf einem Server oder Routersystem einfach dazu, bestimmte Pakete durchzulassen und andere zu blockieren. In diesem Beitrag geht es um praktische Regelsets, die mehr machen, als nur erlauben und verbieten. So kann Iptables mit einer geschickten Verkettung von Filtern Portscanner ausbremsen. Zusammen mit dem Tool Knockd auf einem Client lassen sich außerdem Dienste verstecken und deren Ports bei Bedarf von außen öffnen. Die praktischen Beispiele können die Gesamtsicherheit des eigenen exponierten Linux-Servers verbessern, auch wenn es sich nur um einen Raspberry Pi handelt, der als Gateway ins heimische Netzwerk dient.
Siehe auch: Profi-Tricks für Ihren Router unter Linux
Grundlagen: Regeln mit Iptables
Eines vorweg: Die Syntax von Iptables wird schnell anspruchsvoll. Konfigurationstools wie das Kommandozeilenprogramm ufw von Debian, Ubuntu und Raspbian vereinfachen die Einrichtung von Regelsets zwar, ohne dass man sich um die genaue Iptables-Syntax den Kopf zerbrechen müsste (siehe dazu weiter unten). Das hat jedoch seinen Preis. Denn kompliziertere Regeln sind mit ufw nicht möglich oder verlangen wiederum Ausnahmen, die schnell umständlicher werden als die eigentlichen Iptables-Regeln. Wir lassen deshalb Hilfstools wie ufw komplett links liegen und zeigen den Weg zu Fuß mit Iptables-Befehlen. Dabei gehen wir davon aus, dass noch keine Filterregeln auf dem Linux-System aktiv sind. Der erste Schritt ist mittels
sudo ufw disable
das Abschalten von ufw auf Debian/Ubuntu-Distributionen.
Ausgescannt: Portscanner reinlegen

Ein Portscan von außen mittels Nmap oder Zenmap gegen einen Server offenbart schnell, welche Dienste dort auf welchen Ports laufen. Mit einem Regelset für Iptables ist es möglich, typische Portscans zu erkennen und deren Pakete zu verwerfen. Ein Portscan wird damit ungleich mühsamer, langwierig und viele werden dabei schnell aufgeben. Scripts, die Ergebnisse von automatisierten Scans sammeln, werden keine brauchbaren Daten über die offenen Ports des Serversystems finden. Die Vorgehensweisen von Portscannern wie Nmap lassen sich grob in fünf Methoden einteilen. SYN-Scanning: Dies ist die Standardmethode, mit der Portscanner einen Server nach offenen Ports abklopfen. Der Client startet eine TCP-Verbindung mit einem Paket, das den Flag „SYN“ gesetzt hat, und versucht so, auf regulärem Weg eine Verbindung zu starten. Es handelt sich um einen kaum zu verschleiernden Scan, wenn damit ganze Portbereiche abgeklappert werden. ACK-Scanning: Diese Art von Scan tarnt sich schon besser, um unentdeckt zu bleiben. Der Portscanner schickt an den Server TCP-Pakete mit dem „ACK“-Flag. Diese Pakete dienen im Protokoll TCP üblicherweise dazu, eine Verbindungsaufnahme zu bestätigen. Der Server sendet daraufhin ein RST-Paket zurück. Eine aktive Firewall würde das ACK-Paket verwerfen und folglich nicht antworten. Diese Methode kann also herausfinden, ob eine Firewall einen Port schützt. Nullscan: Ein Portscanner sendet hier TCP-Pakete ganz ohne Flag an das anvisierte Serversystem. Wenn eine Firewall wegen der fehlenden Flags nicht darauf anspringt und die Pakete annimmt, so kann der Nullscan dazu dienen, offene Ports zu finden. Xmas-Tree-Scan: Im Gegensatz zum Nullscan sendet diese Methode Netzwerkpakete, in welchen jeweils alle TCP-Flags gesetzt sind. Dieser Scan bricht mit den Konventionen von TCP, nutzt aber eine Ausnahmeregel dieses Protokolls aus. Denn Systeme sollen Paketsegmente, die so aus der Reihe tanzen, mit einem RST-Paket beantworten, um die Verbindung wieder zu synchronisieren. Das Ziel ist, damit ein Profil des Zielsystems erstellen zu können. Der ulkige Name des Scans stammt von der Analyse solcher Pakete mit einem Netzwerksniffer. Die Vielzahl der gesetzten Flags ähnelt dort in der Visualisierung einer auffälligen Weihnachtsbeleuchtung. FIN-Scanning: Ein TCP-Flag vom Typ „FIN“ in Paketen markiert normalerweise das Ende einer TCP-Verbindung, nachdem Daten übertragen wurden. Ein System ohne Firewall würde ein FIN-Paket auf einem geschlossenen Port mit einem RST-Paket beantworten. FIN-Scans spielen heute keine große Rolle mehr, da die meisten Systeme einzelne FIN-Pakete verwerfen. Alle diese Scanmethoden von außen muss man sich als Serverbetreiber nicht gefallen lassen. Ein geschicktes Iptables-Regelset blockiert diese typischen Pakete eines Portscanners, ohne dabei TCP-Verbindungen ganz zu unterbinden. Die Definition erfolgt über das Programm „/sbin/iptables“, das mit root-Rechten oder vorangestelltem sudo aufgerufen wird. Die Regeln sind umfangreich und im Kasten „Listing: Iptables gegen Portscans“ auf der folgenden Seite abgedruckt. Erlaubt bleiben in diesem Beispiel die eingehenden Ports 22 für SSH und ausgehende DNS-Abfragen (Port 53). Tipp: Sollte beim Eingeben der Regeln ein Fehler unterlaufen, so kann man die bisherigen Regeln mit den drei Befehlen unterhalb der ersten Zeile „# Reset der Regeln:“ zurücksetzen.
Dual Stack: IPV4 und IPV6
IPv6 spielt in Heimnetzwerken bisher kaum eine Rolle, im Internet dagegen schon. Linux-Distributionen sprechen deshalb IPv4 sowie IPv6 und arbeiten seit ein paar Jahren im Dual-Stack-Betrieb mit beiden Protokollen. Für die Firewallkonfiguration per Iptables ergeben sich daraus ein paar Schwierigkeiten, denn es gibt unterschiedliche Regelsets für IPv4 und IPv6. Wer die Paketfilter unter Linux selbst konfiguriert, darf nicht vergessen, die gleichen Filterregeln auch für IPv6 einzutragen. Zur manuellen Konfiguration von IPv6-Regeln gibt es das eigene Tool „/sbin/ip6tables“, das der gleichen Syntax folgt wie „/sbin/iptables“. Dazu ein Beispiel aus dem Kasten „Listing: Iptables gegen Portscans“:
sudo /sbin/ip6tables -X
sudo /sbin/ip6tables -F
sudo /sbin/ip6tables -Z
Dies wären die ersten drei Befehle zum Reset der Regeln für IPv6.
Iptables. Regeln dauerhaft sichern

Die erstellten Regeln gegen Portscanner kann nun ein Client aus der Ferne mit Nmap testen. Dazu genügt diese Eingabe: nmap [öffentliche IP] Bisher sind die definierten Iptables-Regeln aber eine vergängliche Sache und bleiben nur bis zum Herunterfahren bestehen. Um sie in Debian, Ubuntu, Raspbian und anderen Debian-Varianten permanent zu machen, installiert man zuerst diese zwei Pakete nach:
sudo apt install iptablespersistent netfilter-persistent
Das System fragt daraufhin im Terminal nach, ob es die bisherigen Iptables-Regeln für die Protokoll IPv4 und IPv6 sichern soll. Beide Fragen beantworten Sie mit „Yes“. Dies schreibt die Regeln in die Konfigurationsdateien „/etc/iptables/rules.v4“ sowie „/etc/iptables/rules.v6“. Diesen Schritt kann man jederzeit mittels
sudo dpkg-reconfigure iptablespersistent
erneut aufrufen und die bisherigen Regeln überschreiben. Damit die Regeln beim Systemstart automatisch geladen werden, schaltet dieser Befehl den Konfigurationsdienst für Iptables ein:
sudo systemctl enable netfilter-persistent
Ab jetzt wird das System die zuletzt gespeicherten Regeln wiederherstellen. Möchte man das nicht mehr, so schaltet der folgende Befehl
sudo systemctl disable netfilter-persistent
den Dienst wieder ab.
Listing: Iptables gegen Portscans
# Reset der Regeln: sudo /sbin/iptables -X sudo /sbin/iptables -F sudo /sbin/iptables -Z
# Erlaubt Loopback-Verbindungen: sudo /sbin/iptables -A INPUT -i lo -j ACCEPT sudo /sbin/iptables -A OUTPUT -o lo -j ACCEPT
# Bestehende Verbindung erlauben: sudo /sbin/iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT sudo /sbin/iptables -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
# Ping erlauben: sudo /sbin/iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT sudo /sbin/iptables -A OUTPUT -p icmp –icmp-type echo-reply -j ACCEPT sudo /sbin/iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT sudo /sbin/iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT # Blockiert typische Portscans: sudo /sbin/iptables -N PORTSCAN sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ACK,FIN FIN -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ACK,PSH PSH -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ACK,URG URG -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ALL ALL -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ALL NONE -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags FIN,RST FIN,RST -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags SYN,RST SYN,RST -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ALL FIN,PSH,URG -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ALL SYN,FIN,PSH,URG -j DROP sudo /sbin/iptables -A PORTSCAN -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP # Stoppt SYN-Floods sudo /sbin/iptables-N SYNFLOOD sudo /sbin/iptables-A SYNFLOOD -p tcp –syn -m limit –limit 40/s -j RETURN sudo /sbin/iptables-A SYNFLOOD -p tcp -j REJECT –reject-with tcp-reset sudo /sbin/iptables -A INPUT -p tcp -m state –state NEW -j SYNFLOOD # Blockiert fragmentierte Pakete: sudo /sbin/iptables -A INPUT -f -j DROP # SYN-Pakete erlauben: sudo /sbin/iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP # Öffnet ausgehene Ports (DNS): sudo /sbin/iptables -A INPUT -p udp –sport 53 -j ACCEPT sudo /sbin/iptables -A OUTPUT -p udp –dport 53 -j ACCEPT # Öffnet eingehenden TCP-Port 22 (SSH): sudo /sbin/iptables -A INPUT -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT sudo /sbin/iptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT # Verwirft alle unerlaubten Pakete sudo /sbin/iptables -A INPUT -j DROP sudo /sbin/iptables -A FORWARD -j DROP sudo /sbin/iptables -A OUTPUT -j DROP
Portknocking: SSH-Dienst verstecken

Ein Linux-Server im Internet soll einen Dienst anbieten, der für Portscanner und neugierige Besucher unsichtbar sein soll. Eine Tarnkappe für Dienste und deren Ports ist „Knockd“. Diese Ergänzung ist ein Serverprozess, der auf eine bestimmte Abfolge von TCP-Paketen wartet – als abgemachtes Klopfzeichen. Erst wenn die richtigen Pakete am Server eingegangen sind, so öffnet dieser den gewünschten Port. Nützlich ist das beispielsweise zur zusätzlichen Absicherung von Heimnetzwerken, die über das Internet zum Beispiel per SSH erreichbar sein sollen – aber nur bei gelegentlichem Bedarf. Knockd besteht aus einer Serverkomponente, die ein paar Iptables-Regeln voraussetzt. Auf den Clients ist keine spezielle Konfiguration und auch kein besonderes Programm nötig.
Tipp: Kleines ABC der Linux-Systemwartung Serverkonfiguration: Der benötige Serverdienst steht im Paket „knockd“ bereit, das sich in allen Linux-Distributionen über den jeweiligen Paketmanager findet. Exemplarisch zeigt die folgende Kurzanleitung die Einrichtung und Debian, Ubuntu und Raspbian. 1. Auf diesen Distributionen installiert der Befehl
sudo apt install knockd
den Dienst. 2. Dessen Konfigurationsdatei liegt unter „/etc/knockd.conf“ und mit
nano /etc/knockd.conf
öffnen Sie diese im Texteditor Nano. Netterweise ist die Konfiguration schon für den SSH-Dienst (Open SSH) vorbereitet. In den Abschnitten „[openSSH]“ und „[closeSSH]“ sind die erwarteten Sequenzen zum Öffnen und zum Schließen des Dienstes definiert. Dort ändert man jeweils die Zeile „seq_ timeout = 5“ nach „seq_timeout = 20“, was dem Client 20 Sekunden Zeit gibt, ein SYNPaket an den vordefinierten Port 7000, 8000 und 9000 zu senden. 3. Der vorgegebene Befehl zum Öffnen des SSH-Ports, also die erste Zeile, die mit „command =“ beginnt, ist nicht optimal. Diese ändern Sie folgendermaßen:
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport ssh -j ACCEPT
4. Nun gilt es, Knockd mit Iptables bekanntzumachen. Dazu müssen in Debian, Ubuntu und Co. die Pakete für permanente Regelsets installiert sein.
sudo apt install iptablespersistent netfilter-persistent
Die erste Regel erlaubt bestehende und ausgehende Netzwerkverbindungen:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Die zweite benötigte Regel blockiert zunächst den Zugriff auf Port 22 zum SSH-Server:
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
Nun speichern diese beiden Befehle die Iptables-Regeln für Knockd:
sudo netfilter-persistent save
sudo netfilter-persistent reload
5. Um den Knockd-Dienst in Gang zu setzen, öffnen Sie nun noch die „/etc/default/ knockd“ in einem Texeditor:
sudo nano /etc/default/knockd
Dort setzen Sie die Zeile „START_KNOCKD=0“ auf „START_KNOCKD=1“, damit der Dienst ab dem Systemstart läuft. 6. Schließlich muss vor der letzten Zeile „KNOCKD_OPTS“ noch das Kommentarzeichen (#) entfernt werden. Die Angabe der Netzwerkschnittstelle, vorgegeben ist „eth0“, muss der tatsächlichen Kennung der überwachten Schnittstelle entsprechen. Wie diese lautet, beantwortet
ip a
in einem zweiten Terminal. Meistens lautet der Name „eth0“, „enp0s1“ oder „enp0s3“.

Auf dem Client: Wer jetzt auf den Server per SSH zugreifen möchte, muss zuerst das Klopfzeichen, also die richtige Abfolge an Paketen schicken. Diese Aufgabe erledigt das altehrwürdige Kommandozeilentool telnet. 1. Im folgenden Beispiel schickt telnet je ein Paket an die definierten Anklopf-Ports des Servers mit der angegebenen Adresse (IP-Nummer oder Hostname):
telnet [Adresse] 7000
telnet [Adresse] 8000
telnet [Adresse] 9000
2. Danach wird der SSH-Port geöffnet und der Client darf sich mit ssh
[User]@[Adresse]
anmelden, allerdings nur dieser Client mit der gegenwärtigen IP-Adresse. 3. Um den Port danach wieder zu schließen, muss man die Telnet-Sequenz nur wieder umgekehrt abschicken, jetzt von Port 9000 bis 7000.
Nftables: Die neue Linux-Firewall
Das Modul Netfilter des Linux-Kernels, welches das Betriebssystem perfekt für den Einsatz als Gateway, Netzwerkrouter und dezidierte Firewall macht, hat seit Kernel 3.13 einen wenig beachteten Nachfolger: Das neue Firewallmodul nennt sich „Nftables“ und tritt die Erbschaft von Netfilter an. Es war mehrere Jahre in der Entwicklung und bietet erweiterte Filterregeln, die aber einer einfacheren Syntax gehorchen.
Wenig Beachtung gab es deshalb: Damit sich Linux-Administratoren vorerst nicht groß umgewöhnen brauchen und alle Firewall-Scripts neu schreiben müssen, gibt es eine Kompatibilitätsschicht, die bisherige Iptables-Befehle und -Regeln verarbeitet. Erst in ferner Zukunft wird es einen verbindlichen Wechsel zur einfacheren Nftables-Syntax geben. Das Wiki von Debian GNU/Linux hat auf https://wiki.debian.org/nftables schon einige Beispiele parat.
Grafisches Front-End gufw
Wie man am ersten Teil des Artikels bereits sieht, ist die die Konfiguration von Iptables alles andere als trivial. Wer Regeln anlegen will, muss sich mit umständlichen Befehlsketten auseinandersetzen. Das geht aber auch einfacher. Mit UFW – „Uncomplicated Firewall“ – gibt es ein Front-End für die Kommandozeile, die Regeln für Iptables anlegt und deutlich einfacher zu bedienen ist.
Achtung: Grafische Oberflächen vereinfachen die Einrichtung der Firewall erheblich, aber Sie sollten dennoch sehr genau kontrollieren, welche Optionen Sie da hinterlegen. Ganz wichtig ist es, sich den SSH-Zugang nicht zu vernageln, damit immer noch eine Hintertür offenbleibt.

Die „unkomplizierte“ Firewall erleichtert schon allein dadurch den Umgang mit dem System, dass sie die Syntax auf der Kommandozeile vereinfacht. Mittels
sudo ufw enable
wird die Firewall aktiviert. Und ein sudo
ufw allow ssh
schaltet generell den Zugang per SSH auf den Rechner frei. UFW mit grafischer Oberfläche: Noch einfacher wird der Umgang mit der Firewall, wenn Sie sich eine grafische Oberfläche dafür installieren. Das erledigt unter Ubuntu oder Linux Mint dieser Befehl:
sudo apt-get install gufw
Danach führen Sie die Software über den Eintrag in der Dash oder dem Menü aus. Die Firewall kennt drei unterschiedliche Profile, die nach den jeweiligen Standorten benannt sind. Über den großen Schiebeschalter aktivieren Sie die Firewall oder schalten diese bei Bedarf wieder aus.

Beim Netzwerkverkehr gibt es jeweils drei Optionen. Nicht ganz offensichtlich ist der Unterschied zwischen „Verweigern“ und „Ablehnen“. „Ablehnen“„ (Reject) bedeutet, dass der Absender des Datenverkehrs darüber eine Nachricht erhält. „Verweigern“ blockt die Anfrage einfach. Achten Sie bei der Auswahl auf die Farbe des Schildes. Ist es vollständig grün, dann haben Sie die höchste Sicherheitsstufe erreicht. Zu jedem Profil können Sie individuelle Regeln anlegen. Das geht mit der grafischen Oberfläche noch deutlich einfacher als mit der Konsole. Dazu wechseln Sie in den Bereich „Regeln“ und klicken auf das kleine Pluszeichen. Der nachfolgende Dialog gliedert sich in drei Bereiche. Je nach Ihren Vorkenntnissen wechseln Sie in den bevorzugten Abschnitt. Über die Listenfelder „Richtlinie“ und „Richtung“ im Register „Vorkonfiguriert“ entscheiden Sie sich zunächst zwischen Erlaubnis, Verweigerung oder Ablehnung und legen zweitens fest, ob es sich um eingehenden oder ausgehenden Datenverkehr handeln soll. Die UFW besitzt eine ganze Reihe von vordefinierten Anwendungen, deren Datenverkehr Sie definieren können. Diese sind in der grafischen Oberfläche nach Kategorien zusammengefasst. Um beispielsweise eingehenden Datenverkehr für die Anwendung Dropbox zu erlauben, wählen Sie die Kategorie „Netzwerk“ und suchen dann die Anwendung aus dem entsprechenden Listenfeld. Die Feinjustierung erreichen Sie anschließend mit einem Klick auf den kleinen Pfeil am unteren Bereich des Dialogs. Dort finden Sie dann auch noch Optionen, um die Schnittstelle zu definieren, auf welche die Regel angewendet werden soll. Mit Klick auf „Hinzufügen“ werden die Regeln anschließend eingefügt. Das einfache Beispiel Dropbox zeigt als Resultat bereits, dass es sich nicht um eine simple allgemeine Regel handelt, sondern dass damit detailliert Ports und Protokolle hinterlegt werden. Wenn Sie nicht durch die Listen der Anwendungen blättern wollen, können Sie auch versuchen, den gesuchten Dienst oder das gewünschte Programm mit der Eingabe des Namens in die Suchmaske zu identifizieren. Einmal angelegte Regeln können Sie in der Liste markieren, um dann mit einem Klick auf das Zahnrad noch einmal die Details zu überprüfen. Wer sich „verbastelt“ hat, kann über „Bearbeiten“ und „Aktuelles Profil zurücksetzen“ alle Regeln wieder entfernen.
Lesetipp: Linux-Verschlüsselung – So sichern Sie Ihre Daten ab
Der Firewall Builder

Die größte Herausforderung beim Umgang mit dem Firewall Builder steht ganz am Anfang. Es werden zwar für verschiedene Plattformen Binärdateien für die Installation angeboten, diese hinken aber den aktuellen Versionsnummern der Distributionen deutlich hinterher und auch die Tage des Installationsmediums für den Mac sind gezählt. Wenn sich das Betriebssystem also weigert, die fertigen Pakete zu installieren, führt kein Weg um das Kompilieren aus den Quellen vorbei. Der Firewall Builder arbeitet nicht nur mit Iptables zusammen, sondern kann auch die Regeln für eine ganze Reihe anderer Systeme definieren, beispielsweise für externe Firewallsysteme oder Open WRT. Das Programm besteht aus zwei Teilen – einmal dem grafischen Editor zum Anlegen der Regeln sowie einem Compiler. Dieser erzeugt dann aus den Regeln die Konfigurationsdateien des Zielsystems. Nach dem Programmaufruf blickt der Nutzer auf eine sehr spartanische Oberfläche. Mit einem Klick auf „Create new firewall“ wird eine neue leere Konfiguration angelegt. Sie erhält im nachfolgenden Dialog zunächst einen Namen. Über das Listenfeld darunter wählen Sie nun aus, für welches Firewallsystem Sie die Regel anlegen wollen. Außerdem wählen Sie weiter aus, unter welchem Betriebssystem die Firewall ausgeführt wird. Der Einstieg fällt leichter, wenn Sie die Option „Use prefonfigured firewall templates“ aktivieren. Aus der Liste wählen Sie anschließend eine passende Vorlage zum Zielsystem aus. Damit können Sie dann bereits auf eine Reihe von Regeln zurückgreifen. Diese bestehen aus Source (Quelle), Destination (Ziel), Service (Protokolle wie SSH, HTTP), Optionen (etwa Protokollfunktionen) und Comment. Die jeweilige Auswahl berücksichtigt die meisten Dienste und Protokolle, sodass für einen grundlegenden Schutz wenig manuelles Eingreifen notwendig sein dürfte. Mit „Save“ werden die Regeln als Vorlage lokal gespeichert. So können Sie später jederzeit wieder daran arbeiten. „Install“ dagegen nutzt die Regeln, um daraus die Konfiguration für das Zielsystem anzulegen.