Le but de ce script est d'autoriser uniquement le trafic 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
Votre
#SSH
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 en avant et en arrière.La manière normale de gérer cela, puisque vous ne pouvez pas connaître à l'avance le numéro de port côté client, consiste à autoriser les connexions considérées comme "établies" ou "liées" à une connexion établie. Pour ce faire, vous avez besoin de:
Avant vos
DROP
règles (et de préférence en haut, car les règles sont traitées dans l'ordre et ces deux-là s'appliqueront à la plupart des paquets).Il y a une explication de la façon dont une connexion TCP est établie ici ; essentiellement, le fait que le serveur réponde au paquet autorisé par votre
#SSH
INPUT
règle le fait.la source
-p tcp
faire une différence dans ce sens, et regardez l'explication suivante pour UDP sur cette page (c'est la même chose). Le fait est que le serveur répond sans savoir si iptables le permettra ou non, et lorsque iptables reçoit cette réponse du serveur sur le système local , il a maintenant vu du trafic dans les deux sens (même si le client ne l'a pas encore fait), considère la connexion est établie et laisse sortir la réponse. La "technicité" repose ici sur le fait que le pare-feu est au milieu des deux parties.