Wie kann sichergestellt werden, dass der SSH-Port nur für eine bestimmte IP-Adresse geöffnet ist?

42

Das ist mein /etc/sysconfig/iptables:

Es hat zwei offene Ports 80 Apache und 22 für SSH.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Für Port 22 (SSH) möchte ich sicherstellen, dass niemand außer einer bestimmten IP-Adresse eine Verbindung zu diesem Port herstellen kann.

Beispiel IP:

1.2.3.4

Bitte ignorieren Sie jegliche Versehen / Bedenken, was passiert, wenn sich meine IP ändert und ich kein SSH mehr auf meinen Server kann.

Gemeinschaft
quelle

Antworten:

47

Wenn ich die Frage richtig verstanden habe, dass Ihr Server nur über eine bestimmte IP-Adresse an Port 22 erreichbar sein soll, können Sie Iptables folgendermaßen aktualisieren:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

In diesem Fall öffnen Sie den SSH-Port nur für YourIP, wenn Sie DNS für Ihr internes Netzwerk öffnen müssen:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Sobald Sie sie hinzugefügt und für diese IPs geöffnet haben, müssen Sie die Tür für den Rest der IPs schließen

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Stellen Sie sicher, dass die Regeln in Ihrem Regelsatz an der richtigen Position festgelegt sind. Fügen iptables -A INPUTSie die Regeln am Ende des Regelsatzes so hinzu, INPUTwie sie aktuell sind.)

oder wie Joel sagte, können Sie stattdessen eine Regel hinzufügen:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

oder Sie können einfach die Standardrichtlinie in der Firewall mit festlegen

iptables -P INPUT DROP

Kurz gesagt, wie in dieser Frage zu SO dargestellt :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Networker
quelle
2
Es ist auch erwähnenswert, dass iptablesdie Inversion mit dem Bang-Operator unterstützt wird, falls Sie eine gezielte Aktion durchführen möchten DROP. Beispiel:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley
1
Unbedingte Bedingungen DROPsind auch nicht wirklich erforderlich. Sie können einfach die Standardrichtlinie für die Firewall festlegen iptables -P INPUT DROPund loslassen. Wahrscheinlich möchten Sie sie auch als Append ausführen, wenn Sie sie auf diese Weise ausführen, da sonst der gesamte Datenverkehr vom abgefangen wird DROPund niemals Ihre ACCEPTRegel erreicht.
Bratchley
1
Dies hat bei mir nicht funktioniert, da der Standardwert für -I (Einfügen) das Einfügen als Regel # 1 ist, daher wird der DROP als Regel # 1 eingefügt und zuerst ausgewertet und löscht daher alle ssh-Pakete, wobei die ACCEPT-Regel niemals ausgewertet wird. Sie müssen ausführen iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPund iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROPDie "3" nach INPUT bedeutet Einfügen als INPUT-Regel # 3 (vorausgesetzt, Sie fügen zwei ACCEPTS ein, andernfalls, wenn nur ein ACCEPT vorhanden ist, verwenden Sie "2" für INPUT.
Kevin Triplett
@Networker Using -Ifügt die neuen iptables-Regeln oben ein. Als solches könnten Sie Ihren Tropfen vor Ihrer Erlaubnis einsetzen. Ich schlage vor, -Astattdessen
BlueCacti
1
Nun
6

Obwohl ich die Verwendung von SSH-Schlüsseln empfehle, gebe ich Ihnen eine Erklärung.

Sie müssen IPtables nicht für das verwenden, was Sie erreichen möchten. Es gibt mehrere Möglichkeiten. Dies ist der IPtables-Weg:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = Ihre IP-Adresse zu Hause (ziemlich unkompliziert)

[SSH_PORT] = Der Port, auf dem Sie SSH ausführen (standardmäßig 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Dies stellt sicher, dass sich niemand außer Ihrer IP bei SSH anmelden kann.

Es gibt einen anderen Weg, der darin besteht, dem einen oder anderen etwas hinzuzufügen sshd_config.

Fügen Sie Folgendes hinzu:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Auf diese Weise können Sie sich rootvon Ihrer IP- Adresse aus bei SSH als Benutzer anmelden, ohne nach einem Kennwort zu fragen.

Bitte beachten Sie, dass ein Cronjob mit

iptables -X
iptables -F

ist möglicherweise klug, damit Sie nicht mit SSH von Ihrem Server ausgeschlossen werden (der Cronjob setzt IPtables zurück, damit Sie wieder Zugriff erhalten). Wenn Sie noch Zugriff haben, können Sie den Cronjob entfernen und Ihre IPtables erneut einrichten.

William Edwards
quelle
Der Cronjob würde allerdings nur die Firewall entfernen. Warum überhaupt einrichten iptables? Irgendeine Form des Außerbandzugriffs ist die übliche Methode. knockdist ein anderer.
Matt
@mtm Ja, wenn Sie gesperrt sind, setzt der Cronjob Ihr IPtables-Setup zurück, sodass Sie wieder auf SSH zugreifen können. Die Gründe, warum IPtables verwendet werden, sind unterschiedlich. Meiner Meinung nach handelt es sich um eine effektive, einfache und flexible Firewall.
William Edwards
2
oic. Sie meinen, die Spülung einmal zur Einrichtungszeit auszuführen, nicht regelmäßig geplant. attut das.
Matt
4
Es scheint eine schreckliche Idee zu sein, nur Ihre IP-Adresse zu markieren und dann ein Root-Login ohne Passwort zuzulassen.
Alex W
1
@AlexW Ich weiß, dass es schon eine Weile her ist, aber ich wollte noch Folgendes kommentieren: Bedeutet, dass die Without-PasswordKennwortauthentifizierung nicht zulässig ist, sodass Sie stattdessen die SSH-Schlüsselauthentifizierung verwenden müssen. Es ist in der Tat eine etwas unklare Bezeichnung für diese Authentifizierungsmethode. Dies bedeutet jedoch nicht, dass Sie kein Passwort benötigen, um sich als root anzumelden. Eine sicherere Methode ist es jedoch, PermitRootLogin noein anderes sudo-Konto für die Anmeldung
festzulegen
5

Andere Antworten werden iptables -Iin ihren Beispielen verwendet, was häufig nicht das ist, was Sie verwenden sollten.

iptables führt die erste übereinstimmende Regel aus, daher ist die Reihenfolge der Regeln sehr wichtig. -Iist der Befehl "Einfügen" und sollte mit einem Indexparameter verwendet werden, um anzugeben, wo in der Liste eine bestimmte Regel hingehört. -Aist der Befehl "Anhängen", mit dem die Regel am Ende der Liste hinzugefügt wird.

In einigen Distributionen (möglicherweise allen) -Iwird die Regel durch die Verwendung eines Indexparameters zu einem Index hinzugefügt, wodurch sie zur ersten überprüften Regel wird. Wenn in diesem Szenario der letzte von Ihnen ausgeführte Befehl iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables ist, wird der gesamte Datenverkehr gelöscht, unabhängig davon, ob Sie ACCEPTspäter in der Kette Regeln haben oder nicht .

Hier ist ein Beispiel für das Einrichten einer Regel, die nur SSH von einer einzelnen IP aus zulässt:

Ohne Regeln starten:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Fügen Sie eine neue Regel "SSH ab 1.2.3.4 zulassen" hinzu:

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Blockiere SSH von allen anderen IPs:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Jetzt sieht Ihre INPUT-Kette folgendermaßen aus:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Wenn Sie später eine zweite IP-Adresse auf die Whitelist setzen müssen, können Sie sie mit dem -IParameter vor die Blacklist-Regel setzen.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Beachten Sie, dass Sie -I INPUT 2die neue Regel als Regel Nummer 2 hinzugefügt und die DROP-Regel an Nummer 3 angehängt haben.

STW
quelle