Comment s'assurer que le port SSH n'est ouvert qu'à une adresse IP spécifique?

42

C'est mon /etc/sysconfig/iptables:

Il a deux ports ouverts 80 Apache et 22 pour 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

Pour le port 22 (SSH), je souhaite m'assurer que personne ne peut se connecter à ce port, à l'exception d'une adresse IP spécifique.

exemple ip:

1.2.3.4

Veuillez ne pas tenir compte de tout oubli ou de toute préoccupation concernant ce qui se passe si mon adresse IP change et que je ne peux plus utiliser SSH sur mon serveur.

Communauté
la source

Réponses:

47

Si la question me convient correctement, si vous souhaitez que votre serveur soit accessible uniquement à partir d'une adresse IP spécifique sur le port 22, vous pouvez mettre à jour Iptables à cet effet:

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

Dans ce cas, vous ouvrez le port ssh uniquement à YourIP, si vous devez ouvrir DNS pour votre réseau interne:

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

Une fois que vous les avez ajoutés et ouverts pour ces adresses IP, vous devez fermer la porte au reste des adresses IP.

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

(Assurez-vous de définir les règles à la position correcte dans votre jeu de règles. Les iptables -A INPUTajoutera à la fin de la règle INPUTtelle qu'elle est actuellement.)

ou comme joel a dit, vous pouvez ajouter une règle à la place:

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

ou vous pouvez simplement définir la politique par défaut sur le pare-feu avec

iptables -P INPUT DROP

En bref, comme présenté dans cette question sur SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Networker
la source
2
Il est également intéressant de noter que l’ iptablesinversion avec l’opérateur bang est prise en charge si vous souhaitez effectuer un ciblage DROP. Exemple:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley le
1
De plus, les inconditionnels DROPne sont pas vraiment nécessaires, vous pouvez simplement définir la politique par défaut sur le pare-feu iptables -P INPUT DROPet le laisser aller. Vous voudrez probablement aussi les faire en annexe si vous les faites de cette façon sinon tout le trafic sera attrapé par le DROPet n'atteindra jamais votre ACCEPTrègle.
Bratchley
1
Cela n'a pas fonctionné pour moi car la valeur par défaut pour -I (insertion) est d'insérer en tant que règle n ° 1, de sorte que DROP est inséré en tant que règle n ° 1 et est évalué en premier. Vous devez exécuter iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPet iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP"3" après INPUT signifie insérer en tant que règle INPUT n ° 3 (en supposant que vous insériez deux ACCEPTS, sinon si un seul ACCEPTE, utilisez "2" pour INPUT.
Kevin Triplett
@Networker Using -Iinsère les nouvelles règles iptables en haut. En tant que tel, vous pourriez finir par installer votre goutte avant votre permission. Je suggère d'utiliser -Aplutôt
BlueCacti
1
Eh
6

Bien que je recommande d'utiliser des clés SSH, je vais vous donner une explication.

Vous n'avez pas besoin d'utiliser IPtables pour ce que vous essayez d'atteindre, il y a plusieurs façons. C'est la manière d'IPtables:

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

[YOUR_HOME_IP] = Votre IP à la maison (assez simple)

[SSH_PORT] = Le port sur lequel vous exécutez SSH (par défaut 22)

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

Cela garantit que personne, à l'exception de votre adresse IP, ne peut se connecter à SSH.

Il existe un autre moyen, qui consiste à ajouter quelque chose au sshd_config.

Ajouter ce qui suit:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Cela vous permet de vous connecter à SSH en tant rootqu'utilisateur de votre adresse IP sans demander de mot de passe.

S'il vous plaît garder à l'esprit qu'un cronjob avec

iptables -X
iptables -F

peut être intelligent afin de ne pas bloquer votre serveur avec SSH (le travail cronjob réinitialisera IPtables pour que vous ayez à nouveau accès). Si vous y avez toujours accès, vous pouvez supprimer le travail cron et redéfinir vos IPtables.

William Edwards
la source
Le cronjob ne ferait que supprimer le pare-feu. Pourquoi s'installer iptablesen premier lieu? Une certaine forme d'accès hors bande est la méthode habituelle. knockdest un autre.
Matt
@mtm Oui, lorsque vous êtes verrouillé, la tâche cron réinitialisera la configuration de votre IPtables afin que vous puissiez à nouveau accéder à SSH. Les raisons pour lesquelles les gens utilisent IPtables sont différentes, je pense que c'est un pare-feu efficace, simple et flexible.
William Edwards
2
oic. vous voulez dire exécuter le rinçage une fois au moment de l’installation, pas régulièrement planifié. atest-ce que.
Matt
4
Ne lister que votre adresse IP, puis autoriser une connexion root sans mot de passe, semble être une idée terrible.
Alex W
1
@AlexW Je sais que cela fait longtemps, mais je voulais tout de même faire un commentaire: Without-Passwordsignifie que l'authentification par mot de passe n'est pas autorisée, vous devrez donc utiliser l'authentification par clé SSH. Il s'agit en effet d'un nom peu clair pour cette méthode d'authentification. Mais cela ne signifie pas que vous n’avez pas besoin d’un mot de passe pour vous connecter en tant que root. Néanmoins, une méthode plus sécurisée consiste à définir PermitRootLogin noet à utiliser un compte sudo différent pour la connexion, car la racine est une cible commune
BlueCacti 10/02/2016
5

D'autres iptables -Iexemples utilisent dans leurs exemples, ce qui n'est souvent pas ce que vous devriez utiliser.

iptables exécutera la première règle qui correspond, l’ordre des règles est donc très important. -Iest la commande "insert" et doit être utilisée avec un paramètre d'index pour spécifier à quel emplacement de la liste appartient une règle donnée. -Aest la commande "append", qui ajoutera la règle à la fin de la liste.

Dans certaines distributions (peut-être toutes), l'utilisation d' -Iun paramètre sans index ajoute la règle à celle-ci, ce qui en fait la première règle vérifiée. Dans ce scénario, si la dernière commande que vous exécutez est iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPalors iptables abandonnera tout le trafic, que vous ayez ou non des ACCEPTrègles plus tard dans la chaîne.

Voici un exemple de configuration d’une règle qui autorise uniquement SSH à partir d’une seule adresse IP:

Partir sans règles:

#> 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

Ajoutez une nouvelle règle "autoriser SSH à partir de 1.2.3.4":

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

Bloquez SSH de toutes les autres adresses IP:

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

Maintenant votre chaîne INPUT ressemblera à:

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

Plus tard, si vous devez ajouter une deuxième adresse à la liste blanche, vous pouvez utiliser le -Iparamètre pour la placer avant la règle de la liste noire.

#>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

Notez que l'utilisation de -I INPUT 2la nouvelle règle ajoutée en tant que règle 2 et que la règle DROP a été remplacée par le numéro 3.

STW
la source