Tunnels SSH

From Alliance Doc
Jump to navigation Jump to search
This site replaces the former Compute Canada documentation site, and is now being managed by the Digital Research Alliance of Canada.

Ce site remplace l'ancien site de documentation de Calcul Canada et est maintenant géré par l'Alliance de recherche numérique du Canada.

This page is a translated version of the page SSH tunnelling and the translation is 100% complete.
Other languages:

Page enfant de SSH/fr

Description

Un tunnel SSH permet d’utiliser un ordinateur passerelle pour connecter deux ordinateurs qui ne peuvent pas être connectés directement l’un à l’autre.

Dans certains cas, il est nécessaire de mettre en place un tunnel puisque les nœuds de calcul de Niagara, Béluga et Graham n’ont pas d’accès direct avec l’Internet ni ne peuvent être contactés directement via l’Internet.

Un tunnel sera requis dans les cas suivants :

  • pour utiliser une application du commerce qui doit entrer en contact avec un serveur de licence via l’Internet;
  • pour utiliser une application de visualisation sur un nœud de calcul avec lequel une application client sur l’ordinateur local d’un utilisateur doit entrer en contact;
  • pour utiliser Jupyter Notebook sur un nœud de calcul avec lequel le navigateur Web sur l’ordinateur local d’un utilisateur doit entrer en contact;
  • pour se connecter au serveur de base de données de Cedar à partir d’un point autre que le nœud frontal de Cedar, par exemple votre ordinateur personnel.

Dans le premier cas, le serveur de licence est situé à l’extérieur de la grappe et est rarement contrôlé par l’utilisateur alors que dans les autres cas, le serveur se trouve dans le nœud de calcul et la difficulté est de s’y connecter à partir de l’extérieur. Nous traitons ici des deux situations.

Même si elles ne sont pas essentielles à l'utilisation de tunnels, vous pourriez vous familiariser avec les clés SSH.

Entrer en contact avec un serveur de licence à partir d’un nœud de calcul

Qu’est-ce qu’un port?

Un port logiciel (identifié par son numéro) permet de distinguer différents interlocuteurs. Il s’agit en quelque sorte d’une fréquence radio ou d’un canal. Par obligation ou par convention, plusieurs de ces numéros sont réservés à des types particuliers de communication; pour plus d’information, consultez cette liste de ports logiciels.


Certaines applications du commerce doivent se connecter à un serveur de licence quelque part sur Internet à partir d’un port prédéterminé. Quand le nœud où une application est exécutée n’a pas accès à l’Internet, un serveur passerelle ayant accès est utilisé pour acheminer les communications par ce port, du nœud de calcul vers le serveur de licence. On met donc en place un tunnel SSH, pour effectuer une redirection de port (port forwarding).

Souvent, la mise en place d’un tunnel pour une tâche en série ne nécessite que deux ou trois commandes dans le script de la tâche. Vous aurez besoin

  • de l’adresse IP ou nom du serveur de licence (ici LICSERVER);
  • du numéro du port du serveur de licence (ici LICPORT).

Ces renseignements peuvent être obtenus de la personne qui gère le serveur de licence. Le serveur doit aussi permettre la connexion à partir des nœuds de connexion; dans le cas de Niagara, l’adresse IP vers l’extérieur est 142.1.174.227 ou 142.1.174.228.

Le tunnel peut maintenant être mis en place. Sur Graham, une autre solution serait de demander une exception de pare-feu pour LICSERVER et son port LICPORT.

Le serveur passerelle pour Niagara est nia-gw. Pour Graham, choisissez un nœud de connexion (gra-login1, 2, ...). Ici, notre nœud passerelle se nomme GATEWAY. Choisissez aussi le numéro de port du nœud de calcul que vous voulez utiliser (ici COMPUTEPORT).

La commande SSH dans le script est

ssh GATEWAY -L COMPUTEPORT:LICSERVER:LICPORT -N -f

Les éléments à la suite du paramètre -L définissent les options de redirection :

  • -N fait en sorte que SSH n’ouvre pas d’interpréteur sur GATEWAY;
  • -f et -N empêchent SSH de lire les données en entrée (ce qui est néanmoins impossible pour une tâche de calcul);
  • -f fait en sorte que SSH soit exécuté en arrière-plan et que les commandes qui suivent soient exécutées.

Une autre commande devrait être ajoutée pour que l’application sache que le serveur de licence se trouve sur le port COMPUTEPORT du serveur localhost. Le terme localhost est le nom avec lequel un ordinateur réfère à lui-même; il ne doit pas être remplacé par le nom de votre ordinateur. La procédure exacte varie selon l’application et le type de serveur de licence; par contre, il ne s’agit souvent que de définir une variable d’environnement dans le script, par exemple

export MLM_LICENSE_FILE=COMPUTEPORT@localhost

Exemple de script

Le script suivant met en place un tunnel SSH pour entrer en contact avec licenseserver.institution.ca au port 9999.

#!/bin/bash
#SBATCH --nodes 1
#SBATCH --ntasks 40
#SBATCH --time 3:00:00

REMOTEHOST=licenseserver.institution.ca
REMOTEPORT=9999
LOCALHOST=localhost
for ((i=0; i<10; ++i)); do
  LOCALPORT=$(shuf -i 1024-65535 -n 1)
  ssh nia-gw -L $LOCALPORT:$REMOTEHOST:$REMOTEPORT -N -f && break
done || { echo "Giving up forwarding license port after $i attempts..."; exit 1; }
export MLM_LICENSE_FILE=$LOCALPORT@$LOCALHOST

module load thesoftware/2.0
mpirun thesoftware .....

Se connecter à une application qui est exécutée sur un nœud de calcul

Un tunnel crypté peut être mis en place dans un nœud de connexion d’une grappe pour connecter l’ordinateur d’un utilisateur à un nœud de calcul de cette grappe. L’ordinateur de l’utilisateur peut ainsi afficher de façon transparente des visualisations et des graphiques de Jupyter Notebook exécutés dans un nœud de calcul de la grappe. Lorsque la seule façon de se connecter à un serveur de base de données est par un nœud frontal, un tunnel SSH peut déplacer le numéro arbitraire de port d’un réseau de calcul vers le nœud frontal de la grappe et l’associer au serveur de base de données.

Graham et Cedar effectuent une NAT (network address translation) pour que les utilisateurs puissent avoir accès à l’Internet à partir des nœuds de calcul. Le pare-feu de Graham bloque cependant l’accès par défaut. Il faut faire une demande au soutien technique pour faire ouvrir un port IP particulier; indiquez l'adresse ou les adresses IP qui utiliseront ce port.

De Linux ou MacOS X

Le paquet Python sshuttle est recommandé.


Sur votre ordinateur, ouvrez une nouvelle fenêtre de terminal et lancez la commande

Question.png
[name@my_computer $] sshuttle --dns -Nr userid@machine_name

Copiez et collez l’URL de l'application dans votre navigateur. Si votre application est Jupyter Notebook par exemple, l'URL comprendra un token :

 http://cdr544.int.cedar.computecanada.ca:8888/?token=7ed7059fad64446f837567e32af8d20efa72e72476eb72ca

De Windows

Un tunnel SSH peut être créé avec MobaXTerm comme suit :

Lancez deux sessions MobaXterm.

  • La session 1 devrait servir à la connexion à la grappe. Lancez ici votre tâche selon les directives de votre application, par exemple avec Jupyter Notebook. Vous devriez recevoir une URL qui contient le nom et un port du nœud hôte, par exemple cdr544.int.cedar.computecanada.ca:8888.
  • La session 2 est un terminal local dans lequel le tunnel SSH sera mis en place. Lancez la prochaine commande en remplaçant le nom du nœud par l'URL obtenue dans la session 1.
Question.png
[name@my_computer ]$  ssh -L 8888:cdr544.int.cedar.computecanada.ca:8888 someuser@cedar.computecanada.ca

Cette commande effectue une redirection des connexions au port local 8888 vers le port 8888 sur cdr544.int.cedar.computecanada.ca, nom donné au port distant. Il n'est pas nécessaire que les numéros soient identiques, mais il s'agit d'une convention qui permet d'identifier facilement le port local et le port distant.

Modifiez l'URL obtenue dans la session 1 en remplaçant le nom du nœud par localhost. Suivant l'exemple avec Jupyter Notebook, l'URL à copier dans le fureteur est :

 http://localhost:8888/?token=7ed7059fad64446f837567e32af8d20efa72e72476eb72ca

Se connecter à un serveur de base de données sur Cedar à partir de votre ordinateur

Les commandes suivantes créent un tunnel SSH de votre ordinateur aux serveurs PostgreSQL et MySQL.

 
ssh -L PORT:cedar-pgsql-vm.int.cedar.computecanada.ca:5432 someuser@cedar.computecanada.ca
ssh -L PORT:cedar-mysql-vm.int.cedar.computecanada.ca:3306 someuser@cedar.computecanada.ca

Ces commandes connectent le numéro de port PORT de votre ordinateur local à cedar.computecanada.ca:PORT; la valeur du numéro de port doit être inférieure à 32768 (2^15). Dans cet exemple, someuser est le nom d’utilisateur associé à votre compte. En lançant une de ces commandes, vous serez connecté à Cedar comme toute autre connexion SSH. La seule différence entre cette connexion et une connexion SSH ordinaire est que vous pouvez ainsi utiliser un autre terminal pour vous connecter directement au serveur de base de données à partir de votre ordinateur personnel. Sur votre ordinateur personnel, exécuter la commande usuelle, par exemple pour PostgreSQL et MySQL :

 
psql -h 127.0.0.1 -p PORT -U <your username> -d <your database>
mysql -h 127.0.0.1 -P PORT -u <your username> --protocol=TCP -p 

Un mot de passe est requis pour MySQL; il se trouve dans le fichier .my.cnf situé dans votre répertoire home de Cedar. La connexion à la base de données est maintenue tant que la connexion SSH est active.