Note technique · Publié le 25 septembre 2026
Un tunnel WireGuard depuis Flutter
Un VPN pour mes proches, une extension réseau en Swift, le consentement avant la publicité, et un kill switch annoncé « bientôt » plutôt que simulé.
Je voulais tester quelque chose, et je voulais que mes proches aient un VPN simple à utiliser. Le résultat est un client iOS et Android en Flutter, avec une extension réseau native en Swift qui monte un tunnel WireGuard. Dix pays au choix, des serveurs gratuits, et une bannière AdMob sur l'accueil, le modèle du VPN gratuit financé par la publicité.
Le consentement vient avant tout. Tant que l'utilisateur n'a pas accepté le service, la politique sans journaux et la publicité, le SDK publicitaire n'est pas initialisé. C'est le mécanisme de conformité de l'app, pas un écran de plus.
L'accueil affiche l'état réel du tunnel, pas une supposition. L'interface écoute le flux d'état émis par le natif, donc si iOS coupe le VPN depuis les Réglages, l'app le voit.
Un watchdog de 20 secondes ferme le tunnel et affiche une erreur si la connexion n'aboutit pas, et le bouton annule la tentative en cours. C'était le correctif d'une vraie régression. Le bouton désactivé pendant la transition avait fermé la seule échappatoire d'une connexion qui ne rendait jamais la main.
Côté Swift, l'extension parse la configuration wg-quick à la main avec un analyseur d'états, valide les clés Curve25519, les plages d'adresses et les endpoints, avec une vingtaine de cas d'erreur typés, puis la confie à WireGuardKit. Le dépôt wireguard-apple est embarqué en package Swift local, et une phase de build Xcode compile la bibliothèque Go.
Le kill switch est volontairement désactivé et annoncé « bientôt », plutôt que de laisser croire à une protection qui n'existe pas. Le projet n'est pas publié, et ce qui manque est dit tel quel, des identifiants AdMob de test à remplacer, des déclarations de suivi à ajouter pour la review Apple, et des clés partagées de comptes gratuits, qui font qu'un abus fait tomber le service pour tous.