web-dev-qa-db-fra.com

Règle IPTables pour autoriser les connexions SSH entrantes

Le but de ce script est de n'autoriser le trafic que sur le VPN, à l'exception du localhost <-> localhost et du trafic SSH entrant. Mais lorsque j'exécute le script sur SSH, je suis déconnecté et obligé de redémarrer la VM. Quel est le problème avec mon script?

#!/bin/bash
iptables -F

#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT

#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT

#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT

#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
11
Steven

La chaîne de sortie est responsable de tout paquet sortant.

Votre script autorise uniquement les paquets sortants à tunneler l'interface, l'hôte local et l'hôte distant au 123.123.123.123.

Si vous vous connectez au serveur d'une manière qui nécessite que le démon SSH envoie des paquets vers la destination autre que l'une des précédentes, le trafic ne sera pas autorisé à sortir.

Pour autoriser les paquets sortants de votre démon SSH vers le client SSH, vous devez ajouter la règle suivante:

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Vous pouvez également vouloir ajouter des critères IP de destination à la règle ci-dessus, si vous vous connectez uniquement à partir d'un seul emplacement. Cette règle doit précéder la règle ultime "DROP else else" pour la chaîne de sortie.

10
hellodanylo

Votre #SSH la règle implique que ssh est une forme de communication à sens unique, ce qui n'est pas le cas. Les données sont envoyées et en retour.

La manière normale de traiter cela, puisque vous ne pouvez pas connaître à l'avance le numéro de port côté client, est d'autoriser les connexions qui sont considérées "établies" ou "liées" à une connexion établie. Pour ce faire, vous avez besoin de:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Avant vos règles DROP (et de préférence en haut, car les règles sont traitées dans l'ordre et ces deux s'appliquent à la plupart des paquets).

Il y a une explication de la façon dont une connexion TCP devient ETABLISHED ici ; essentiellement, le fait que le serveur réponde au paquet autorisé par votre #SSHINPUT la règle le fait.

13
goldilocks