Iptables Essentials: Häufige Firewall-Regeln und Befehle

Einführung

Iptables ist eine Software-Firewall für Linux-Distributionen. Dieses Spickzettel-Style-Handbuch bietet eine schnelle Referenz zu iptables-Befehlen, die Firewall-Regeln erstellen, die in üblichen Alltagsszenarien nützlich sind. Dies beinhaltet iptables-Beispiele zum Erlauben und Blockieren verschiedener Dienste nach Port, Netzwerkschnittstelle und Quell-IP-Adresse.

Wie man dieses Handbuch verwendet

  • Die meisten hier beschriebenen Regeln gehen davon aus, dass Ihre iptables eingehenden Datenverkehr auf DROP eingestellt ist, durch die Standard-Eingangsrichtlinie, und Sie eingehenden Verkehr selektiv zulassen möchten
  • Verwenden Sie diejenigen Abschnitte, die für das, was Sie erreichen möchten, relevant sind. Die meisten Abschnitte hängen nicht voneinander ab, sodass Sie die untenstehenden Beispiele unabhängig voneinander verwenden können
  • Verwenden Sie das Inhaltsverzeichnis auf der rechten Seite dieser Seite (bei breiten Seitenbreiten) oder die Suchfunktion Ihres Browsers, um die benötigten Abschnitte zu finden
  • Kopieren und fügen Sie die angegebenen Befehlszeilenbeispiele ein, wobei Sie die markierten Werte durch Ihre eigenen ersetzen

Beachten Sie, dass die Reihenfolge Ihrer Regeln wichtig ist. Alle diese iptables-Befehle verwenden die Option -A, um die neue Regel am Ende einer Kette anzuhängen. Wenn Sie sie an anderer Stelle in der Kette platzieren möchten, können Sie die Option -I verwenden, mit der Sie die Position der neuen Regel angeben können (oder platzieren Sie sie am Anfang der Kette, indem Sie keine Regelnummer angeben).

Hinweis: Wenn Sie mit Firewalls arbeiten, achten Sie darauf, sich nicht aus Ihrem eigenen Server auszusperren, indem Sie den SSH-Verkehr (Standardmäßig Port 22) blockieren. Wenn Sie aufgrund Ihrer Firewall-Einstellungen den Zugriff verlieren, müssen Sie möglicherweise über eine webbasierte Konsole eine Verbindung dazu herstellen, um Ihren Zugriff zu reparieren. Wenn Sie DigitalOcean verwenden, können Sie unsere Dokumentation zum Recovery-Konsole-Produkt für weitere Informationen lesen. Sobald Sie über die Konsole verbunden sind, können Sie Ihre Firewall-Regeln ändern, um SSH-Zugriff zu erlauben (oder allen Verkehr zuzulassen). Wenn Ihre gespeicherten Firewall-Regeln den SSH-Zugriff erlauben, ist eine andere Methode, Ihren Server neu zu starten.

Denken Sie daran, dass Sie Ihre aktuellen iptables-Regeln mit sudo iptables -S und sudo iptables -L überprüfen können.

Lassen Sie uns einen Blick auf die iptables-Befehle werfen!

Regeln speichern

Iptables-Regeln sind flüchtig, das bedeutet, sie müssen manuell gespeichert werden, damit sie nach einem Neustart bestehen bleiben.

Auf Ubuntu können Sie iptables-Regeln auf eine Weise speichern, indem Sie das Paket iptables-persistent verwenden. Installieren Sie es mit apt wie folgt:

  1. sudo apt install iptables-persistent

Während der Installation werden Sie gefragt, ob Sie Ihre aktuellen Firewall-Regeln speichern möchten.

Wenn Sie Ihre Firewall-Regeln aktualisieren und die Änderungen speichern möchten, führen Sie diesen Befehl aus:

  1. sudo netfilter-persistent save

Andere Linux-Distributionen können alternative Möglichkeiten haben, um Ihre iptables-Änderungen dauerhaft zu machen. Bitte beachten Sie die entsprechende Dokumentation für weitere Informationen.

Auflisten und Löschen von Regeln

Wenn Sie lernen möchten, wie Sie iptables-Regeln auflisten und löschen können, sehen Sie sich dieses Tutorial an: Wie man Iptables Firewall-Regeln auflistet und löscht.

Allgemein nützliche Regeln

In diesem Abschnitt finden Sie eine Vielzahl von iptables-Befehlen, die Regeln erstellen, die auf den meisten Servern generell nützlich sind.

Zulassen von Loopback-Verbindungen

Die Loopback-Schnittstelle, auch als lo bezeichnet, wird von einem Computer verwendet, um Netzwerkverbindungen an sich selbst weiterzuleiten. Wenn Sie beispielsweise ping localhost oder ping 127.0.0.1 ausführen, wird Ihr Server sich selbst über die Loopback-Schnittstelle anpingen. Die Loopback-Schnittstelle wird auch verwendet, wenn Sie Ihren Anwendungsserver so konfigurieren, dass er sich mit einem Datenbankserver unter Verwendung einer localhost-Adresse verbindet. Daher sollten Sie sicherstellen, dass Ihre Firewall diese Verbindungen zulässt.

Um den gesamten Datenverkehr auf Ihrer Loopback-Schnittstelle zu akzeptieren, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A OUTPUT -o lo -j ACCEPT

Da Netzwerkverkehr im Allgemeinen bidirektional sein muss – eingehend und ausgehend –, um ordnungsgemäß zu funktionieren, ist es typisch, eine Firewall-Regel zu erstellen, die eingehenden Verkehr, der etabliert ist und mit dem verwandt ist, zulässt, sodass der Server Rückverkehr für ausgehende Verbindungen zulässt, die vom Server selbst initiiert wurden. Dieser Befehl wird dies ermöglichen:

  1. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Erlauben von etablierten ausgehenden Verbindungen

Sie möchten möglicherweise den ausgehenden Datenverkehr aller etablierten Verbindungen zulassen, die in der Regel die Antwort auf legitime eingehende Verbindungen sind. Mit diesem Befehl wird das ermöglicht:

  1. sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Zulassen des internen Netzwerks auf das externe Netzwerk zugreifen

Unter der Annahme, dass eth0 Ihr externes Netzwerk ist und eth1 Ihr internes Netzwerk ist, ermöglicht dies Ihrem internen Netzwerk, auf das externe zuzugreifen:

  1. sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Ungültige Pakete abwerfen

Einige Netzwerkverkehrspakete werden als ungültig markiert. Manchmal kann es nützlich sein, diese Art von Paketen zu protokollieren, aber oft ist es in Ordnung, sie abzuwerfen. Tun Sie dies mit diesem Befehl:

  1. sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Blockieren einer IP-Adresse

Um Netzwerkverbindungen zu blockieren, die von einer bestimmten IP-Adresse ausgehen, beispielsweise 203.0.113.51, führen Sie diesen Befehl aus:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j DROP

In diesem Beispiel gibt -s 203.0.113.51 die Quell-IP-Adresse „203.0.113.51“ an. Die Quell-IP-Adresse kann in jeder Firewall-Regel angegeben werden, einschließlich einer Erlaubnis-Regel.

Wenn Sie die Verbindung stattdessen ablehnen möchten, was mit einem „Verbindung abgelehnt“ Fehler auf die Verbindungsanfrage reagiert, ersetzen Sie „DROP“ durch „REJECT“ wie folgt:

  1. sudo iptables -A INPUT -s 203.0.113.51 -j REJECT

Blockieren von Verbindungen mit einem Netzwerkinterface

Um Verbindungen von einer bestimmten IP-Adresse, z.B. 203.0.113.51, zu einem bestimmten Netzwerkinterface, z.B. eth0, zu blockieren, verwenden Sie diesen Befehl:

  1. iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP

Dies entspricht dem vorherigen Beispiel, mit dem Zusatz von -i eth0. Das Netzwerkinterface kann in jeder Firewall-Regel angegeben werden und ist eine gute Möglichkeit, die Regel auf ein bestimmtes Netzwerk zu beschränken.

Dienst: SSH

Wenn Sie einen Server ohne lokale Konsole verwenden, möchten Sie wahrscheinlich eingehende SSH-Verbindungen (Port 22) zulassen, damit Sie eine Verbindung zu Ihrem Server herstellen und diesen verwalten können. Dieser Abschnitt behandelt die Konfiguration Ihrer Firewall mit verschiedenen SSH-bezogenen Regeln.

Erlauben aller eingehenden SSH-Verbindungen

Um alle eingehenden SSH-Verbindungen zu erlauben, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten SSH-Verbindungen erlaubt, ist nur erforderlich, wenn die OUTPUT-Richtlinie nicht auf ACCEPT festgelegt ist.

Erlauben von eingehenden SSH-Verbindungen von einer bestimmten IP-Adresse oder Subnetz

Um eingehende SSH-Verbindungen von einer bestimmten IP-Adresse oder einem Subnetz zu erlauben, geben Sie die Quelle an. Wenn Sie beispielsweise das gesamte 203.0.113.0/24-Subnetz zulassen möchten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten SSH-Verbindungen erlaubt, ist nur erforderlich, wenn die OUTPUT-Richtlinie nicht auf ACCEPT festgelegt ist.

Erlauben von ausgehenden SSH-Verbindungen

Wenn Ihre Firewall-Ausgabe Richtlinie nicht auf ‚ACCEPT‘ gesetzt ist und Sie ausgehende SSH-Verbindungen zulassen möchten – Ihr Server initiiert eine SSH-Verbindung zu einem anderen Server – können Sie diese Befehle ausführen:

  1. sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Zulassen eingehender Rsync von einer bestimmten IP-Adresse oder Subnetz

Rsync, das auf Port 873 läuft, kann verwendet werden, um Dateien von einem Computer auf einen anderen zu übertragen.

Um eingehende Rsync-Verbindungen von einer bestimmten IP-Adresse oder einem Subnetz zuzulassen, geben Sie die Quell-IP-Adresse und den Zielport an. Wenn Sie beispielsweise dem gesamten Subnetz 203.0.113.0/24 erlauben möchten, auf Ihren Server zu rsyncen, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Verkehr von etablierten rsync-Verbindungen zulässt, ist nur erforderlich, wenn die Ausgabepolitik nicht auf ‚ACCEPT‘ gesetzt ist.

Dienst: Webserver

Webserver wie Apache und Nginx hören typischerweise auf Anfragen auf Port 80 und 443 für HTTP- bzw. HTTPS-Verbindungen. Wenn Ihre Standardrichtlinie für eingehenden Verkehr auf ‚Drop‘ oder ‚Deny‘ eingestellt ist, möchten Sie Regeln erstellen, die es Ihrem Server ermöglichen, auf diese Anfragen zu antworten.

Erlauben aller eingehenden HTTP

Um alle eingehenden HTTP (Port 80) Verbindungen zuzulassen, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten HTTP-Verbindungen ermöglicht, ist nur erforderlich, wenn die Richtlinie AUSGABE nicht auf AKZEPTIEREN gesetzt ist.

Erlauben aller eingehenden HTTPS

Um alle eingehenden HTTPS (Port 443) Verbindungen zuzulassen, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten HTTP-Verbindungen ermöglicht, ist nur erforderlich, wenn die Richtlinie AUSGABE nicht auf AKZEPTIEREN gesetzt ist.

Erlauben aller eingehenden HTTP und HTTPS

Wenn Sie sowohl den HTTP- als auch den HTTPS-Verkehr zulassen möchten, können Sie das multiport-Modul verwenden, um eine Regel zu erstellen, die beide Ports zulässt. Um alle eingehenden HTTP- und HTTPS (Port 443) Verbindungen zuzulassen, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Verkehr von etablierten HTTP- und HTTPS-Verbindungen ermöglicht, ist nur erforderlich, wenn die OUTPUT-Richtlinie nicht auf ACCEPT gesetzt ist.

Dienst: MySQL

MySQL hört auf Client-Verbindungen am Port 3306. Wenn Ihr MySQL-Datenbankserver von einem Client auf einem Remote-Server verwendet wird, müssen Sie sicherstellen, dass dieser Verkehr zugelassen ist.

Zulassen von MySQL von einer bestimmten IP-Adresse oder einem Subnetz

Um eingehende MySQL-Verbindungen von einer bestimmten IP-Adresse oder einem Subnetz zuzulassen, geben Sie die Quelle an. Wenn Sie beispielsweise das gesamte Subnetz 203.0.113.0/24 zulassen möchten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Verkehr von etablierten MySQL-Verbindungen ermöglicht, ist nur erforderlich, wenn die OUTPUT-Richtlinie nicht auf ACCEPT gesetzt ist.

Zulassen von MySQL für eine bestimmte Netzwerkschnittstelle

Um MySQL-Verbindungen über eine bestimmte Netzwerkschnittstelle zuzulassen – nehmen wir an, Sie haben eine private Netzwerkschnittstelle eth1, zum Beispiel – verwenden Sie diese Befehle:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von hergestellten MySQL-Verbindungen ermöglicht, ist nur erforderlich, wenn die Richtlinie OUTPUT nicht auf ACCEPT festgelegt ist.

Dienst: PostgreSQL

PostgreSQL lauscht auf Client-Verbindungen auf Port 5432. Wenn Ihr PostgreSQL-Datenbankserver von einem Client auf einem entfernten Server verwendet wird, müssen Sie sicherstellen, dass dieser Datenverkehr zugelassen ist.

PostgreSQL von einer bestimmten IP-Adresse oder Subnetz

Um eingehende PostgreSQL-Verbindungen von einer bestimmten IP-Adresse oder einem Subnetz zuzulassen, geben Sie die Quelle an. Wenn Sie beispielsweise das gesamte Subnetz 203.0.113.0/24 zulassen möchten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von hergestellten PostgreSQL-Verbindungen ermöglicht, ist nur erforderlich, wenn die Richtlinie OUTPUT nicht auf ACCEPT festgelegt ist.

Erlauben von PostgreSQL für bestimmte Netzwerkschnittstelle

Um PostgreSQL-Verbindungen zu einer bestimmten Netzwerkschnittstelle zuzulassen – nehmen wir an, Sie haben eine private Netzwerkschnittstelle eth1, verwenden Sie diese Befehle:

  1. sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Verkehr von etablierten PostgreSQL-Verbindungen ermöglicht, ist nur erforderlich, wenn die Richtlinie OUTPUT nicht auf ACCEPT gesetzt ist.

Dienst: E-Mail

E-Mail-Server wie Sendmail und Postfix hören auf einer Vielzahl von Ports, je nach den verwendeten Protokollen für die E-Mail-Zustellung. Wenn Sie einen Mail-Server betreiben, bestimmen Sie, welche Protokolle Sie verwenden, und lassen Sie die entsprechenden Arten von Verkehr zu. Wir zeigen Ihnen auch, wie Sie eine Regel erstellen, um ausgehende SMTP-E-Mails zu blockieren.

Blockieren ausgehender SMTP-E-Mails

Wenn Ihr Server keine ausgehenden E-Mails senden soll, möchten Sie möglicherweise diese Art von Verkehr blockieren. Um ausgehende SMTP-E-Mails zu blockieren, die Port 25 verwenden, führen Sie diesen Befehl aus:

  1. sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

Dies konfiguriert iptables so, dass alle ausgehenden Verbindungen auf Port 25 abgelehnt werden. Wenn Sie einen anderen Dienst anhand seiner Portnummer ablehnen müssen, ersetzen Sie die Portnummer 25 oben.

Zulassen aller eingehenden SMTP

Um Ihrem Server zu erlauben, auf SMTP-Verbindungen auf Port 25 zu antworten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten SMTP-Verbindungen zulässt, ist nur erforderlich, wenn die Richtlinie OUTPUT nicht auf ACCEPT gesetzt ist.

Zulassen aller eingehenden IMAP

Um Ihrem Server zu erlauben, auf IMAP-Verbindungen auf Port 143 zu antworten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten IMAP-Verbindungen zulässt, ist nur erforderlich, wenn die Richtlinie OUTPUT nicht auf ACCEPT gesetzt ist.

Zulassen aller eingehenden IMAPS

Um Ihrem Server zu erlauben, auf IMAPS-Verbindungen, Port 993, zu antworten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten IMAPS-Verbindungen erlaubt, ist nur notwendig, wenn die Richtlinie OUTPUT nicht auf ACCEPT gesetzt ist.

Zulassen aller eingehenden POP3-Verbindungen

Um Ihrem Server zu erlauben, auf POP3-Verbindungen, Port 110, zu antworten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten POP3-Verbindungen erlaubt, ist nur notwendig, wenn die Richtlinie OUTPUT nicht auf ACCEPT gesetzt ist.

Zulassen aller eingehenden POP3S-Verbindungen

Um Ihrem Server zu erlauben, auf POP3S-Verbindungen, Port 995, zu antworten, führen Sie diese Befehle aus:

  1. sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  2. sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Der zweite Befehl, der den ausgehenden Datenverkehr von etablierten POP3S-Verbindungen erlaubt, ist nur notwendig, wenn die Richtlinie OUTPUT nicht auf ACCEPT gesetzt ist.

Abschluss

Das sollte viele der Befehle abdecken, die häufig verwendet werden, um eine iptables-Firewall zu konfigurieren. Natürlich ist iptables ein sehr flexibles Tool, also fühlen Sie sich frei, die Befehle mit verschiedenen Optionen zu kombinieren, um Ihre spezifischen Anforderungen zu erfüllen, wenn sie hier nicht abgedeckt sind.

Wenn Sie Hilfe bei der Bestimmung benötigen, wie Ihre Firewall eingerichtet werden soll, werfen Sie einen Blick auf dieses Tutorial: Wie Sie eine effektive Firewall-Richtlinie auswählen, um Ihre Server zu sichern.

Source:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands