Das Anfängerhandbuch für iptables, die Linux-Firewall

Iptables ist ein äußerst flexibles Firewall-Dienstprogramm für Linux-Betriebssysteme. Egal, ob Sie ein unerfahrener Linux-Geek oder ein Systemadministrator sind, es gibt wahrscheinlich eine Möglichkeit, dass iptables eine großartige Verwendung für Sie sein kann. Lesen Sie weiter, während wir Ihnen zeigen, wie Sie die vielseitigste Linux-Firewall konfigurieren.

Foto von ezioman .

Über iptables

iptables ist ein Befehlszeilen-Firewall-Dienstprogramm, das Richtlinienketten verwendet, um Datenverkehr zuzulassen oder zu blockieren. Wenn eine Verbindung versucht, sich auf Ihrem System zu etablieren, sucht iptables in seiner Liste nach einer Regel, mit der sie übereinstimmt. Wenn keine gefunden wird, wird auf die Standardaktion zurückgegriffen.

iptables ist fast immer auf jeder Linux-Distribution vorinstalliert. Um es zu aktualisieren / installieren, rufen Sie einfach das iptables-Paket ab:

sudo apt-get install iptables

Es gibt GUI-Alternativen zu iptables wie Firestarter, aber iptables ist nicht wirklich so schwer, wenn Sie ein paar Befehle nicht haben. Sie sollten beim Konfigurieren von iptables-Regeln äußerst vorsichtig sein, insbesondere wenn Sie SSH auf einem Server haben, da ein falscher Befehl Sie dauerhaft sperren kann, bis er manuell auf dem physischen Computer behoben wird.

Arten von Ketten

iptables verwendet drei verschiedene Ketten: Eingabe, Weiterleitung und Ausgabe.

Eingabe - Diese Kette wird verwendet, um das Verhalten für eingehende Verbindungen zu steuern. Wenn ein Benutzer beispielsweise versucht, SSH auf Ihren PC / Server zu übertragen, versucht iptables, die IP-Adresse und den Port einer Regel in der Eingabekette zuzuordnen.

Weiterleiten - Diese Kette wird für eingehende Verbindungen verwendet, die nicht lokal zugestellt werden. Stellen Sie sich einen Router vor - Daten werden immer an ihn gesendet, sind aber selten für den Router selbst bestimmt. Die Daten werden nur an das Ziel weitergeleitet. Wenn Sie auf Ihrem System kein Routing, NATing oder etwas anderes ausführen, das eine Weiterleitung erfordert, werden Sie diese Kette nicht einmal verwenden.

Es gibt einen sicheren Weg, um zu überprüfen, ob Ihr System die Vorwärtskette verwendet / benötigt.

iptables -L -v

Der Screenshot oben zeigt einen Server, der seit einigen Wochen ausgeführt wird und keine Einschränkungen für eingehende oder ausgehende Verbindungen aufweist. Wie Sie sehen können, hat die Eingabekette 11 GB Pakete und die Ausgabekette 17 GB verarbeitet. Die Vorwärtskette hingegen musste kein einzelnes Paket verarbeiten. Dies liegt daran, dass der Server keine Weiterleitung durchführt oder als Pass-Through-Gerät verwendet wird.

Ausgabe - Diese Kette wird für ausgehende Verbindungen verwendet. Wenn Sie beispielsweise versuchen, howtogeek.com zu pingen, überprüft iptables die Ausgabekette, um festzustellen, welche Regeln für ping und howtogeek.com gelten, bevor Sie entscheiden, den Verbindungsversuch zuzulassen oder abzulehnen.

Die Einschränkung

Auch wenn das Pingen eines externen Hosts wie etwas erscheint, das nur die Ausgabekette durchlaufen muss, denken Sie daran, dass zur Rückgabe der Daten auch die Eingabekette verwendet wird. Denken Sie bei der Verwendung von iptables zum Sperren Ihres Systems daran, dass für viele Protokolle eine bidirektionale Kommunikation erforderlich ist, sodass sowohl die Eingabe- als auch die Ausgabekette ordnungsgemäß konfiguriert werden müssen. SSH ist ein allgemeines Protokoll, das Menschen vergessen, beide Ketten zuzulassen.

Standardverhalten der Richtlinienkette

Bevor Sie bestimmte Regeln konfigurieren, sollten Sie entscheiden, wie das Standardverhalten der drei Ketten aussehen soll. Mit anderen Worten, was soll iptables tun, wenn die Verbindung nicht mit vorhandenen Regeln übereinstimmt?

Führen Sie den iptables -LBefehl aus , um zu sehen, wie Ihre Richtlinienketten derzeit für nicht übereinstimmenden Datenverkehr konfiguriert sind .

Wie Sie sehen können, haben wir auch den Befehl grep verwendet, um eine sauberere Ausgabe zu erzielen. In diesem Screenshot wird derzeit angenommen, dass unsere Ketten Datenverkehr akzeptieren.

Mehr als einmal möchten Sie, dass Ihr System standardmäßig Verbindungen akzeptiert. Sofern Sie die Richtlinienkettenregeln nicht zuvor geändert haben, sollte diese Einstellung bereits konfiguriert sein. In beiden Fällen ist hier der Befehl zum standardmäßigen Akzeptieren von Verbindungen:

iptables --policy INPUT ACCEPT


iptables --policy OUTPUT ACCEPT


iptables --policy FORWARD ACCEPT

Wenn Sie standardmäßig die Akzeptanzregel verwenden, können Sie iptables verwenden, um bestimmte IP-Adressen oder Portnummern zu verweigern, während Sie weiterhin alle anderen Verbindungen akzeptieren. Wir werden in einer Minute zu diesen Befehlen kommen.

Wenn Sie lieber alle Verbindungen ablehnen und manuell angeben möchten, welche Verbindungen Sie zulassen möchten, sollten Sie die Standardrichtlinie Ihrer Ketten so ändern, dass sie gelöscht wird. Dies wäre wahrscheinlich nur für Server nützlich, die vertrauliche Informationen enthalten und immer nur die gleichen IP-Adressen haben.

iptables --policy INPUT DROP


iptables --policy OUTPUT DROP


iptables --policy FORWARD DROP

Verbindungsspezifische Antworten

Wenn Ihre Standardkettenrichtlinien konfiguriert sind, können Sie iptables Regeln hinzufügen, damit es weiß, was zu tun ist, wenn eine Verbindung von oder zu einer bestimmten IP-Adresse oder einem bestimmten Port auftritt. In diesem Handbuch gehen wir auf die drei grundlegendsten und am häufigsten verwendeten „Antworten“ ein.

Akzeptieren - Verbindung zulassen.

Trennen - Trennen Sie die Verbindung, tun Sie so, als wäre es nie passiert. Dies ist am besten, wenn Sie nicht möchten, dass die Quelle erkennt, dass Ihr System vorhanden ist.

Ablehnen - Die Verbindung nicht zulassen, aber einen Fehler zurücksenden. Dies ist am besten, wenn Sie nicht möchten, dass eine bestimmte Quelle eine Verbindung zu Ihrem System herstellt, diese jedoch wissen, dass Ihre Firewall sie blockiert hat.

Der beste Weg, um den Unterschied zwischen diesen drei Regeln zu zeigen, besteht darin, zu zeigen, wie es aussieht, wenn ein PC versucht, einen Linux-Computer mit iptables zu pingen, die für jede dieser Einstellungen konfiguriert sind.

Zulassen der Verbindung:

Verbindung trennen:

Verbindung ablehnen:

Zulassen oder Blockieren bestimmter Verbindungen

Wenn Ihre Richtlinienketten konfiguriert sind, können Sie jetzt iptables so konfigurieren, dass bestimmte Adressen, Adressbereiche und Ports zugelassen oder blockiert werden. In diesen Beispielen stellen wir die Verbindungen auf ein DROP, aber Sie können sie je nach Ihren Anforderungen und der Konfiguration Ihrer Richtlinienketten auf ACCEPToder umstellen REJECT.

Hinweis: In diesen Beispielen werden iptables -ARegeln verwendet , um Regeln an die vorhandene Kette anzuhängen. iptables beginnt oben in der Liste und durchläuft jede Regel, bis eine passende gefunden wird. Wenn Sie eine Regel über einer anderen einfügen müssen, können Sie iptables -I [chain] [number]die Nummer angeben, die in der Liste enthalten sein soll.

Verbindungen von einer einzelnen IP-Adresse

Dieses Beispiel zeigt, wie alle Verbindungen von der IP-Adresse 10.10.10.10 blockiert werden.

iptables -A INPUT -s 10.10.10.10 -j DROP

Verbindungen von einer Reihe von IP-Adressen

Dieses Beispiel zeigt, wie alle IP-Adressen im Netzwerkbereich 10.10.10.0/24 blockiert werden. Sie können eine Netzmaske oder eine Standard-Schrägstrichnotation verwenden, um den Bereich der IP-Adressen anzugeben.

iptables -A INPUT -s 10.10.10.0/24 -j DROP

oder

iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

Verbindungen zu einem bestimmten Port

Dieses Beispiel zeigt, wie SSH-Verbindungen ab 10.10.10.10 blockiert werden.

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Sie können "ssh" durch ein beliebiges Protokoll oder eine beliebige Portnummer ersetzen. Der -p tcpTeil des Codes teilt iptables mit, welche Art von Verbindung das Protokoll verwendet. Wenn Sie ein Protokoll blockieren würden, das UDP anstelle von TCP verwendet, -p udpwäre dies stattdessen erforderlich.

Dieses Beispiel zeigt, wie SSH-Verbindungen von einer beliebigen IP-Adresse blockiert werden.

iptables -A INPUT -p tcp --dport ssh -j DROP

Verbindungsstatus

Wie bereits erwähnt, erfordern viele Protokolle eine bidirektionale Kommunikation. Wenn Sie beispielsweise SSH-Verbindungen zu Ihrem System zulassen möchten, müssen den Eingabe- und Ausgabeketten eine Regel hinzugefügt werden. Aber was ist, wenn Sie nur möchten, dass SSH in Ihr System gelangt? Wird das Hinzufügen einer Regel zur Ausgabekette nicht auch ausgehende SSH-Versuche zulassen?

Hier kommen Verbindungsstatus ins Spiel, mit denen Sie die Möglichkeit haben, eine bidirektionale Kommunikation zuzulassen, aber nur einseitige Verbindungen herzustellen. Schauen Sie sich dieses Beispiel an, in dem SSH-Verbindungen vom 10.10.10.10 zulässig sind, SSH-Verbindungen vom 10.10.10.10 jedoch nicht. Das System kann jedoch Informationen über SSH zurücksenden, solange die Sitzung bereits eingerichtet wurde, wodurch die SSH-Kommunikation zwischen diesen beiden Hosts möglich wird.

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT

Änderungen speichern

Die Änderungen, die Sie an Ihren iptables-Regeln vornehmen, werden beim nächsten Neustart des iptables-Dienstes verworfen, es sei denn, Sie führen einen Befehl zum Speichern der Änderungen aus. Dieser Befehl kann je nach Distribution unterschiedlich sein:

Ubuntu:

sudo /sbin/iptables-save

Red Hat / CentOS:

/sbin/service iptables save

Oder

/etc/init.d/iptables save

Andere Befehle

Listen Sie die aktuell konfigurierten iptables-Regeln auf:

iptables -L

Durch Hinzufügen der -vOption erhalten Sie Paket- und Byteinformationen, und durch Hinzufügen -nwird alles numerisch aufgelistet. Mit anderen Worten - Hostnamen, Protokolle und Netzwerke werden als Nummern aufgeführt.

Um alle aktuell konfigurierten Regeln zu löschen, können Sie den Befehl flush ausgeben.

iptables -F