Menu Fermer

Installer et prendre la main avec VNC sur Linux

Tightvncserver est un serveur VNC libre sur Linux afin de partager son écran.
Avec ce serveur, vous pouvez prendre la main à distance via le protocole VNC.
Cela permet d’administrer via l’interface graphique n’importe quel PC ou serveur.

Cet article vous guide pour installer et prendre la main avec VNC sur Linux.
Vous trouverez aussi de l’aide pour sécuriser le serveur VNC contre les piratages.

Installer et prendre la main avec VNC sur Linux

Installer et prendre la main avec VNC sur Linux

Dans cet article, nous utilisons un serveur Linux sans serveur X.
On part ici d’un serveur Linux sur internet accessible que par SSH.
En effet, il peut parfois arriver que l’on ait besoin d’un écran graphique.
Dans ces cas là, on peut installer le serveur tightvncserver avec un gestionnaire de fenêtres léger comme fluxbox, Xfwm4, Openbox, etc.

Pour installer le serveur VNC avec le gestionnaire de fenêtres :

apt-get install tightvncserver fluxbox xfonts-base

Laisser les paquets s’installer :

Créer le mot de passe et lancer le serveur VNC

Ensuite on s’identifie avec l’utilisateur avec lequel nous exécutons le serveur VNC.
Évitez de lancer ce dernier avec l’utilisateur root pour des raisons évidentes de sécurité.

VNC est un protocole très attaqué, sur internet, beaucoup de ports scan automatisés visent à trouver des serveurs VNC mal sécurisés.
Suivez les recommandations en fin d’article.

On lance la commande suivante afin de créer le mot de passe :

vncpasswd

Il est impératif de choisir un mot de passe fort et sûr pour limiter les piratages VNC.
Suivre éventuellement ce lien :

Enfin on lance le serveur VNC avec la commande suivante :

vncserver&

Ici on voit qu’il s’exécute sur l’écran (DISPLAY) :1

Par défaut, le serveur VNC s’exécute avec une résolution de 1024×768. Vous pouvez forcer la résolution avec le paramètre -geometry.
Par exemple :

vncserver -geometry 1900x1080

Configurer le gestionnaire de fenêtres dans le serveur VNC

Seulement pour le moment, le serveur VNC ne lance aucun gestionnaire de fenêtres.

  • Éditez le fichier ~/.vnc/xstartup
  • Commencer la ligne /etc/X11/Xsession si présente
  • Ajoutez une ligne afin de lancer le gestionnaire de fenêtres adéquates. Voici la liste des plus fréquents :
startkde &
gnome-session &
startxfce4 &
lxsession &
fluxbox &
  • Dans mon cas, il s’agit de fluxbox, donc j’ajoute fluxbox&

Arrêtez le serveur VNC et relancez le afin de prendre en compte les changements :

vncserver -kill :1
vncserver&

Prise en main à distance VNC Linux

Il ne reste plus qu’à tester la prise en main à distance avec un client VNC.

  • Télécharger et installer un client VNC
  • Lancer ce dernier puis indiquez l’adresse IP du serveur VPN
  • Lancer la connexion et saisissez le mot de passe
  • La session VNC s’ouvre alors

Ici on voit que fluxbox se lance sans problème.

Il est même tout à fait possible de lancer les commandes depuis SSH directement dans VNC.
Pour cela, on exporte le DISPLAY pour ensuite lancer les commandes graphiques :

export DISPLAY=:1

Par exemple pour lancer firefox ensuite :

firefox&

Sécuriser le serveur VNC Linux

Le but est de ne pas laisser le serveur VNC accessible depuis internet et filtrer les connexions :

  • Éviter les attaques par bruteforce qui peuvent permettre de pirater le serveur
  • Se protéger des vulnérabilités VNC, même si vous pouvez aussi mettre à jour le logiciel VNC

Avec iptables

La première méthode la plus simple est de filtrer le port 5901 avec iptables.
Pour cela, vous pouvez vous inspirer de ces règles en remplaçant par des IP à autoriser.

/sbin/iptables -A INPUT -s XXX.XXX.XXX.XXX -p tcp --dport 5901 -j ACCEPT
/sbin/iptables -A INPUT ! -s YYY.YYY.YYY.YY -p tcp --dport 5901 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 5901 -j DROP

La seule limite de cette méthode est qu’il faut avoir une adresse IP fixe.

via un tunnel SSH

Le tunnel SSH consiste à se connecter au serveur VNC à travers SSH qui effectue une redirection de port.
De ce fait, le serveur VNC n’est pas exposé sur internet.

Première chose, on configure le serveur VNC afin de ne pas écoute sur toutes les interfaces réseaux mais seulement sur localhost.
Pour cela, il faut le démarrer de cette manière :

vncserver  -nolisten tcp -localhost

La commande netstat confirme bien que le serveur VNC n’écoute que sur localhost.

Ensuite sur le PC client, on ouvre le tunnel SSH de cette manière.
La commande suivante ouvre le port 5000 vers le serveur VNC sur 127.0.0.1:5901 via le tunnel ssh user@host 1

ssh  -L 5000:127.0.0.1:5901 -N -f user@host

Il ne reste plus qu’à lancer un client VNC pour se connecter sur localhost:5000 2
Si tout va bien, l’accès VNC s’effectue.

Ainsi le serveur VNC n’est pas accessible directement sur internet.

D’autres méthodes existes notamment avec PuTTy sur Windows.
Pour plus d’informations :

Port Knocking

Le port Knocking est une technique qui vise à fermer un port avec iptables et ne l’ouvrir qu’après une séquence TCP bien précise faites par le client.

Voici comment mettre en place ce filtrage :

aptitude install knockd

Sur le serveur, knockd doit tourner en daemon, pour cela, on modifie /etc/default/knockd :

START_KNOCKD=1

Ensuite on modifie /etc/knockd.conf en créant la séquence de ports qui va permettre de créer la règle d’ouverture de ports.
Par exemple, ci-dessous, il faut envoyer une connexion TCP sur les ports 7000 puis 8000 et enfin 9000 afin que la règle Iptables permettant l’accès soit générée :
(attention, bien mettre -I INPUT pour l’open)

[options]
UseSyslog
[openrsync] sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 5901 -j ACCEPT
tcpflags = syn
[closerync]
sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn

Enfin, on créé la règle pour fermer le port 5901 :

/sbin/iptables -A INPUT -p tcp --dport 5901 -j DROP

Côté client, vous pouvez générer la séquence comme ceci :

knock -v host port1 port2 port3