In unserem vorherigen Artikel der IPTables-Firewall-Reihe haben wir uns angesehen, wie man eine Firewall-Regel mit „iptables -A“ hinzufügt.
Wir haben auch erklärt, wie man eingehende SSH-Verbindungen zulässt. Auf hoher Ebene umfasst es die folgenden 3 Schritte.
- Alle bestehenden Regeln löschen:„iptables -F“
- Nur eingehendes SSH zulassen:„iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT“
- Alle anderen eingehenden Pakete verwerfen:„iptables -A INPUT -j DROP“
Das obige funktioniert. Aber es ist nicht vollständig. Ein Problem bei den obigen Schritten besteht darin, dass die ausgehenden Pakete nicht eingeschränkt werden.
Standardkettenrichtlinie
Die Standardrichtlinie einer Kette ist ACCEPT. Wenn Sie nicht wissen, was eine Kette bedeutet, lesen Sie besser unseren iptables-Einführungsartikel. Daher ist die Standardrichtlinie sowohl der INPUT- als auch der OUTPUT-Kette ACCEPT. In den obigen 3 Schritten haben wir alle eingehenden Pakete am Ende verworfen (außer eingehendes ssh). Wir haben den ausgehenden Datenverkehr jedoch nicht eingeschränkt.
Wie Sie unten sehen, steht neben allen drei Kettennamen (INPUT, OUTPUT und FORWARD) „(policy ACCEPT)“. Dies zeigt an, dass die standardmäßige Kettenrichtlinie ACCEPT ist.
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Sie haben hier also zwei Möglichkeiten.
Option 1:Drop-Regeln hinzufügen
Fügen Sie am Ende die folgenden drei Drop-Regeln hinzu, die alle eingehenden, ausgehenden und weitergeleiteten Pakete verwerfen (mit Ausnahme derjenigen, die über diesen drei Regeln definiert sind). Wenn Sie dies tun, ist die Standard-Kettenrichtlinie immer noch ACCEPT, was keine Rolle spielen sollte, da Sie sowieso alle Pakete am Ende verwerfen.
iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP
Option 2:Ändern Sie die standardmäßige Kettenrichtlinie in DROP
Führen Sie zu Beginn die folgenden drei Befehle aus, die die Standardrichtlinie der Kette in DROP ändern.
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Wenn Sie nun die Allow-SSH-Regel hinzufügen:„iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT“ und iptables -L ausführen, werden Sie feststellen, dass neben „(policy DROP)“ steht alle drei Ketten.
# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
Aber hier gibt es ein Problem. Die Regel zum Zulassen eingehender SSH-Verbindungen funktioniert nicht mehr, da alle ausgehenden Pakete verworfen werden.
Eingehende Verbindungen zulassen
Wenn die Standardrichtlinie DROP für INPUT- und OUTPUT-Ketten ist, müssen Sie für jede eingehende Firewall-Regel die folgenden beiden Regeln angeben.
- Anfrageregel:Dies ist die Anfrage, die vom Client an den Server für die eingehende Verbindung kommt.
- Antwortregel:Dies gilt für die Antwort, die vom Server an den Client gesendet wird (für die entsprechende eingehende Anfrage).
Beispiel 1:Eingehende SSH-Verbindung zulassen
Dies dient dazu, eine SSH-Verbindung von außen zu Ihrem Server zu ermöglichen. d.h. Sie können von außerhalb per ssh auf Ihren Server zugreifen.
Dies beinhaltet zwei Schritte. Zuerst müssen wir eingehende neue SSH-Verbindungen zulassen. Sobald die eingehende SSH-Verbindung zugelassen ist, müssen wir auch die Antwort für diese eingehende SSH-Verbindung zulassen.
Erlauben Sie zunächst eine eingehende SSH-Verbindungsanfrage, wie unten gezeigt.
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Im obigen Beispiel:
- iptables -A INPUT:Fügt die neue Regel an die INPUT-Kette an. Bei eingehenden Verbindungsanfragen muss dies immer INPUT sein.
- -i eth0:Dies bezieht sich auf die Eingabeschnittstelle. Bei eingehenden Verbindungen muss dies immer ‚-i‘ sein.
- -p tcp:Gibt an, dass dies für das TCP-Protokoll ist.
- –dport 22:Dies bezeichnet den Zielport für die eingehende Verbindung. Port 22 ist für ssh.
- -m state:Dies zeigt an, dass das Matching-Modul „state“ verwendet wird. Wir werden in einem zukünftigen Artikel mehr über die Option „-m“ (und alle verfügbaren passenden Module für iptables) diskutieren.
- –state NEW, ESTABLISHED:Optionen für das Matching-Modul „state“. In diesem Beispiel sind nur die Zustände NEW und ESTABLISHED erlaubt. Wenn zum ersten Mal eine SSH-Verbindungsanforderung vom Client an den Server initiiert wird, wird der Zustand NEW verwendet. Der Status ESTABLISHED wird für alle weiteren Anfragen vom Client an den Server verwendet.
Als nächstes erlauben Sie ausgehende (nur Status ESTABLISHED) SSH-Verbindungsantwort (für die entsprechende eingehende SSH-Verbindungsanforderung).
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Im obigen Beispiel:
- iptables -A OUTPUT:Fügt die neue Regel an die OUTPUT-Kette an. Da dies für die Antwortregel (für die entsprechende eingehende Anfrage) gilt, die vom Server ausgeht, sollte dies OUTPUT sein.
- -o eth0:Dies bezieht sich auf die Ausgabeschnittstelle. Bei ausgehenden Verbindungen muss dies immer ‚-o‘ sein.
- -p tcp:Gibt an, dass dies für das TCP-Protokoll ist.
- –sport 22:Dies bezieht sich auf den Quellport für die ausgehende Verbindung. Port 22 ist für ssh. Da die eingehende Anfrage (von der vorherigen Regel) an den „Ziel“-Port kam, geht die ausgehende Antwort über den „Quell“-Port.
- -m state:Dies zeigt an, dass das Matching-Modul „state“ verwendet wird.
- –state ESTABLISHED:Da dies eine Antwortregel ist, erlauben wir nur ESTABLISHED-Verbindungen (und keine NEW-Verbindungen).
Beispiel 2:Eingehende HTTP-Verbindung zulassen
Dies dient dazu, eine HTTP-Verbindung von außen zu Ihrem Server zu ermöglichen. D.h. Sie können Ihre auf dem Server laufende Website von außen einsehen.
Genau wie die obigen SSH-Eingangsregeln umfasst auch dies zwei Schritte. Zuerst müssen wir eingehende neue HTTP-Verbindungen zulassen. Sobald die eingehende HTTP-Verbindung zugelassen ist, müssen wir die Antwort für diese eingehende HTTP-Verbindung zulassen.
Erlauben Sie zunächst eingehende HTTP-Verbindungsanforderungen, wie unten gezeigt.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Als nächstes erlauben Sie ausgehende (nur ESTABLISHED) HTTP-Verbindungsantwort (für die entsprechende eingehende SSH-Verbindungsanforderung).
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Hinweis:In der obigen HTTP-Anforderungs- und Antwortregel ist bis auf die Portnummer alles gleich wie im SSH-Beispiel.
Ausgehende Verbindungen zulassen
Wenn die Standardrichtlinie DROP für die INPUT- und OUTPUT-Ketten ist, müssen Sie für jede ausgehende Firewall-Regel die folgenden beiden Regeln angeben.
- Anforderungsregel:Dies ist die Anforderung, die für die ausgehende Verbindung vom Server nach außen geht.
- Antwortregel:Dies gilt für die Antwort, die von außen an den Server zurückkommt (für die entsprechende ausgehende Anfrage).
Beispiel 3:Ausgehende SSH-Verbindung zulassen
Dies dient dazu, eine SSH-Verbindung von Ihrem Server nach außen zu ermöglichen. d.h. Sie können von Ihrem Server eine SSH-Verbindung zu einem externen Server herstellen.
Dies umfasst zwei Schritte. Zuerst müssen wir ausgehende neue SSH-Verbindungen zulassen. Sobald die ausgehende SSH-Verbindung erlaubt ist, müssen wir auch die Antwort für diese ausgehende SSH-Verbindung zulassen.
Erlauben Sie zunächst eine ausgehende SSH-Verbindungsanfrage, wie unten gezeigt.
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Im obigen Beispiel:
- iptables -A OUTPUT:Fügt die neue Regel an die OUTPUT-Kette an. Bei ausgehender Verbindungsanfrage muss dies immer OUTPUT sein.
- -o eth0:Dies bezieht sich auf die Ausgabeschnittstelle. Bei ausgehenden Verbindungen muss dies immer ‚-o‘ sein.
- -p tcp:Gibt an, dass dies für das TCP-Protokoll ist.
- –dport 22:Dies bezeichnet den Zielport für die ausgehende Verbindung.
- -m state:Dies zeigt an, dass das „state“-Matching-Modul verwendet wird.
- –state NEW, ESTABLISHED:Optionen für das Matching-Modul „state“. In diesem Beispiel sind nur die Zustände NEW und ESTABLISHED erlaubt. Wenn zum ersten Mal eine SSH-Verbindungsanforderung vom Server nach außen initiiert wird, wird der Zustand NEW verwendet. Der ESTABLISHED-Zustand wird für alle weiteren Anfragen vom Server nach außen verwendet.
Als Nächstes Ausgehende (nur ESTABLISHED) SSH-Verbindungsantwort zulassen (für die entsprechende eingehende SSH-Verbindungsanforderung).
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Im obigen Beispiel:
- iptables -A INPUT:Fügt die neue Regel an die INPUT-Kette an. Da dies für die Antwortregel (für die entsprechende ausgehende Anfrage) gilt, die von außen an den Server kommt, sollte dies INPUT sein.
- -i eth0:Dies bezieht sich auf die Eingabeschnittstelle. Bei eingehenden Verbindungen muss dies immer ‚-i‘ sein.
- -p tcp:Gibt an, dass dies für das TCP-Protokoll ist.
- –sport 22:Dies bezieht sich auf den Quellport für die eingehende Verbindung. Da die ausgehende Anfrage (von der vorherigen Regel) an den „Ziel“-Port ging, kommt die eingehende Antwort vom „Quell“-Port.
- -m state:Dies zeigt an, dass das Matching-Modul „state“ verwendet wird.
- –state ESTABLISHED:Da dies eine Antwortregel ist, erlauben wir nur ESTABLISHED-Verbindungen (und keine NEW-Verbindungen).
Alles zusammenfügen
Erstellen Sie das Shell-Skript rules.sh, das Folgendes tut:
- Alle vorhandenen Regeln löschen
- Standard-Kettenrichtlinien festlegen
- Eingehendes SSH zulassen
- Eingehendes HTTP zulassen
- Ausgehenden SSH zulassen
Erstellen Sie zuerst die rules.sh
$ vi rules.sh # 1. Delete all existing rules iptables -F # 2. Set default chain policies iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 3. Allow incoming SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 4. Allow incoming HTTP iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # 5. Allow outgoing SSH iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Führen Sie als Nächstes die Datei rules.sh aus und sehen Sie sich die Regeln an.
# chmod u+x rules.sh # ./rules.sh # iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
Auf dieser Grundlage sollten Sie in der Lage sein, Ihre eigenen eingehenden und ausgehenden iptables-Firewallregeln zu schreiben. In IPTables gibt es noch viel mehr zu behandeln. Bleiben Sie dran!
Frühere Artikel in der iptables-Reihe:
- Linux-Firewall-Tutorial:Grundlagen zu IPTables-Tabellen, -Ketten, -Regeln
- IPTables Flush:Alle Regeln auf RedHat und CentOS Linux löschen/entfernen
- Linux IPTables:So fügen Sie Firewall-Regeln hinzu (Beispiel mit SSH-Zulassung)