GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux IPTables:Beispiele für eingehende und ausgehende Regeln (SSH und HTTP)

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.

  1. Alle bestehenden Regeln löschen:„iptables -F“
  2. Nur eingehendes SSH zulassen:„iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT“
  3. 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.

  1. Anfrageregel:Dies ist die Anfrage, die vom Client an den Server für die eingehende Verbindung kommt.
  2. 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.

  1. Anforderungsregel:Dies ist die Anforderung, die für die ausgehende Verbindung vom Server nach außen geht.
  2. 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:

  1. Alle vorhandenen Regeln löschen
  2. Standard-Kettenrichtlinien festlegen
  3. Eingehendes SSH zulassen
  4. Eingehendes HTTP zulassen
  5. 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)

Linux
  1. Linux-Cat-Befehl:Verwendung und Beispiele

  2. Der Linux-Sed-Befehl:Verwendung und Beispiele

  3. Linux – Routing über Iptables?

  4. Gewusst wie:Linux Allgemein – IPTables im Allgemeinen

  5. 11 Nützliche „ssh“- und „scp“-Befehle unter Linux

Stellen Sie eine SSH-Verbindung zwischen Windows und Linux her

19 Gängige SSH-Befehle in Linux mit Beispielen

SSH-Befehle in Linux mit Verwendungsbeispielen

Befehlsoptionen und Beispiele für den Tee-Befehl in Linux

50 einfache und nützliche Beispiele für den Find-Befehl in Linux

16 Praktische und nützliche Beispiele für Echo Command unter Linux