Le fonctionnement d’un VPN sous macOS repose sur deux éléments distincts mais complémentaires : l’interface tunnel virtuelle (souvent utun) et le protocole utilisé pour encapsuler et transporter les paquets entre le système local et une extrémité distante. Le protocole définit la manière dont les données sont encapsulées, chiffrées, authentifiées et transmises.
macOS ne dépend pas d’un protocole unique. Le système fournit une infrastructure permettant l’implémentation de différents protocoles, chacun ayant des caractéristiques spécifiques en matière de performance, d’intégration système et de surface d’attaque.
Un protocole VPN assure plusieurs fonctions fondamentales :
Le tunnel agit comme une interface logique :
Paquet IP original
↓
Encapsulation protocole VPN
↓
Chiffrement
↓
Transmission via réseau physique
↓
Réception distante
↓
Déchiffrement
↓
Décapsulation
↓
Transmission vers destination finale
Le protocole détermine la manière dont ces étapes sont réalisées.
Sous macOS, les protocoles VPN modernes fonctionnent généralement en espace utilisateur et interagissent avec le système via une interface utun.
Le protocole :
Cycle complet :
Application
↓
Kernel Network Stack
↓
Interface utun
↓
Protocole VPN
↓
Socket réseau
↓
Internet
↓
Endpoint distant
↓
Protocole VPN
↓
Interface utun
↓
Kernel
↓
Application
Le protocole agit comme un intermédiaire entre la stack réseau et le réseau physique.

Les protocoles VPN peuvent fonctionner dans deux contextes :
Dans ce modèle, le protocole s’exécute directement dans le kernel.
Avantages :
Inconvénients :
Dans ce modèle, le protocole fonctionne comme un processus standard.
Avantages :
Inconvénients :
macOS privilégie désormais ce modèle via le Network Extension Framework.
L’encapsulation consiste à placer un paquet IP original dans un nouveau paquet transporté vers le serveur distant.
Structure conceptuelle :
Header externe
Header tunnel
Paquet IP original
Payload
Le paquet encapsulé est ensuite chiffré avant transmission.
Ce mécanisme permet de transporter le paquet original sans modification.
Un protocole VPN doit maintenir un état de session permettant :
Cette session est généralement maintenue par un processus utilisateur associé au tunnel.
Ce processus peut être observé avec :
ps aux | grep tunnel
Ou :
lsof -i
Le tunnel est transporté via une socket réseau standard :
Le protocole VPN agit comme une application réseau utilisant les primitives standards :
socket()
connect()
send()
recv()
Le système ne distingue pas ce trafic d’un trafic applicatif standard.
L’encapsulation ajoute des données supplémentaires à chaque paquet :
Cet overhead réduit la capacité effective :
Taille paquet original : 1500 bytes
Overhead tunnel : 60 bytes
Payload utile : 1440 bytes
L’overhead dépend du protocole utilisé.
Transmission :
Application génère paquet
↓
Kernel route paquet vers utun
↓
Protocole VPN lit paquet
↓
Encapsulation
↓
Chiffrement
↓
Transmission réseau
↓
Endpoint distant
Réception :
Endpoint distant envoie réponse
↓
Réception socket
↓
Déchiffrement
↓
Décapsulation
↓
Injection utun
↓
Kernel
↓
Application
Le protocole VPN ne modifie pas directement le routage. Il utilise l’infrastructure existante :
Le protocole agit uniquement sur les paquets transitant via utun.
Le routage détermine quels paquets seront capturés par le tunnel.
Le protocole constitue le mécanisme permettant :
Il fonctionne en complément :
L’ensemble de ces composants constitue l’architecture complète du tunnel VPN sous macOS.