Table des matières
CheatSheet
Faire du Port Forwarding avec SSH
Les variables de cette page :
- $ip_ecoute : IP d'écoute pour le port (falcutatif, par défaut localhost)
- $port_entrer : Port d'entré pour joindre le $port_local
- $host : host que l’émetteur du port va joindre
- $port_local : Port d'écoute du port à joindre
En gros, une fois le tunnel mis en place, l'host ayant accès au port devra joindre $ip_ecoute sur le $port_entre afin de joindre $host sur le $port_local
Forward un port local vers un hôte distant
Théorie
Ce mode permet de donner accès à un host distant l'accès a un port d'un host qu'il a accès
# ssh -R $ip_ecoute:$port_entrer:$host:$port_local root@hostname
Pratique
Je veux que quelqu'un puisse se connecter à ma machine par SSH mais je ne veux/peux pas modifier mon firewall pour faire du NAT sur mon port 22 alors que lui par contre l'a fait.
Je vais donc forward mon port SSH (22) dans un tunnel SSH grâce a la commande :
# ssh -R 2222:localhost:22 root@XXX.XXX.XXX.XXX
Il devra donc se connecter sur le port 2222 pour joindre ma machine sur le port 22
Attention, pour autoriser l'écoute sur une IP autre que la loopback, il faut ajouter la ligne suivante dans le fichier /etc/ssh/sshd_config :
GatewayPorts clientspecified
Puis redémarrer le service sshd.
Forward d'un port distant sur la machine local
Théorie
Cela permet d'accéder à un port distant via la machine distante
# ssh -L $port_entrer:$host:$port_local root@hostname
Pratique
Je souhaite accéder a un serveur par RDP mais pas de NAT n'est fait vers lui, mais il y a du NAT vers le SSH d'un serveur linux qui est dans le même réseau (10.10.0.0/24), je vais donc faire du RDP vers le serveur Windows en passant dans un tunnel SSH grâce à la commande :
# ssh -L 3389:10.10.0.2:3389 root@XXX.XXX.XXX.XXX
Il faudra que je me connecte à localhost pour me connecter au serveur Windows
10.10.0.2 étant l'IP du serveur Windows
Forward dynamique via proxy SOCKS
Théorie
Cela permet de permettre de faire passer l'intégralité du trafic d'une app ou de la machine via un proxy SOCKS.
# ssh -D $host:$port_local root@hostname
Pratique
Je souhaite que tout le trafic de mon firefox passe par cette session SSH.
Je lance donc la session :
# ssh -D 5999 root@XXX.XXX.XXX.XXX
Puis de lancer mon Chrome avec la configuration adéquate :
# google-chrome --proxy-server="socks5://127.0.0.1:5999"
Le DNS ne passe pas a travers le proxy
Notes Importantes
Certains port nécessite que l'utilisateur distant soit root pour pouvoir créer le port forwarding
L' argument -N permet d'indiquer qu'aucune commande ne sera exécuter sur l'host distant et -f met la session SSH en arrière plan. Ces arguments sont utiles si vous voulais lancer ces commandes en arrière plan (au démarrage par exemple)
Manipulation de la session SSH en cours
Il est parfois nécessaire ou plus simple de manipuler la session SSH active, pour cela il est possible d'envoyer une combinaison de touche afin d’effectuer une action. Elle doit toujours être précédé d'un caractère d’échappement (après un appui sur la touche entrée).
Note: Depuis OpenSSH 9.2, il faut l'activer en ajoutant ceci dans votre fichier ~/.ssh/config :
EnableEscapeCommandline yes
Voici les combinaisons possibles :
Commande | Description |
---|---|
~? | Commande d'aide, donc toutes ces commandes |
~. | Kill la session de manière forcé |
~B | Envoi un signal BREAK au système distant |
~R | Renégociation des clés (uniquement sur SSH protocol 2) |
~^Z | Suspendre la session |
~# | Liste les sessions forwardés active |
~& | background la session |
~~ | Envoi le carectère ~ |
~C | Ouvre un interface de commande pour SSH |
Les commandes disponibles sont :
Commande | Description |
---|---|
-L $ip_ecoute:$port_entre:$host:$port_local | Forward un port local |
-R $ip_ecoute:$port_entrer:$host:$port_local | Forward un port distant |
-D $ip_ecoute:$port_entrer | Forward dynamique |
-KL $ip_ecoute:$port_entrer | Annule un forward un port local |
-KR $ip_ecoute:$port_entrer | Annule un forward un port distant |
-KD $ip_ecoute:$port_entrer | Annule un forward un port dynamique |