Depuis macOS 10.11, l’implémentation moderne des tunnels VPN repose sur le Network Extension Framework, un ensemble d’API système permettant la création, la gestion et le contrôle d’interfaces réseau virtuelles sans nécessiter de modification du kernel. Ce framework constitue la couche d’intermédiation entre la stack réseau du système et les implémentations de tunnels fonctionnant en espace utilisateur.
Ce modèle remplace progressivement les anciennes extensions kernel (kext), qui permettaient historiquement aux logiciels VPN d’interagir directement avec le noyau, mais introduisaient des risques importants en matière de stabilité et de sécurité.
Le Network Extension Framework permet d’intercepter, encapsuler et rediriger les flux réseau en s’intégrant dans le pipeline réseau standard de macOS, tout en maintenant une isolation stricte entre le code utilisateur et le kernel.
La stack réseau macOS est structurée selon un modèle dérivé de BSD, comprenant :
Le Network Extension Framework s’insère entre la stack réseau kernel et les interfaces réseau physiques, permettant la création d’interfaces virtuelles intermédiaires.
Application
↓
Socket API
↓
Kernel Network Stack
↓
Interface virtuelle (utunX)
↓
Network Extension Framework
↓
Encapsulation et chiffrement
↓
Interface physique (en0 / en1)
↓
Internet
Cette architecture permet de rediriger le trafic sans modifier le comportement des applications ou de la stack réseau kernel.
La classe NEPacketTunnelProvider constitue le composant principal utilisé pour implémenter un tunnel VPN sous macOS.
Elle fournit :
Lorsqu’un tunnel est activé, le système crée une interface virtuelle utun et associe cette interface au provider.
Le cycle de traitement des paquets est le suivant :
Paquet généré par une application
↓
Transmission vers interface utun
↓
Capture par NEPacketTunnelProvider
↓
Encapsulation dans tunnel chiffré
↓
Transmission vers destination distante
↓
Réception réponse
↓
Décapsulation
↓
Injection dans interface utun
↓
Transmission vers application
Ce mécanisme permet une interception complète du trafic réseau, tout en maintenant l’isolation entre le kernel et le code applicatif.
Le Network Extension Framework utilise des interfaces virtuelles de type utun pour rediriger le trafic.
Ces interfaces sont créées dynamiquement lors de l’activation du tunnel.
Elles peuvent être observées avec :
ifconfig
Exemple :
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST>
inet 10.0.0.2 --> 10.0.0.1 netmask 0xffffffff
Ces interfaces :
Elles constituent le point d’entrée et de sortie logique du tunnel.

Lorsqu’un tunnel est activé, le système modifie la table de routage afin de rediriger le trafic vers l’interface virtuelle.
La table peut être consultée avec :
netstat -rn
Exemple :
default 10.0.0.1 utun0
Cette route indique que le trafic doit être transmis via l’interface virtuelle plutôt que l’interface physique.
Le Network Extension Framework ne modifie pas directement le kernel, mais configure les routes via les mécanismes standard du système.
Contrairement aux anciennes implémentations basées sur des extensions kernel, le Network Extension Framework fonctionne en espace utilisateur.
Ce modèle présente plusieurs avantages :
Le système utilise un mécanisme d’entitlements pour autoriser l’accès aux fonctionnalités réseau avancées.
Exemple d’entitlement :
com.apple.developer.networking.networkextension
Ce mécanisme limite l’accès aux composants autorisés.
Le Network Extension Framework ne définit pas directement le protocole utilisé, mais fournit un canal permettant d’implémenter un tunnel.
Le tunnel agit comme une abstraction encapsulant les paquets IP :
Paquet original
↓
Encapsulation
↓
Chiffrement
↓
Transmission via interface physique
↓
Destination distante
Le système ne distingue pas le tunnel d’une interface réseau standard, ce qui permet une transparence totale pour les applications.
Le cycle de vie d’un tunnel comprend plusieurs phases :
Ces opérations sont gérées par le système via le Network Extension Framework.
Les applications ne sont pas modifiées lorsqu’un tunnel est actif.
Elles continuent d’utiliser la Socket API standard :
socket()
connect()
send()
recv()
La redirection est effectuée au niveau du routage système.
Ce modèle garantit une compatibilité complète avec les applications existantes.
Le Network Extension Framework constitue la couche centrale permettant :
Il agit comme un pont entre la stack réseau système et les mécanismes de tunnel.
Cette architecture permet l’implémentation de tunnels VPN sans modification du kernel, tout en conservant les propriétés fondamentales du routage réseau standard.