Configurer un VPN peut sembler une tâche ardue, mais gérer votre propre réseau est maintenant facile.
Que faut-il pour être anonyme sur Internet ? De nombreux fournisseurs en sont sûrs : vous avez besoin d’un VPN. Tout le monde dit qu’ils ne se connectent pas et tout le monde sait que les autres sont pires. Aujourd’hui, vous apprendrez à configurer vous-même facilement un VPN sans même avoir à renoncer aux nombreux avantages que la technologie apporte.
Headscale – Tailscale, mais auto-hébergé
Le réseau que nous avons mis en place fonctionne sur Headscale, une réimplémentation open-source de Tailscale. N’hésitez pas à donner aux créateurs une étoile sur GitHub ou un café.
Headscale connecte vos appareils directement les uns aux autres (si possible) via Wireguard, mais peut également établir des connexions via des relais. Cependant, la configuration est aussi compacte que possible et de nombreuses fonctionnalités avancées ne sont pas couvertes. Si vous êtes intéressé, merci de nous le faire savoir sur le forum.
La liste de colisage :
- un serveur Linux (un petit VPS, ou un Raspberry Pi fera l’affaire)
- un domaine (facultatif, mais très utile)
- fonctionne également avec le DNS dynamique (par exemple avec DuckDNS, NoIP ou DynDNS.dk)
- parfois
Ce tutoriel sert de guide et remplace en aucun cas la documentation officielle. En cas de questions, la documentation doit toujours être consultée en premier !
Configurer des serveurs
Afin de ne pas perdre le focus, je suppose que vous avez déjà configuré un serveur avec les bases (pare-feu et SSH). Si ce n’est pas le cas, c’est le moment idéal pour vous rattraper. Ne vous inquiétez pas, le tutoriel ne s’enfuira pas.
Préparation
Si Docker et Docker Compose ne sont pas encore installés, vous pouvez également le faire maintenant. Les instructions officielles pour la distribution de votre choix se trouvent sur le site Web de Docker.
Si nous avons maintenant un serveur avec Docker, nous pouvons commencer à configurer les services réels. Dans ce didacticiel, nous allons commencer par créer un dossier sous /srv
create dans lequel se trouvent nos fichiers. Voici les commandes avec le préfixe $
fournis s’ils doivent être exécutés en tant qu’utilisateur normal, et avec #
s’ils doivent être exécutés en tant que root.
Nous changeons ensuite le groupe propriétaire de ce dossier en docker
auquel votre utilisateur connecté doit également appartenir, et autorisez les membres de ce groupe à accéder en écriture au répertoire.
# mkdir -p /srv/headscale
# chown :docker /srv/headscale
# chmod g+w /srv/headscale
Créer une pile logicielle
Commençons par aller dans le répertoire que nous venons de créer et créons quelques sous-dossiers dont nous avons besoin :
$ cd /srv/headscale
$ mkdir -p headscale/config headscale/data caddy/config caddy/data
Créons maintenant un fichier appelé docker-compose.yml
, qui décrit notre pile logicielle. Nous utilisons ici Caddy comme serveur Web, car il nécessite très peu de maintenance et n’a pas de dépendances majeures.
version: '3.5'
services:
headscale:
image: headscale/headscale:latest
command: headscale serve
restart: unless-stopped
volumes:
- ./headscale/config:/etc/headscale
- ./headscale/data:/var/lib/headscale
headscale-ui:
image: ghcr.io/gurucomputing/headscale-ui:latest
restart: unless-stopped
caddy:
image: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./caddy/config:/config
- ./caddy/data:/data
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
Ceux qui y prêtent attention ont sûrement déjà remarqué que le dossier caddy/Caddyfile
n’existe pas encore. Changeons cela maintenant en les créant avec le contenu suivant :
vpn.meine-domain.de {
reverse_proxy /web* http://headscale-ui:80
reverse_proxy * http://headscale:8080
}
Le domaine vpn.meine-domain.de
doit bien sûr être remplacé par votre propre domaine, qui doit déjà pointer vers le serveur à ce stade.
Configurer un VPN
Avant de démarrer notre VPN, nous devons le configurer. Nous pouvons économiser beaucoup de travail en acceptant simplement la configuration par défaut :
$ curl -o headscale/config/config.yml https://github.com/juanfont/headscale/raw/main/config-example.yaml
Ici, nous n’avons qu’à ajuster quelques détails pour obtenir un VPN simple (remplacez la ligne avec le moins devant par la ligne avec le plus devant) :
- server_url: http://127.0.0.1:8080
+ server_url: https://vpn.meine-domain.de
- listen_addr: 127.0.0.1:8080
+ listen_addr: 0.0.0.0:8080
- base_domain: example.com
+ base_domain: vpn.meine-domain.de
Et avec cela, nous serions prêts à partir. Démarrer la pile avec la commande
$ docker compose up -d
Accéder à l’interface web
Afin de pouvoir utiliser l’interface web, nous avons besoin d’une clé API. Nous pouvons facilement le créer en exécutant la commande suivante :
$ docker compose exec headscale headscale apikeys create
Nous pouvons entrer la clé qui nous est délivrée dans l’interface sous Paramètres> Clé API Headscale. Il est préférable de s’assurer que la clé est à nouveau valide avec « Tester les paramètres du serveur ». L’URL Headscale ne devrait pas avoir besoin d’être ajustée.
Si le navigateur affiche des messages d’erreur au début, c’est normal. Cela se produit pendant que le serveur génère une clé SSL et ne devrait prendre que quelques secondes.
Ajouter des appareils
Chaque appareil doit être attribué à un utilisateur, alors créez d’abord un utilisateur !
Le client open source Tailscale doit être installé sur chaque client. Vous pouvez découvrir comment cela fonctionne pour votre système d’exploitation sur le site Web de l’entreprise.
Pour ajouter un appareil, le serveur de connexion doit être commuté sur le serveur configuré avant de commencer. Vous trouverez la procédure à suivre dans la documentation de ces systèmes d’exploitation :
- les fenêtres
- Android
- iOS
- macOS (visitez https://vpn.meine-domain.de/apple)
- Linux/BSD (en utilisant le
--login-server
paramètres)
L’appareil vous dirigera ensuite vers une URL basée sur le modèle
https://vpn.meine-domain.de/register/nodekey:[hexadezimal]
La dernière partie (nodekey:…
) est celui qui vous concerne. Copiez-le et collez-le sous Appareil > Nouvel appareil > Clé d’appareil et sélectionnez le propriétaire. L’appareil est maintenant enregistré.

Vous pouvez également enregistrer l’appareil en exécutant la commande suivante :
$ docker compose exec headscale headscale -u NUTZERNAME nodes register --key nodekey:…
Bien sûr, vous devez remplacer username et nodekey.
Le serveur sur lequel Headscale est exécuté doit également être enregistré manuellement en tant que client s’il doit faire partie du réseau !
Le « VPN » classique : déguisement IP
Nous avons maintenant un VPN, mais ce que la plupart des gens veulent, ce n’est pas un VPN, mais un proxy sous la forme d’un VPN. Pour obtenir cela, nous devons désigner l’un des clients comme « Nœud de sortie ». Nous faisons cela en utilisant le client Tailscale sous Linux --advertise-exit-node
donner.
Comme vous avez probablement déjà connecté l’appareil, vous pourrez l’activer ultérieurement en exécutant cette commande :
# tailscale set --advertise-exit-node
Nous devons maintenant faire savoir au système d’exploitation que nous voulons vraiment transférer le trafic.
# echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-vpn.conf
# echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.d/99-vpn.conf
# sysctl -p /etc/sysctl.d/99-vpn.conf
Il nous reste maintenant à libérer les routes proposées dans le serveur de contrôle. La meilleure façon de le faire est dans l’interface Web, où il vous suffit de cliquer sur le statut « En attente » à côté des « Routes de périphérique ». Les autres clients peuvent alors simplement le sélectionner et l’utiliser comme nœud de sortie.

dernier mot
Si vous avez tout fait correctement, vous êtes maintenant votre propre fournisseur VPN. Et à une fraction du coût. (jusqu’à 10€/mois pour un VPN professionnel contre 3,25€ pour un petit VPS)
Bien sûr, vous n’avez plus 170 emplacements de serveur, mais toutes les fonctionnalités supplémentaires. Mais leur explication ne ferait que dépasser le cadre. Pour cette raison : Amusez-vous avec votre VPN !