Reverse SSH est une technique qui peut être utilisée pour accéder aux systèmes (qui sont derrière un pare-feu) depuis le monde extérieur.
Comme vous le savez déjà, SSH est un protocole réseau qui prend en charge la communication cryptographique entre les nœuds du réseau. En utilisant ce protocole, vous pouvez effectuer une connexion à distance sécurisée, une copie sécurisée depuis/vers une machine distante, etc.
Vous ferez généralement ce qui suit pour vous connecter à un serveur distant en toute sécurité à l'aide de la commande ssh.
$ ssh [your-account-login]@[server-ip]
Qu'est-ce que le SSH inversé ?
SSH est un très bon outil pour accéder en toute sécurité à une machine ou à un serveur distant. Mais, le problème survient lorsque vous essayez de vous connecter à un serveur distant qui se trouve derrière un pare-feu et que ce pare-feu refuse toute connexion entrante ou demande de transfert de données qui n'a pas de demande sortante préalable. Cela signifie que seules les connexions initiées par la machine serveur distante seraient autorisées. C'est un vrai problème pour ceux qui veulent accéder à distance à cette machine serveur.
Reverse SSH fournit une technique grâce à laquelle vous pouvez simuler un SSH normal vers cette machine serveur distante.
Le principal problème est que le pare-feu rejette la connexion ssh que votre machine tente d'établir avec une machine serveur distante. Mais vous savez que le même pare-feu n'aura aucun problème avec les connexions provenant de la machine serveur. Alors, pourquoi ne pas demander à quelqu'un qui est assis derrière le pare-feu de faire quelque chose avec lequel vous pouvez atteindre votre objectif d'accéder à distance au serveur. Pour ce faire, nous devons utiliser l'option ssh -R.
Voici la description de l'option ssh -R de la page de manuel :
-R [bind_address :]port :hôte :porthôte
Spécifie que le port donné sur l'hôte distant (serveur) doit être transmis à l'hôte et au port donnés du côté local. Cela fonctionne en allouant un socket pour écouter le port du côté distant, et chaque fois qu'une connexion est établie sur ce port, la connexion est transmise sur le canal sécurisé et une connexion est établie avec le port hôte hostport à partir de la machine locale.
Vous pouvez donc utiliser la commande ssh, avec l'option -R, (du serveur dans notre cas) pour vous connecter à votre machine, y allouer un port et vous assurer que toute demande de connexion sur ce port est transmise au port ssh du serveur distant.
Au lieu que votre machine fasse un ssh, la machine serveur fait un ssh et via la redirection de port s'assure que vous pouvez revenir en ssh à la machine serveur.
Comment créer un tunnel SSH inversé ?
Voici la commande que votre ami assis côté serveur distant doit exécuter sur le serveur :
ssh -fN -R 7000:localhost:22 username@yourMachine-ipaddress
Ainsi, cette demande de connexion ssh provenant du serveur distant vers votre machine garantira que toute demande de connexion ssh pour le port 7000 sur votre machine est transmise au port 22 du serveur distant.
Faites maintenant une demande de connexion ssh de votre machine à votre propre machine au port 7000 :
ssh username@localhost -p 7000
Ici, même s'il peut sembler que vous utilisez ssh sur localhost, votre demande serait transmise à l'hôte distant. Donc, vous devez utiliser votre compte "nom d'utilisateur" sur le serveur distant et lorsque vous êtes invité à entrer le mot de passe, entrez le mot de passe correspondant.
Cela devrait effacer la plupart des aspects liés à la technique ssh inversée. Mais, il y a un hic. Le hic, c'est que vous devez d'abord demander à un de vos amis - qui est assis derrière le pare-feu - de créer une connexion ssh. Ce n'est pas faisable à chaque fois.
Pour surmonter ce problème, vous pouvez configurer une machine qui n'est pas protégée par un pare-feu (tout comme la vôtre) de manière à ce qu'elle soit toujours allumée. Appelons cette machine machine_z.
L'avantage de machine_z est que vous pouvez une fois faire cette configuration ssh inversée et la laisser comme ça. À tout moment, lorsque vous devez vous connecter à une machine distante, vous pouvez vous connecter en ssh à machine_z sur un port spécifié (comme indiqué précédemment) et votre demande de connexion sera transmise à la machine serveur distante et voilà, vous exécuterez des commandes à distance. serveur.
Sur une note connexe, vous pouvez également configurer aucun mot de passe SSH pour vous connecter à un autre serveur sans entrer le mot de passe.
Certains paramètres que vous devez configurer sur machine_z incluraient :
- Assurez-vous que les paramètres TCPKeepAlive, ClientAliveInterval, ClientAliveCountMax et GatewayPorts sont définis sur les valeurs appropriées. Ces paramètres se trouvent dans le fichier /etc/sshd_config ou /etc/ssh/sshd_config
- Si vous apportez des modifications aux paramètres ci-dessus, vous devez redémarrer le démon sshd pour refléter les modifications.
- Assurez-vous également d'exécuter la première commande ssh (qui est exécutée du serveur distant vers machine_z) à l'aide de la commande nohup afin que cette session ssh soit immunisée contre les raccrochages qui peuvent se produire lorsqu'un utilisateur se déconnecte.