Outils personnels

Tunnel SSH via un serveur intermédiaire : Différence entre versions

De wikiGite

(En enlevant l’intermédiaire !)
 
(8 révisions intermédiaires par le même utilisateur non affichées)
Ligne 4 : Ligne 4 :
 
  ssh -C -N -f -L port-local:serveur-cible:port-du-serveur-cible user@serveur-intermediaire
 
  ssh -C -N -f -L port-local:serveur-cible:port-du-serveur-cible user@serveur-intermediaire
 
Un tunnel est ouvert entre le poste local et le serveur intermédiaire par SSH. Serveur-intermediaire redirige les requêtes vers serveur-cible.<br/>
 
Un tunnel est ouvert entre le poste local et le serveur intermédiaire par SSH. Serveur-intermediaire redirige les requêtes vers serveur-cible.<br/>
En toutes lettres : ''en allant sur le port local'' ("'''-L port-local'''") ''du poste local'' ('''127.0.0.1''', par défaut) ''on accède à serveur-intermediaire en ssh'' ('''user@serveur-intermediaire''') ''qui renvoie les requêtes vers serveur-cible sur le port port-du-serveur-cible'' ('''serveur-cible:port-du-serveur-cible''')
+
En toutes lettres : ''en allant sur port-local'' ("'''-L port-local'''") ''du poste local'' ('''127.0.0.1''', par défaut) ''on accède à serveur-intermediaire en ssh'' ('''user@serveur-intermediaire''') ''qui renvoie les requêtes vers serveur-cible sur le port port-du-serveur-cible'' ('''serveur-cible:port-du-serveur-cible''')
 
 
On accède alors à serveur-cible en utilisant "localhost" et "port-local". la requête sur ce port passe dans le tunnel et est redirigée par serveur-intermediaire.
 
  
 
'''Pour utiliser un certificat''' (par exemple une connexion root entre le poste et serveur-intermediaire sans mot de passe, avec échange de clés DSA) reprendre les options standards de ssh :
 
'''Pour utiliser un certificat''' (par exemple une connexion root entre le poste et serveur-intermediaire sans mot de passe, avec échange de clés DSA) reprendre les options standards de ssh :
  ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire -i /<chemin>/<du>/<certificat>/<dsa>
+
  ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire '''-i /<chemin>/<du>/<certificat>/<dsa>'''
 
En général, les certificats générés par ssh-keygen sont conservés sous $HOME/.ssh/id_dsa.
 
En général, les certificats générés par ssh-keygen sont conservés sous $HOME/.ssh/id_dsa.
  
 
'''De même pour utiliser un port ssh alternatif''' sur serveur intermediaire :
 
'''De même pour utiliser un port ssh alternatif''' sur serveur intermediaire :
  ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire -p <port-alternatif>
+
  ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire '''-p <port-alternatif>'''
Toutes ces options sont combinables entre elles.
+
Toutes ces options sont évidemment combinables entre elles.
  
 
== Exemples ==
 
== Exemples ==
Si on veut atteindre le port 443 (HTTPS) d'un serveur-cible, mais les seuls ports disponibles sont le 80 (HTTP) et le 22 (SSH). :
+
Si on veut atteindre le port 443 (HTTPS) d'un serveur-cible, mais les seuls ports disponibles pour notre poste (sur un réseau derrière un proxy, par exemple) sont le 80 (HTTP) et le 22 (SSH) :
 
  ssh -C -N -f -L 80:www.serveur-cible.tld:443 user@serveur-intermediaire
 
  ssh -C -N -f -L 80:www.serveur-cible.tld:443 user@serveur-intermediaire
 
"user" doit avoir le droit de se connecter sur serveur-intermediaire.
 
"user" doit avoir le droit de se connecter sur serveur-intermediaire.
Ligne 28 : Ligne 26 :
 
"serveur-cible" recevra une requête 3389 (RDP) provenant de "serveur-intermediaire" dont l'IP est autorisée.
 
"serveur-cible" recevra une requête 3389 (RDP) provenant de "serveur-intermediaire" dont l'IP est autorisée.
 
Dans le client RDP, en mettant "localhost" comme nom de serveur, on accède au bureau à distance ou à TSE de serveur-cible, par le tunnel.
 
Dans le client RDP, en mettant "localhost" comme nom de serveur, on accède au bureau à distance ou à TSE de serveur-cible, par le tunnel.
 +
 +
== En enlevant l’intermédiaire ! ==
 +
Et oui, ce n'était pas l'objet initial de ce tuto, mais si le réseau le permet (pas de proxy ou firewall) on peut directement créer le tunnel vers le serveur final. On ouvre un port sur le poste local (localhost) relié par ssh à un port d'un serveur distant. Exemple avec Mysql :
 +
ssh -L 3306:localhost:3306 -f -N root@dbserver.domain.com
 +
Puis on peut s'y connecter directement :
 +
mysql -h 127.0.0.1 -u root -p
 +
"-h 127.0.0.1" est obligatoire ici pour dire au client mysql ne se connecter en TCP au port 3306 local (par défaut), et non pas en socket unix local.

Version actuelle datée du 29 juin 2016 à 07:52

A partir d'un poste, on veut atteindre un serveur externe, sur un port exotique (222, 81, 444, ...) ou standard (25, 443, ...) mais fermé en sortie par un proxy.

La syntaxe :

ssh -C -N -f -L port-local:serveur-cible:port-du-serveur-cible user@serveur-intermediaire

Un tunnel est ouvert entre le poste local et le serveur intermédiaire par SSH. Serveur-intermediaire redirige les requêtes vers serveur-cible.
En toutes lettres : en allant sur port-local ("-L port-local") du poste local (127.0.0.1, par défaut) on accède à serveur-intermediaire en ssh (user@serveur-intermediaire) qui renvoie les requêtes vers serveur-cible sur le port port-du-serveur-cible (serveur-cible:port-du-serveur-cible)

Pour utiliser un certificat (par exemple une connexion root entre le poste et serveur-intermediaire sans mot de passe, avec échange de clés DSA) reprendre les options standards de ssh :

ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire -i /<chemin>/<du>/<certificat>/<dsa>

En général, les certificats générés par ssh-keygen sont conservés sous $HOME/.ssh/id_dsa.

De même pour utiliser un port ssh alternatif sur serveur intermediaire :

ssh -C -N -f -L port-local:ip-du-serveur-final:port-du-serveur-cible user@serveur-intermediaire -p <port-alternatif>

Toutes ces options sont évidemment combinables entre elles.

Exemples

Si on veut atteindre le port 443 (HTTPS) d'un serveur-cible, mais les seuls ports disponibles pour notre poste (sur un réseau derrière un proxy, par exemple) sont le 80 (HTTP) et le 22 (SSH) :

ssh -C -N -f -L 80:www.serveur-cible.tld:443 user@serveur-intermediaire

"user" doit avoir le droit de se connecter sur serveur-intermediaire. Dans un navigateur, l'URL :

https://localhost:80

accèdera par le tunnel au HTTPS (443) de serveur-cible, en utilisant uniquement le port 22.


Autre exemple : on veut ouvrir une connexion RDP (3389) vers un serveur qui n'autorise qu'une seule adresse IP en entrée, celle d'un serveur linux, et pas celle du poste qui lancera le client RDP.

ssh -C -N -f -L 3389:serveur-cible:3389 user@serveur-intermediaire

"serveur-cible" recevra une requête 3389 (RDP) provenant de "serveur-intermediaire" dont l'IP est autorisée. Dans le client RDP, en mettant "localhost" comme nom de serveur, on accède au bureau à distance ou à TSE de serveur-cible, par le tunnel.

En enlevant l’intermédiaire !

Et oui, ce n'était pas l'objet initial de ce tuto, mais si le réseau le permet (pas de proxy ou firewall) on peut directement créer le tunnel vers le serveur final. On ouvre un port sur le poste local (localhost) relié par ssh à un port d'un serveur distant. Exemple avec Mysql :

ssh -L 3306:localhost:3306 -f -N root@dbserver.domain.com

Puis on peut s'y connecter directement :

mysql -h 127.0.0.1 -u root -p

"-h 127.0.0.1" est obligatoire ici pour dire au client mysql ne se connecter en TCP au port 3306 local (par défaut), et non pas en socket unix local.