Règles IPTables pour autoriser les connections SSH entrantes

Le but de ce script est d'autoriser uniquement le trafic sur le VPN, à l'exception de l'hôte local <-> localhost et du trafic SSH entrant. Mais quand j'exécute le script sur SSH, je suis déconnecté et forcé à redémarrer le 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 

La string de sortie est responsable de tout package sortant.

Votre script autorise uniquement les packages sortants à l'interface tunnel, localhost et hôte distant au 123.123.123.123.

Si vous vous connectez au server d'une manière qui nécessite que le démon SSH envoie des packages à la destination autre que l'un des éléments ci-dessus, le trafic ne sera pas autorisé à sortir.

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

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

Vous pouvez également append des critères IP de destination à la règle ci-dessus, si vous vous connectez uniquement à partir d'un seul location. Cette règle doit venir avant la règle ultime «DROP anything else» pour la string de sortie.

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

La façon normale de résoudre ce problème, étant donné que vous ne pouvez pas connaître à l'avance le numéro de port du client, consiste à autoriser les connections considérées comme «établies» ou «associées» à une connection é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 preference en haut, puisque les règles sont traitées dans l'ordre et ces deux vont s'appliquer à la plupart des packages).

Il y a une explication de la façon dont une connection TCP devient ÉTABLIE ici ; essentiellement, le fait que le server répond au package autorisé par votre règle #SSH INPUT fait.