Vous êtes ici

VNC à travers un pare-feu

Depuis Windows XP

J'ai eu récemment à résoudre le problème suivant : prendre le contrôle à distance de mon PC sous linux, situé derrière un routeur/pare-feu, depuis un PC sous Windows XP, situé lui aussi derrière un pare-feu, le tout à travers l'internet, bien sûr :-)

Les quelques paragraphes suivants résument les manipulations à effectuer pour parvenir à ce résultat.

Dans ce qui suit, PC distant désigne le PC sous linux, dont je veux prendre le contrôle à distance. Et PC local désigne le PC sous Windows. Globalement, voici ce qu'il faut réaliser :

  • ouvrir un tunnel SSH entre le PC distant et le PC local, depuis le PC local. Ce tunnel permet d'une part de sécuriser la connexion entre les deux PC, d'autre part de passer à travers le proxy du réseau dans lequel se situe le PC local.
  • lancer le serveur vnc sur le PC distant.
  • lancer le viewer vnc sur le PC local.

Maintenant, en détail, voici les manipulations à effectuer :

  • sur le PC local, installer PuTTY (choisir la version Windows-style installer).
  • configurer PuTTY comme suit :


    Session
    Host Name : <adresseRouteurPareFeuDistant>
    # Si adresse IP dynamique, voir plus loin.
    Port : 22 # ssh
    Connection
    Proxy
    Proxy type : SOCKS 5 # selon le proxy réseau local
    Proxy hostname : <adresseProxy>
    Port : <portProxy>
    SSH
    Tunnels : L5905 127.0.0.1:5900
  • le tunnel indique que les données envoyées localement (PC local) au port 5905 seront transmises par l'autre extrémité du tunnel SSH (au PC distant donc - enfin, pas tout-à-fait, dans le cas d'une configuration distante "habituelle" routeur pare-feu - voir plus loin) à la machine 127.0.0.1 (le PC distant donc), au port 5900. Le port 5900 est celui sur lequel le serveur vnc utilisé est à l'écoute. Le port 5905 correspond au display 5 (peut être n'importe quel autre nombre : 5900 et 0 par exemple) qui sera donné à vncviewer sur le PC local. En plus concret, ce que l'on fait là a pour but de faire passer les données vncviewer à travers le proxy du réseau dans lequel se trouve le PC local.

  • sur le PC distant, installer x11vnc, et configurer le mot de passe :
    emerge x11vnc
    mkdir .vnc
    x11vnc -storepasswd 'unmotdepasse' $HOME/.vnc/passwd
  • sur le PC distant, lancer le serveur vnc :
    x11vnc -display :0 -rfbauth $HOME/.vnc/passwd

    (l'utilisation du mot de passe x11vnc n'est pas nécessaire dans une configuration où le PC distant vous appartient)

  • toujours au niveau du PC distant, déclarer le transfert de port/adresse dans le routeur/pare-feu : le port 22 en TCP doit être envoyé au port 22 sur le PC distant.
  • enfin, dernier point concernant le PC distant : si l'adresse IP attribuée au routeur/pare-feu par le fournisseur d'accès internet est dynamique, il faut au préalable déclarer le routeur au niveau d'un service tel que dyndns.
  • sur le PC local, lancer vncviewer, en indiquant la machine suivante : 127.0.0.1:5
  • donner le mot de passe déclaré côté PC distant.
  • et voilà !

A noter que sous linux, contrairement à Windows, VNC peut être utilisé de deux façons bien distinctes :

  • créer une nouvelle session X lors d'une connexion VNC
  • partager la session X existante lors d'une connexion VNC

Mon besoin était la prise de contrôle à distance. C'est donc la mise en place de la deuxième possibilité qui est décrite ici...

Enfin, je laisse au lecteur le soin de déterminer les paramètres à utiliser pour obtenir la meilleure compression possible des échanges de données entre le PC distant et le PC local... :-)

11/08/2008 - Depuis un PC local sous linux

Le programme connect-proxy doit être installé. Il figure normalement dans les paquets standards de la distribution utilisée, sous le nom de connect-proxy.

Créer dans le répertoire utilisateur le sous-répertoire .ssh/, avec un fichier nommé config, au contenu suivant :

Host <PCdistant>   
ProxyCommand connect-proxy -5 -S <adresseProxt>:<portProxy> %h %p

Se connecter en ssh au PC distant par la commande

ssh -L5905:127.0.0.1:5900 <adresseRouteurPareFeuDistant> \     
-l <utilisateurDistant>

Une fois connecté, lancer x11vnc sur le PC distant : x11vnc -display :0 (comme vu ci-dessus, le mot de passe n'est pas forcément utile).

Puis lancer vncviewer sur le PC local, en indiquant l'adresse 127.0.0.1 et l'écran 5 (127.0.0.1:5). Pour améliorer les performances, ajouter les options -encodings tight -compresslevel 5 à la commande vncviewer.

02/11/2009 - x11vnc et le Nokia N810

Lorsque l'on utilise le client VNC Maemo, la frappe de chaque caractère se traduit par le doublage de celui-ci à l'affichage. Ce qui rend inutilisable une connexion VNC...

Plusieurs solutions sont indiquées ici. J'ai essayé celle qui consiste à démarrer le serveur x11vnc avec l'option -skip_dups : elle fonctionne.

18/11/2011 - généralisation (sous Linux)

Il est possible qu'aucun proxy SOCKS ne soit disponible, pour le réseau derrière le proxy. Dans ce cas, il est possible d'utiliser le port 443 (HTTPS) qui lui est toujours ouvert.

Par ailleurs, le programme connect-proxy peut être remplacé par la commande nc. Ce qui au final donne, pour le fichier de configuration ssh :

Host <PCdistant>   
ProxyCommand /bin/nc -X connect -x <adresseProxy>:<portProxy> %h %p
Port 443

La commande SSH reste identique à celle présentée plus haut.