Archiv der Kategorie: Linux Howto

THINK UNBLOG GNU/Linux Tutorials Howto Workaround DevOps Code.

iptables Konfiguration und Anwendung

Wie funktioniert iptables? so geht’s

iptables ist ein Userspace-Programm für die Linux-Kernel Firewall. Es dient zur Bearbeitung der Paketfilter und der Konfiguration der Linux Firewall, diese den Datenverkehr von und zum Server überwacht, mithilfe von Tabellen. Die Tabellen enthalten Regelsätze, Ketten genannt, die eingehende und ausgehende Datenpakete filtern.

Wenn ein Paket mit einer Regel übereinstimmt, wird es einem Ziel zugewiesen, das eine andere Kette oder einer dieser Werte sein kann:

  • ACCEPT – lässt das Paket passieren.
  • DROP – lässt das Paket nicht passieren.
  • RETURN – hindert das Paket daran, eine Kette zu durchlaufen, und weist es an, zur vorherigen Kette zurückzukehren.

In diesem Tutorial wird mit einer der Standardtabellen namens filter gearbeitet, bestehend aus drei Ketten:

  • INPUT – steuert eingehende Pakete zum Server.
  • FORWARD – filtert eingehende Pakete, die weitergeleitet werden.
  • OUTPUT – Filtern der Pakete, die vom Server ausgehen.

  iptables kann mit der Linux Uncomplicated Firewall (ufw), sowie mit firewalld genutzt werden. iptables-Regeln gelten nur für ipv4. Wird die Firewall für das IPv6-Protokoll genutzt, muss stattdessen ip6tables verwendet werden.

iptables Installation

Ein SSH-Terminal zum Server mit Root Zugriff herstellen, oder mit sudo Berechtigung root werden, mit sudo su - bei Ubuntu/Debian Linux.

iptables ist bei den meisten Linux-Distributionen vorinstalliert. Wenn es jedoch standardmäßig nicht vorliegt, sind bei einem Ubuntu/Debian-System folgende Schritte auszuführen.

$ sudo apt-get update
$ sudo apt-get install iptables

Überprüfe den Status der aktuellen iptables-Konfiguration, mit ausführen des nächsten Kommandos.

$ iptables -vnL

Hier wird die Option L verwendet, um alle Regeln aufzulisten, die numerische Ausgabe von Adressen und Ports mit -n, und -v  dient zum Anzeigen in einem detaillierteren Format. Wie bei dieser Beispielausgabe.

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in out   source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in out   source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in out   source destination

An diesem Punkt wird man feststellen, dass alle Ketten (Chain) auf ACCEPT gesetzt sind und keine Regeln definiert sind. Das System ist also nicht geschützt, da jedes Paket ohne Filterung durchkommt.

Keine Sorge! wie Regeln definiert werden, ist im nächsten Schritt dieses iptables-Tutorials zu erfahren.

Kettenregeln definieren

Eine Regel zu definieren bedeutet, sie an die Kette anzuhängen. Dazu muss die Option -A (Append) direkt nach dem Befehl iptables eingefügt werden.

iptables wird angewiesen eine neue Regel in die Kette einzufügen. Es können Optionen kombiniert angewendet werden.

iptables OptionBeschreibung
-i(interface) Die Netzwerkschnittstelle deren Datenverkehr man filtern möchte, zB. eth0, lo, ppp0 u.a.m.
-p(Protokoll) Das Netzwerkprotokoll in dem der Filterprozess stattfindet. Zulässig sind die Protokolle tcp, udp, udplite, icmp, sctp, icmpv6. Alternativ all für jedes Protokoll.
-s(Quelle) Die Adresse von der der Datenverkehr kommt. Hostnamen oder IP-Adressen verwenden.
–dport(Zielport) Die Zielportnummer eines Protokolls, zum
Beispiel: 22 (SSH), 443 (HTTPS) u.a.m.
-j(target) Der Zielname (ACCEPT / DROP / RETURN), bei jeder Regel immer am Ende anfügen.

Der iptable Befehl mit den Optionen setzt sich in dieser Reihenfolge wie folgt zusammen.

$ sudo iptables -A <Kette> -i <Schnittstelle> -p <Protokoll (tcp/udp) > -s <Quelle> --dport <Port-Nr.> -j <Ziel>

Sobald man mit der grundlegenden Syntax vertraut ist, kann man mit der Konfiguration der Firewall beginnen, um dem Server mehr Sicherheit zu verleihen. Hier verwenden wir die INPUT Kette im Beispiel.

Traffic auf Localhost akzeptieren

Für die meisten Anforderungen wird der localhost nicht eingeschränkt. Den Befehl ausführen um den Datenverkehr auf localhost zu erlauben.

$ sudo iptables -A INPUT -i lo -j ACCEPT

Die lo- oder Loopback-Schnittstelle wird für die gesamte Kommunikation auf dem localhost verwendet. Der obige Befehl stellt sicher, dass die Verbindungen zwischen einer Datenbank und einer Webanwendung auf demselben System ordnungsgemäß funktionieren.

Verbindungen auf HTTP, SSH, SSL Port akzeptieren

Als Nächstes möchten wir, dass die Verbindungen zu den Services HTTP (Port 80), HTTPS (Port 443) und SSH (Port 22) wie gewohnt funktionieren. Dazu müssen wir das Protokoll (-p) und den entsprechenden Port (–dport) übergeben. Die Befehle nacheinander ausführen.

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Es ist nun Zeit zu überprüfen, ob die Regeln in iptables angehängt sind.

$ iptables -vnL

Die Anzeige der Regeln mit der Option List in etwa wie diese.

Chain INPUT (1 references)
 pkts bytes target     prot opt in     out    source         destination
2798K  156M ACCEPT     tcp  --  *      *      0.0.0.0/0      0.0.0.0/0       tcp dpt:22 ctstate NEW
 114K 5508K ACCEPT     tcp  --  *      *      0.0.0.0/0      0.0.0.0/0       tcp dpt:80 ctstate NEW
65438 2804K ACCEPT     tcp  --  *      *      0.0.0.0/0      0.0.0.0/0       tcp dpt:443 ctstate NEW

Pakete von Quellen Filtern

Mit iptables können Pakete basierend auf einer IP-Adresse oder einem Bereich von IP-Adressen gefiltert werden. Hierzu muss man die Option -s angebenUm beispielsweise Pakete von 192.168.2.4 zu akzeptieren, lautet der Befehl.

$ sudo iptables -A INPUT -s 192.168.2.4 -j ACCEPT

Es können auch Pakete von einer bestimmten IP-Adresse abgelehnt werden, indem man das Ziel ACCEPT durch DROP ersetzen.

$ sudo iptables -A INPUT -s 192.168.2.4 -j DROP

Sollen Pakete von einer Reihe von IP-Adressen verworfen werden, muss man die Option -m und das Modul iprange verwenden. Hierbei gibt man den IP-Adressbereich mit –src-range an. Daran denken, dass ein Bindestrich den Bereich der IP-Adressen ohne Leerzeichen trennen sollte, hier wie folgt.

$ sudo iptables -A INPUT -m iprange --src-range 192.168.8.80-192.168.8.90 -j DROP

Verwerfen der gesamten sonstigen Traffic

Es ist wichtig, DROP als Ziel für den gesamten restlichen Datenverkehr zu verwenden, nachdem die –dport Regeln definiert wurden. Dadurch wird verhindert, dass nicht autorisierte Verbindungen über andere offene Ports auf den Server zugreifen. Hierzu einfach Folgendes eingeben.

$ sudo iptables -A INPUT -j DROP

Jetzt werden die Verbindung nachfolgend der Filter abgelehnt.

iptables Regeln löschen

Möchte man alle Regeln entfernen und sauber beginnen, kann die Option -F (Flush) verwendet werden.

$ sudo iptables -F

Dieser Befehl löscht alle aktuellen Regeln. Um jedoch eine bestimmte Regel zu löschen, dient die Option -D. Hierbei werden zuerst alle verfügbaren Regeln anzgezeigt, wie folgender Befehl zeigt.

$ sudo iptables -nL --line-numbers

Es wird eine Liste von Regeln mit Nummern ausgegeben.

Chain INPUT (policy ACCEPT)
num  target     prot opt source           destination
1    ACCEPT     all -- 192.168.8.8        anywhere
2    ACCEPT     tcp -- anywhere           anywhere tcp dpt:https
3    ACCEPT     tcp -- anywhere           anywhere tcp dpt:http
4    ACCEPT     tcp -- anywhere           anywhere tcp dpt:ssh

Um eine Regel zu löschen, füge die entsprechende Kette mit der Nummer aus der Liste ein. Nehmen wir an, wir wollen für dieses Beispiel die Regel Nummer eins (1) der INPUT Kette löschen. Der Befehl dazu wie folgt.

$ sudo iptables -D INPUT 1

Fazit

iptables ist ein leistungsstarkes Userspace-Utility für die Linux Firewall, um Linux-Server abzusichern. Ein Vorteil ist, dass sich verschiedene Regeln basierend auf eigenen Präferenzen definieren lassen.

In diesem iptables-Tutorial lernt man, wie das Tool installiert und verwendet wird. Wir hoffen, dass hierdurch eigene Regelsätze verwaltet werden können, um eingehende und ausgehende Pakete zu filtern.

Sender Policy Framework (SPF) auf Debian Server

Sender Policy Framework (SPF) ist ein Dienst, der bereitgestellt wird, um nicht als Spam-Absender identifiziert zu werden.

postfix-policyd-spf ist eine voll funktionsfähige Engine zur SPF-Prüfung unter Postfix. Der Daemon umfasst eine Vielzahl von Whitelist-Mechanismen und Richtlinienoptionen, um die unterschiedlichsten Systemanforderungen zu erfüllen. postfix-policyd-spf-perl wurde auf Perl implementiert, weiter auf Python gibt es postfix-policyd-spf-python, dieses das Python-SPF-Modul (spf) verwendet. Als Postfix Modul wird RFC 7208 des Sender Policy Framework (SPF) unterstützt.

Sender Policy Framework (SPF) auf Debian Server

Hierbei werden im DNS (Domain Name System) zusätzliche Informationen in Form eines SPF-Records gespeichert. Dieser TXT-basierte SPF-Eintrag beinhaltet konkrete Informationen zu autorisierten Mailservern, wie Mail Transfer Agent (MTA).

Installation von Postfix policyd-spf

Die Installation auf Debian 10 und Debian 11 beginnt wie folgt als root:

$ apt install postfix-policyd-spf-python

Wird das Perl Modul bevorzugt, kann der Perl SPF-Milter wie folgt als root installiert werden.

$ apt install postfix-policyd-spf-perl

Nachdem postfix-policyd-spf-python, oder postfix-policyd-spf-perl installiert ist, Bearbeiten wir die Konfigurationsdatei des Postfix-Master-Prozesses.

$ vi /etc/postfix/master.cf

Um die Postfix Anweisung mit der Python SPF-Richtlinienprüfung zu starten, füge am Ende der Datei master.cf die folgenden Zeilen hinzu.

policyd-spf  unix  -       n       n       -       0       spawn
   user=policyd-spf argv=/usr/bin/policyd-spf

Bei der SPF-Richtlinienprüfung auf Perl implementierung wie folgt.

policyd-spf  unix  -       n       n       -       0       spawn
   user=policyd-spf argv=/usr/sbin/postfix-policyd-spf-perl

Speichere und schließe die Datei. Bearbeite als Nächstes die Postfix Hauptkonfigurationsdatei.

$ vi /etc/postfix/main.cf

Die folgenden Zeilen am Ende der Datei main.cf hinzufügen. Die erste Zeile gibt die Timeout-Einstellung für den Postfix-Policy-Agent an. Die folgenden Zeilen schränken eingehende E-Mails ein, indem der SPF-Eintrag überprüft wird und nicht autorisierte E-Mails abgelehnt werden.

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

Hinweis! ist check_policy_service nicht die letzte Zeile unter dem Abschnitt smtpd_recipient_restrictions, dann muss ein Komma (,) am Zeilenende stehen. Kein Komma beim letzten Eintrag.

Speichere und schließe die Datei.

  Sicherstellen das die user id „policyd-spf“ angelegt ist, Überprüfen lässt sich das mit id policyd-spf. Das Systemkonto wird benötigt und kann, falls es fehlt wie folgt angelegt werden.

$ useradd -r -M policyd-spf -s /usr/sbin/nologin

Starte nun Postfix neu.

$ systemctl restart postfix

Wenn die nächste E-Mal von einer Domain mit einem SPF-Record im DNS empfangen wird, kann man die Ergebnisse der SPF-Prüfung im RAW-E-Mail-Header sehen. Der folgende Header gibt an, dass die E-Mail von einem autorisierten Absender Host versendet wurde.

policyd-spf[733750]: prepend Received-SPF: Pass

Die Ausgabe bei Verwendung von Postfix Policy-SPF mit Perl.

postfix/policy-spf[735983]: Policy action=PREPEND Received-SPF: pass

Python und Sender Policy Framework prüfen

Bei der Verwendung von postfix-policyd-spf-python muss Python, sowie das Python-SPF-Modul auf dem Server verhanden sein. Die Überprüfung kann wie folgt vorgenommen werden.

$ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> help('modules')

Ist Python auf dem System installiert, werden mit dem Befehl help('modules') mehrere Module in Spalten angezeigt. Das Modul spf und spf_engine wird vorausgesetzt. Das Python Modul kann wie folgt hinzugefügt werden.

pip install pypolicyd-spf

SPF Record prüfen

Um ein SPF TXT Record einer Domain zu überprüfen, kann folgender Befehl in einem Linux Terminal ausgeführt werden.

$ dig TXT mydomain.net +short
 "v=spf1 a mx ~all"

Bei der Verwendung von Windows, ist der nslookup Befehl aus einem Command Prompt auszuführen.

C:\> nslookup -type=TXT mydomain.net
 "v=spf1 a mx ~all"