Ça fait un moment que je voulais mettre en place un VPN sur mon VPS IONOS — principalement pour accéder à mes services sans laisser des ports traîner sur internet et de sécurisé les accès à mes autres serveur par une IP quand je suis nomade. J'ai testé quelques solutions, et WireGuard a fini par s'imposer : la config est courte, les perfs sont bonnes, et contrairement à OpenVPN vous comprenez ce que vous faites en moins d'une heure.

Ce guide couvre l'install côté serveur (Debian/Ubuntu), la config macOS, et l'activation du port dans le pare-feu de IONOS, car il bloque tout en amont d'UFW. Si vous n'êtes pas chez IONOS, vous pouvez sauter cette partie.

Comment ça fonctionne

Le principe est simple : le serveur Linux écoute en permanence sur le port UDP 51820, le Mac se connecte à la demande. Tout le trafic entre les deux est chiffré avec des clés asymétriques que vous générez vous-même — même mécanique que SSH, même niveau de confiance. Le serveur prend l'IP 10.0.0.1/24 dans le tunnel, le client 10.0.0.2/32.

1. Installation sur le serveur

Rien de compliqué ici, WireGuard est dans les dépôts officiels sur Debian 11+ et Ubuntu 22.04+.

sudo apt update && sudo apt upgrade -y
sudo apt install wireguard -y

# Vérifie que c'est bien là
wg --version

2. Générer les clés

WireGuard fonctionne en paires clé privée / clé publique. Je génère les deux paires directement sur le serveur pendant que j'y ai accès — celle du serveur et celle du client Mac. La règle d'or : les clés privées ne quittent jamais leur machine, seules les publiques s'échangent.

cd /etc/wireguard

# Paire du serveur
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key

# Paire du client (le Mac)
wg genkey | sudo tee client_private.key | wg pubkey | sudo tee client_public.key

# Affiche les 4 clés — notez-les quelque part
echo "=== Serveur privée ==" && cat server_private.key
echo "=== Serveur publique ==" && cat server_public.key
echo "=== Client privée ==" && cat client_private.key
echo "=== Client publique ==" && cat client_public.key

# Sécurise les permissions
sudo chmod 600 /etc/wireguard/*.key

Clés privées

Ne jamais copier les clés privées en dehors de leur machine. Si quelqu'un met la main dessus, il peut se faire passer pour vous sur le VPN. Seules les publiques sont faites pour circuler.

3. Configuration du serveur — wg0.conf

Deux blocs : [Interface] décrit le serveur lui-même, [Peer] liste chaque client autorisé. Avant de copier, vérifiez votre interface réseau principale avec ip a (c'est souvent eth0 ou ens3 sur les VPS) et remplacez dans les lignes PostUp/PostDown.

# /etc/wireguard/wg0.conf

[Interface]
Address    = 10.0.0.1/24
ListenPort = 51820
PrivateKey = COLLEZ_ICI_LA_CLÉ_PRIVÉE_SERVEUR

# Remplacez eth0 par votre interface réseau principale (vérifier avec : ip a)
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# La clé PUBLIQUE du client (pas la privée)
PublicKey  = COLLEZ_ICI_LA_CLÉ_PUBLIQUE_CLIENT
AllowedIPs = 10.0.0.2/32

Pour ajouter d'autres clients plus tard, il suffit d'un nouveau bloc [Peer] avec sa clé publique et une IP différente (10.0.0.3/32, 10.0.0.4/32…). Pas besoin de redémarrer le service.

4. Pare-feu et démarrage

Deux choses importantes avant de démarrer : activer le forwarding IP (sans ça, le serveur ne route pas le trafic des clients vers internet) et ouvrir le port dans UFW.

# Forwarding IP persistant au reboot
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# Ouvre le port UDP
sudo ufw allow 51820/udp
sudo ufw reload

# Démarre WireGuard et active au démarrage
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

# Vérifie
sudo wg show

5. IONOS — pare-feu réseau

IONOS ajoute une couche de pare-feu au niveau réseau, avant que les paquets arrivent au serveur. UFW peut avoir le port ouvert, ça ne change rien si IONOS le bloque en amont.

Symptôme classique

WireGuard démarre sans erreur, wg show ne montre rien d'anormal, mais le client macOS ne parvient jamais à établir la connexion. C'est presque toujours le pare-feu réseau IONOS qui bloque.

La correction : cloud.ionos.fr → Réseau → Groupes de pare-feu. Ajouter une règle entrante avec Protocole UDP, port destination 51820, IP source 0.0.0.0/0, action Autoriser. Ensuite, associer ce groupe au serveur depuis sa fiche → onglet Réseau. Les règles prennent 1 à 2 minutes à se propager.

6. Client macOS

Deux options : l'app WireGuard depuis l'App Store (ce que j'utilise — import du fichier en glisser-déposer, toggle dans la barre de menus, pas de sudo à taper) ou via Homebrew pour les amoureux du terminal.

# Option Homebrew
brew install wireguard-tools

Créez un fichier wg-mac.conf sur votre Mac. Pour l'IP publique du serveur, un curl ifconfig.me depuis le serveur fait l'affaire.

[Interface]
Address    = 10.0.0.2/32
PrivateKey = COLLEZ_ICI_LA_CLÉ_PRIVÉE_CLIENT
DNS        = 1.1.1.1

[Peer]
PublicKey           = COLLEZ_ICI_LA_CLÉ_PUBLIQUE_SERVEUR
Endpoint            = IP_PUBLIQUE_DU_SERVEUR:51820

# 0.0.0.0/0 = tout le trafic passe par le VPN (full tunnel)
# Remplacez par 10.0.0.0/24 si vous voulez juste accéder au réseau VPN
AllowedIPs          = 0.0.0.0/0

# Ping toutes les 25s pour garder la connexion active
PersistentKeepalive = 25
# Démarrer le tunnel (si CLI)
sudo wg-quick up ~/wg-mac.conf

# Couper
sudo wg-quick down ~/wg-mac.conf

7. Vérifier que ça fonctionne

Tunnel actif côté Mac, deux vérifications rapides :

# Ping le serveur via le tunnel
ping 10.0.0.1

# Vérifiez que votre IP publique est celle du serveur
curl ifconfig.me
# Côté serveur — voir les clients connectés
sudo wg show

# Si le client est bien connecté :
# peer: <clé publique client>
#   latest handshake: X seconds ago
#   transfer: X KiB received, Y KiB sent

Pas de connexion ? Checklist dans l'ordre : port 51820 ouvert (sudo ufw status), règle IONOS active si c'est votre hébergeur, clés correctement croisées dans les deux fichiers de config (publique serveur → conf client, publique client → wg0.conf), service qui tourne (sudo systemctl status wg-quick@wg0).