Le cas typique est de vouloir contrôler l’écran physique d’un ordinateur à distance et interagir avec ce que voit l’utilisateur assis devant l’écran (style TeamViewer or Remote Desktop sous Windows) :
Pour cela il vous faut un serveur VNC sur l’ordi distant et un client VNC chez vous.
Pour le serveur VNC, x11vnc est la solution qui permet de voir par VNC un serveur X (en gros, le serveur graphique sous Linux) actif.
La documentation de x11vnc est très complète.
Sur la machine cible, on démarre le serveur VNC sur l’écran physique, en écoute locale et avec un mot de passe :
$ x11vnc -display :0
Le serveur est alors en écoute sur le port 5900. A noter que rien n’est chiffré et aucun contrôle d’accès n’est effectué dans cette configuration.
Pour le client VNC, vinagre ou xtightvncviewer font l’affaire. Pour se connecter depuis votre machine:
$ vncviewer ipmachinecible
Si vous voulez faire des connections à distance passant par un réseau non sécurisé et sans accès directs aux machines (NAT des box FAI) vous devrez user des tunnels SSH et du mappage de ports avec upnpc
Je vous donne 2 exemples :
Tunnel SSH
On se trouve dans le schéma suivant.
A->B->C
On va depuis la machine A contrôler l’écran de la machine C, mais on doit passer le flux par une machine B. Le flux sera chiffré de bout en bout par SSH.
On se trouve devant la machine A:
On crée un tunnel chiffré pour le port 5900 entre la machine A et B :
$ ssh -t -L 5900:localhost:5900 userb@B
On est maintenant connecté sur B par SSH.
On crée un tunnel chiffré pour le port 5900 entre la machine B et C :
$ ssh -t -L 5900:localhost:5900 userc@C
On est maintenant connecté sur C par SSH.
On démarre le serveur VNC sur l’écran physique, en local pour ne pas être accessible à d’autres sur le réseau :
$ x11vnc -display :0 -local
Sur la machine A, on ouvre un second terminal pour lancer le client VNC:
$ vncviewer localhost
Redirection de ports sur une Box FAI et chiffrement SSL
On se trouve dans le schéma suivant.
A->Box<-C
La machine C n’est pas accessible directement. Seule la Box ayant une IP publique sur Internet.
Depuis la machine C, on démarre le serveur VNC en écoute sur le port 5900 disponible sur le réseau cette fois, avec un chiffrement SSL (certificat autogénéré), un mot de passe et optionnellement un serveur HTTPS:
$ x11vnc -display :0 -ssl SAVE -passwd unmotdepassecomplique -https
Toujours sur la machine C, on redirige un port entrant de la Box vers la machine C :
$ upnpc -r 5900 TCP
Le serveur VNC est maintenant exposé sur Internet à l’adresse IP de la Box. D’où l’importance du mot de passe pour en barrer l’entrée.
Vous trouverez plus d’infos dans mon article sur les redirections avec upnp sur comment récupérer l’IP publique de la Box
Sur la machine A, on doit utiliser un client VNC qui supporte le chiffrement SSL. On peut utiliser ssvnc pour cela :
$ ssvnc
Une application graphique va alors s’ouvir où vous pourrez rentrer le mot de passe:
Mais on peut aussi y accéder depuis un navigateur web à l’adresse https://ipdeBox:5900 grâce à un applet JAVA servi par x11vnc
Bien sûr le certificat est autosigné, donc sera refusé la première fois par le client VNC. Il faudra alors le vérifier en le partageant par un canal séparé. Le certificat se trouve sur la machine C au chemin suivant : /home/user/.vnc/certs/server.crt
Conclusion
Cet article permet de montrer qu’on peut se passer de solutions propriétaires telles que TeamViewer qui ont 2 désaventages :
- installent un service qui a tous les droits sur la machine
- relaie les communications par ses serveurs en ayant la possibilité de les déchiffrer et les modifier
Donc en gros, pour les utiliser, vous devez donner le contrôle de vos machines (client et serveur) à ces sociétés.
Ici, le chiffrement utilise des clés qui ne sont connues que par vous.
VNC ne chiffre pas en lui même les communications. Aussi, si le flux doit passer par Internet, vous devez toujours utiliser SSH ou SSL.
SSL a l’avantage de ne pas avoir à donner de droit utilisateur au client pour chiffrer de bout en bout.
SSH a l’avantage que le client peut démarrer de lui même le serveur VNC sans intervention humaine de l’autre coté.