Connexion VNC sécurisée via tunnel SSH sur macOS

Introduction

Le Partage d'écran de macOS utilise le protocole VNC, qui n'est pas chiffré par défaut avec les clients tiers (Windows, Linux). Seules les connexions Mac-à-Mac bénéficient d'un chiffrement AES-128. Pour sécuriser l'accès distant depuis un PC Windows, la solution consiste à encapsuler le flux VNC dans un tunnel SSH, garantissant ainsi un chiffrement robuste de bout en bout.

Cet article décrit la procédure complète pour configurer un accès VNC sécurisé vers un Mac, puis restreindre le port VNC (5900) pour qu'il ne soit accessible que via le tunnel SSH.


Prérequis


Partie 1 : Configuration du Mac

Étape 1 : Activer SSH (Session à distance)

Ouvrez le Terminal sur le Mac et vérifiez l'état de SSH :

sudo systemsetup -getremotelogin

Si le résultat affiche Remote Login: Off, activez SSH :

sudo systemsetup -setremotelogin on

(Vous pouvez également activer SSH via Réglages Système → Général → Partage → Session à distance)

Étape 2 : Activer le Partage d'écran (serveur VNC)

Vérifiez si le Partage d'écran est actif :

sudo launchctl list | grep screensharing

Si aucun résultat n'apparaît, activez le service :

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

(Vous pouvez également activer le Partage d'écran via Réglages Système → Général → Partage → Partage d'écran)

Vérifiez que le port 5900 est bien en écoute :

sudo lsof -i :5900 -P -n | grep LISTEN

Vous devriez voir des lignes indiquant que launchd écoute sur le port 5900 en IPv4 et IPv6.

Étape 3 : Configurer le mot de passe VNC

Dans Réglages Système → Général → Partage → Partage d'écran, cliquez sur le bouton (i) et activez l'option « Les visualiseurs VNC peuvent contrôler l'écran avec un mot de passe ». Définissez un mot de passe dédié pour les connexions VNC.


Partie 2 : Connexion depuis Windows

Étape 4 : Créer le tunnel SSH

Sur le PC Windows, ouvrez PowerShell et créez le tunnel SSH :

ssh -L 5901:localhost:5900 utilisateur-mac@adresse-ip-mac

Cette commande :

(Laissez cette fenêtre PowerShell ouverte pendant toute la session VNC)

Étape 5 : Se connecter avec le client VNC

Ouvrez votre client VNC (UltraVNC, RealVNC Viewer, etc.) et connectez-vous à :

localhost:5901

Important : Ne vous connectez pas directement à l'IP du Mac ! Utilisez localhost:5901 pour passer par le tunnel SSH.

Entrez le mot de passe VNC configuré à l'étape 3. Vous devriez maintenant voir le bureau du Mac.

(En cas d'écran noir, désactivez puis réactivez le Partage d'écran dans les Réglages Système du Mac)


Partie 3 : Sécurisation avec le pare-feu pf

À ce stade, le tunnel SSH fonctionne, mais le port 5900 reste accessible directement sur le réseau. Toute personne sur le même réseau pourrait tenter une connexion VNC sans passer par SSH. Il est donc essentiel de restreindre l'accès au port 5900 uniquement via localhost (tunnel SSH).

Étape 6 : Créer les règles de filtrage

Sur le Mac, créez un fichier d'ancre pour les règles VNC :

sudo nano /etc/pf.anchors/vnc-restrict

Collez le contenu suivant :

# Bloquer VNC depuis l'extérieur
block return in proto tcp from any to any port 5900

# Autoriser uniquement localhost (pour le tunnel SSH)
pass in quick on lo0 proto tcp from any to any port 5900

Enregistrez avec Ctrl+O, Entrée, puis Ctrl+X.

Étape 7 : Intégrer l'ancre dans la configuration pf

Éditez le fichier de configuration principal :

sudo nano /etc/pf.conf

Ajoutez ces lignes à la fin du fichier :

# Restriction VNC
anchor "vnc-restrict"
load anchor "vnc-restrict" from "/etc/pf.anchors/vnc-restrict"

Enregistrez et quittez l'éditeur.

Étape 8 : Activer les règles du pare-feu

Vérifiez la syntaxe (aucune erreur ne doit apparaître) :

sudo pfctl -n -f /etc/pf.conf

Chargez les règles :

sudo pfctl -f /etc/pf.conf

Activez le pare-feu pf :

sudo pfctl -e

(Les messages « No ALTQ support in kernel » sont normaux et peuvent être ignorés)

Étape 9 : Vérifier la protection

Testez la connexion directe depuis Windows (doit échouer) :

Testez la connexion via le tunnel SSH (doit fonctionner) :


Partie 4 : Connexion depuis un Mac

La procédure est identique à celle décrite pour Windows, à une différence près : l'application native Partage d'écran de macOS ne peut pas se connecter à localhost. Elle interprète cette adresse comme une tentative de connexion à la machine locale et refuse la connexion, quelle que soit la méthode d'authentification. Il est donc nécessaire d'utiliser un client VNC tiers.

Étape 10 : Installer TigerVNC via Homebrew

TigerVNC est un client VNC open source (GPLv2), léger, sans télémétrie et sans compte requis. C'est le choix recommandé sur macOS.

brew install --cask tigervnc-viewer

Étape 11 : Créer le tunnel SSH

Dans le Terminal, créez le tunnel SSH exactement comme sous Windows :

ssh -L 5901:localhost:5900 utilisateur-mac@adresse-ip-mac

(Laissez cette fenêtre Terminal ouverte pendant toute la session VNC)

Étape 12 : Se connecter avec TigerVNC

Lancez TigerVNC depuis un second Terminal :

open -a "TigerVNC"

Dans le champ d'adresse, entrez :

localhost:5901

Authentification

Contrairement aux clients VNC sous Windows qui utilisent le mot de passe VNC dédié (étape 3), TigerVNC sur macOS négocie avec le serveur de Partage d'écran une authentification par identifiants macOS : entrez le nom d'utilisateur et le mot de passe du compte macOS sur la machine distante. Le mot de passe VNC dédié n'est donc pas utilisé dans cette configuration.

(En cas d'écran noir après connexion, désactivez puis réactivez le Partage d'écran dans les Réglages Système du Mac distant, via l'interface graphique ou via le tunnel SSH déjà ouvert :)

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

Changer la résolution

L'affichage peut parfois être disproportionné. Il faut alors changer la résolution directement sur le mac distant, dans les Réglages Système > Moniteurs > Avancé > Afficher les résolutions sous forme de liste. Cochez ensuite "Afficher toutes les résolutions". Choisissez une résolution "(basse résolution)".



↑ Haut de page