Repository navigation
Diagnostic WireGuard Hotspot
Fichier : Diagnostic-WireGuard-Hotspot.md · Dossier : wiki (racine) Branche : master (wiki) · Auteur : hprzeta · MAJ : 2026-09-05
📘 Procédure de dépannage à jour : Guide-WireGuard-Acces-Distant (créé le 05/09/2026, intègre le cas VPN tiers §9 ci-dessous). Ce fichier-ci reste le journal détaillé des incidents (causes racines, correctifs, chronologie) ; pour la marche à suivre en cas de panne, se référer d'abord au guide.
Le même symptôme (« aucun accès distant au cluster ») s'est produit plusieurs fois, pour des causes racines différentes. Les modes de défaillance sont désormais identifiés et documentés séparément ci-dessous (§2 à §5 et §9), avec un mode plus ancien (§4, juillet) qui reste possible mais moins probable statistiquement.
| Occurrence | Symptôme | Cause racine | Statut |
|---|---|---|---|
| Juillet 2026 (05/07) | Handshake OK, aucune donnée ne passe |
AllowedIPs vide pour le peer PC1 sur PC4 |
✅ Résolu — voir §4 |
| Août 2026 (22/08) | Aucun handshake du tout | Règle IPv6 de la box pointant vers une adresse PC4 périmée | ✅ Résolu — voir §5.3 |
| Août 2026 (22/08) | Handshake OK, PC2/PC3 injoignables (PC4 seul répond) |
net.inet.ip.forwarding=0 sur PC4 |
✅ Résolu — voir §5.4 |
| Août 2026 (30/08) | Retour de déplacement : wg0 monté sans IP, PC2/PC3 injoignables |
4 causes cumulées (boot prématuré, script de reprise non fiable, collision de sous-réseau, IP LAN en dur) | ✅ Résolu — voir §8 |
| Septembre 2026 (05/09) | En déplacement : aucune IPv6 globale (fe80:: seul), donc aucun handshake |
VPN tiers (Proton VPN) qui interceptait/bloquait l'IPv6 côté client | ✅ Résolu — voir §9 |
En déplacement, vérifier d'abord un VPN tiers actif (§9) ; à la maison, le mode §2 (règle IPv6 box périmée) reste le plus probable. Ce dernier se reproduira à chaque fois que l'identifiant d'interface ou le préfixe IPv6 de PC4 change côté box — c'est un mode de défaillance structurel de cette architecture, pas un incident isolé. Procédure de dépannage à jour, dans l'ordre : Guide-WireGuard-Acces-Distant §4.
La règle « Réseau v6 » de la box SFR (Sécurité → Réseau → Réseau v6) ouvre le
port UDP 51820 vers une adresse IPv6 complète et figée de PC4, saisie
manuellement. Cette adresse n'est pas mise à jour automatiquement quand
l'adresse IPv6 de PC4 change — contrairement à l'enregistrement DuckDNS
(AAAA), qui lui suit automatiquement via duck.sh en crontab.
Résultat : DNS et box peuvent diverger silencieusement. Le client résout un nom qui pointe vers la bonne adresse, mais la box filtre encore sur l'ancienne.
L'adresse IPv6 de PC4 (OpenBSD, génération RFC 7217 stable-privacy) dépend de l'interface réseau en plus du préfixe délégué. Elle change donc dans deux cas, tous deux hors du contrôle du wiki opérationnel :
- Changement de préfixe délégué par SFR (renouvellement DHCPv6-PD côté FAI, sans action de l'utilisateur) — cas générique, peut survenir à tout moment.
-
Changement d'interface physique sur PC4 — observé le 16/08/2026 lors de
la migration matérielle Dell Dimension 4500 → Compaq CQ58
(Migration-PC4-Compaq-CQ58-20260816) : même préfixe
/64([IPV6]/64), mais identifiant d'interface différent, donc adresse hôte différente.
Dans les deux cas, DuckDNS suit (le script lit l'adresse courante sur l'interface), mais la règle de la box, saisie à la main, ne suit pas. C'est la cause identifiée le 22/08/2026 :
Règle box (avant, obsolète) : [IPV6]
PC4 réel (après) : [IPV6]
Confirmation par élimination : pare-feu IPv6 de la box désactivé → handshake
immédiat. Règle corrigée (WireGuard-ipV6-Newpc4) → handshake OK avec
pare-feu réactivé.
Nouvelle règle « Réseau v6 » WireGuard-ipV6-Newpc4 sur la box (UDP,
51820→51820, destination = adresse IPv6 courante de PC4, Sur). L'ancienne
règle WireGuard-ipV6 est laissée Off (conservée pour historique, pas de
conflit — une règle désactivée n'est pas évaluée par le pare-feu).
⚠️ Sur l'interface de la box, le bouton « Créer une règle » de la section Entrée de filtrage (IPv6) ne concerne que l'ICMP. Les ouvertures UDP se font dansSécurité → Réseau → Réseau v6, pas dans le filtrage ICMP.
Une fois le tunnel monté (handshake OK), [WG_PC4] (PC4 lui-même) répondait,
mais [IP_PC2] (PC2) et [IP_PC3] (PC3) restaient injoignables.
sysctl net.inet.ip.forwarding # → 0
pfctl -sr | grep -i nat-to # → règle nat-to présente et correcteLe NAT était en place côté pf, mais OpenBSD ne route pas entre interfaces par
défaut : net.inet.ip.forwarding doit être explicitement activé. Absent de la
session de juillet 2026 — cause distincte de celle de §2, à ne pas confondre.
Correction (persistante) :
# /etc/sysctl.conf sur PC4
net.inet.ip.forwarding = 1À vérifier après toute réinstallation ou migration matérielle de PC4 (ce réglage ne survit pas à une réinstallation depuis zéro).
Cause de la panne du 05/07/2026, résolue et normalement non récurrente sauf
erreur de configuration manuelle future sur /etc/hostname.wg0.
Test de wg_auto.sh en mode déplacement, connexion via hotspot mobile
(Port_Armel). Objectif : valider la bascule automatique maison/déplacement de
PC1 en conditions réelles.
Un tunnel WireGuard fonctionne en deux temps distincts, qui peuvent être bloqués indépendamment l'un de l'autre par un réseau intermédiaire :
-
Handshake : poignée de main cryptographique initiale + paquets
keepalivepériodiques. Paquets très petits et peu fréquents. - Transport de données : trafic applicatif réel (ping, SSH, synchronisation cluster). Paquets plus gros et/ou plus soutenus dans le temps.
Un opérateur mobile ou un pare-feu peut laisser passer le premier tout en filtrant le second. C'est un piège classique : un handshake réussi ne garantit jamais que le tunnel transporte des données (cf. §7).
Dans le cas de juillet, la cause n'était en réalité ni un opérateur mobile ni un pare-feu, mais une erreur de configuration locale (§4.4). Le principe handshake/données reste néanmoins valable et a ressurgi en août (§3) sous une autre forme : forwarding désactivé plutôt que filtrage réseau.
| Étape | Résultat |
|---|---|
| Connexion hotspot mobile | OK (IPv4 CGNAT + IPv6 disponible) |
| Tunnel wg0, endpoint IPv4 (DuckDNS) | Handshake : aucune réponse (0 B received) |
| Endpoint basculé en IPv6 (adresse PC4 alors courante) | Handshake OK (124 B puis 744 B received, keepalive stable ~3 min) |
| Ping [WG_PC4] (endpoint IPv6) | KO — 100 % perte |
| SSH TCP port 22 vers [WG_PC4] | KO — timeout total |
Test MTU (ping -s 8) |
KO aussi — fragmentation écartée comme cause |
Note IPv4 (correction 22/08/2026) — l'échec du handshake en IPv4 observé ici venait du hotspot mobile (CGNAT/DPI côté opérateur), pas de la box. Mais même sans ce blocage opérateur, le chemin IPv4 n'aurait de toute façon jamais fonctionné : le WAN de la box SFR est IPv6 seul (confirmé par la box elle-même : « Les configurations IPv4 ne peuvent pas fonctionner en raison de l'architecture de routage IPv6 WAN actuelle »). Toute redirection de port IPv4 sur la box est inopérante par conception, indépendamment de tout filtrage opérateur. Ne pas chercher à diagnostiquer ou réparer un chemin d'accès distant en IPv4 — seul l'endpoint IPv6 est un chemin viable.
En LAN maison, doas pfctl -sr sur PC4 n'a montré aucune règle bloquante —
le trafic sur wg0 (ping et TCP) est bien autorisé par pf. Le vrai
coupable : doas wg show wg0 a révélé deux peers :
peer: [CLE_PUB_TEL]
allowed ips: [WG_PC1]/32, [WG_TEL]/32 ← doublon, [WG_PC1]/32 ne devrait pas être ici
peer: [CLE_PUB_PC1] ← PC1
allowed ips: (none) ← rien n'est autorisé pour PC1 !
Un /32 WireGuard ne peut appartenir qu'à un seul peer dans la table de
routage du noyau. /etc/hostname.wg0 contenait une ligne wgaip [WG_PC1]/32
en trop sous le bloc wgpeer 6euaNc/..., ce qui volait l'IP [WG_PC1]/32 au
peer PC1.
Pourquoi le handshake/keepalive fonctionnaient quand même : ces paquets de
contrôle n'ont pas de charge IP interne, donc ils ne sont pas soumis au
filtrage AllowedIPs — seul le trafic de données réel est concerné, d'où le
symptôme trompeur « tunnel qui a l'air OK mais rien ne passe ».
# Live — via wg set (remplace la liste allowed-ips de chaque peer)
doas wg set wg0 peer [CLE_PUB_TEL] allowed-ips [WG_TEL]/32
doas wg set wg0 peer [CLE_PUB_PC1] allowed-ips [WG_PC1]/32
# Persistant — retire la ligne wgaip en trop dans /etc/hostname.wg0
doas sed -i '/^wgaip [WG_PC1]\/32$/d' /etc/hostname.wg0| Test | Résultat |
|---|---|
| Handshake WireGuard (IPv6) | OK — 6 secondes, 604 B received |
ping [WG_PC4] (PC4, gateway VPN) |
✅ 0% perte, RTT 42-52 ms |
SSH TCP port 22 → [WG_PC4]
|
✅ succeeded |
ping [IP_PC2] (PC2, via tunnel) |
✅ 0% perte, RTT 40-55 ms |
ping [IP_PC3] (PC3, via tunnel) |
✅ 0% perte, RTT 36-55 ms |
Indépendamment des blocages réseau ponctuels, l'automatisation de
wg_auto.sh elle-même fonctionne correctement dans les deux contextes
(maison et déplacement), déclenchée soit par le dispatcher réseau, soit par
zeta_tmux.sh au lancement du cluster.

Les captures d'écran liées au diagnostic WireGuard/zeta-vpn, initialement
portées disparues, ont été retrouvées et archivées dans
~/projet_zeta/docs/archive/wireguard_screenshots/ (local uniquement, hors
dépôt Git).
Aucun handshake WireGuard depuis l'extérieur du réseau domestique. Le cluster
Zeta était inaccessible à distance (PC2, PC3, PC4 en rc=255 dans
zeta_monitor.py).
| Piste | Verdict | Preuve |
|---|---|---|
| Clé publique changée à la migration | ❌ écartée |
wg show sur PC4 renvoie exactement le PublicKey du peer de wg0.conf sur PC1 |
| pf bloque l'UDP 51820 | ❌ écartée |
pfctl -sr : pass in on re0 proto udp from any to any port = 51820 (non qualifié en famille d'adresses → couvre IPv4 et IPv6) |
| Adresses IPv6 temporaires qui périment | ❌ écartée | PC4 (OpenBSD) publie une adresse stable RFC 7217, pas une temporaire |
Doublon d'IP .54 dans la table de la box |
❌ écartée | Ancienne MAC en Off, sans effet sur le chemin IPv6 |
| Cron DuckDNS absent | ❌ écartée |
*/5 * * * * /etc/duckdns/duck.sh présent dans le crontab root
|
L'enregistrement A (IPv4) de DuckDNS était périmé et inutilisable : le script
duck.sh envoie &ip= (vide), donc DuckDNS conservait indéfiniment l'ancienne
valeur IPv4. wg-quick up résolvait alors le nom en IPv4 périmée, imposant un
forçage manuel de l'endpoint IPv6 à chaque montage. Suppression volontaire
de l'enregistrement A → la résolution part désormais directement en IPv6,
sans forçage manuel.
Box SFR (GR140IG) :
| Paramètre | Valeur |
|---|---|
| Pare-feu IPv6 | Activé |
| Pare-feu IPv4 | Off (sans objet, WAN IPv6 seul) |
| DMZ / DMZv6 | Off |
Règle Réseau v6 WireGuard-ipV6-Newpc4
|
UDP, ports 51820→51820, dest. = adresse IPv6 courante de PC4, Sur |
Ancienne règle WireGuard-ipV6
|
Off (conservée pour historique) |
Redirection de ports IPv4 WireGuard
|
Off — inopérante par conception, WAN IPv6 seul |
DuckDNS :
| Élément | Valeur |
|---|---|
| Domaine | [DDNS_PC4] |
Enregistrement AAAA
|
adresse courante de PC4, mise à jour automatique |
Enregistrement A
|
supprimé volontairement (§5.5) |
| Updater |
/etc/duckdns/duck.sh, crontab root, */5 * * * *
|
Token DuckDNS — ne jamais recopier de valeur en clair dans le wiki. Voir Migration-PC4-Compaq-CQ58-20260816 pour l'incident de token exposé et sa correction (rédaction, remplacement par
<TOKEN>).
PC4 (zeta-secure, OpenBSD 7.9) — règles pf pertinentes :
block drop in all
pass in on re0 proto udp from any to any port = 51820
pass in on wg0 all flags S/SA
match out on re0 inet from [RESEAU_WG] to any nat-to (re0) round-robin
pass in on re0 inet6 proto ipv6-icmp all icmp6-type routeradv
pass in on re0 inet6 proto ipv6-icmp all icmp6-type neighbradv
pass in on re0 inet6 proto ipv6-icmp all icmp6-type neighbrsol
pass in on re0 inet6 proto ipv6-icmp all icmp6-type redir
Ces règles autorisent
routeradv,neighbradv,neighbrsol,redir— mais pasechoreq. PC4 ne répond donc jamais auping6direct (cf. faux positif §7).
PC1 (zeta-lab, Ubuntu) — /etc/wireguard/wg0.conf :
Endpoint = [DDNS_PC4]:51820
AllowedIPs = [RESEAU_WG], [LAN]
Bascule automatique par nm-dispatcher selon le SSID : réseau domestique →
wg0 coupée (LAN direct) ; réseau externe → wg0 maintenue.
En cas de nouvelle panne d'accès distant, tester dans cet ordre :
-
Tester la santé réelle du tunnel (cause §8, à tester en priorité après un déplacement ou un redémarrage) :
ping -c2 [WG_PC4]
Un
wg showqui semble sain (interface présente, handshake récent) ne prouve rien siwg0n'a pas d'adresse IP — voir §8. En cas d'échec :sudo wg-quick down wg0 && sudo wg-quick up wg0. -
Comparer DNS et règle box (cause §2, la plus probable en usage sédentaire à la maison) :
# Sur PC1 dig +short AAAA [DDNS_PC4]Comparer avec l'adresse de destination de la règle
WireGuard-ipV6-Newpc4dans l'interface box ([IP_BOX] → Sécurité → Réseau → Réseau v6). Si elles diffèrent → mettre la règle à jour manuellement. -
Vérifier le forwarding sur PC4 (cause §3), si le handshake réussit mais que seul PC4 répond :
doas sysctl net.inet.ip.forwarding # doit valoir 1 -
Vérifier
AllowedIPs(cause §4), si le handshake réussit mais qu'aucune donnée ne passe même avec forwarding actif :doas wg show wg0
- Modifier la configuration de la box (nécessite d'être sur le LAN)
- Basculer sur un partage de connexion mobile
- Monter le tunnel et tester
Toute inversion des étapes 2 et 3 produit un faux négatif (le dispatcher coupe
wg0 dès qu'il détecte le SSID domestique — cf. §7).
Ne jamais modifier la configuration réseau de la box via le tunnel : une erreur coupe l'accès jusqu'au retour physique sur le LAN.
a) nc -u ... succeeded ne prouve rien.
En UDP, nc affiche « succeeded » dès qu'aucun ICMP d'erreur ne revient dans
le délai. Vérifier en particulier que le test part bien de l'extérieur du LAN
— un test lancé depuis le même /64 que la cible ne traverse jamais le
pare-feu de la box.
b) ping6 vers PC4 échoue même quand tout va bien.
Les règles pf de PC4 autorisent routeradv, neighbradv, neighbrsol,
redir — mais pas echoreq (voir §5.6). PC4 ne répond donc jamais au
ping direct. Le silence n'est pas un diagnostic de panne.
c) nm-dispatcher détruit wg0 en LAN — comportement normal, pas un bug.
Un script nm-dispatcher sur PC1 détecte le SSID domestique et coupe
volontairement le tunnel (bascule en LAN direct) :
nm-dispatcher: 🏠 MAISON — WireGuard DÉSACTIVÉ — LAN direct (PC4 joignable)
nm-dispatcher: [#] ip link delete dev wg0
Corollaire méthodologique : aucun test de tunnel n'est possible depuis le réseau domestique. Basculer systématiquement sur un partage de connexion mobile avant de tester (voir §6, ordre de test).
d) Un handshake réussi ne garantit jamais que le tunnel transporte des
données. C'est le principe qui explique à la fois la panne de juillet
(§4, AllowedIPs vide) et celle d'août (§3, forwarding désactivé) : dans les
deux cas, les paquets de contrôle (handshake, keepalive) sont passés sans
souci pendant que le trafic applicatif réel restait bloqué. Toujours valider
avec un test de données réel (ping applicatif, SSH), jamais avec le seul
wg show / latest handshake.
e) No route to host sur toute IP 192.168.1.x en déplacement ne signifie
pas une panne cluster. PC1 est simplement hors du réseau maison. Premier
réflexe : ip route | grep default ; si la passerelle diffère de celle du LAN
maison, passer par le tunnel (cf. §8).
f) Un handshake vivant ne garantit ni une adresse IP sur l'interface, ni des
routes correctes — variante du principe (d) pour une autre cause : en §8,
wg0 avait un handshake actif mais aucune adresse. Toujours valider avec un
test de données réel, jamais avec wg show seul.
g) AllowedIPs avec [LAN] collisionne dès que le réseau
d'accueil utilise la même plage (cas fréquent : Free, SFR, Livebox par
défaut). Un bastion en rebond pur ([RESEAU_WG] seul, cf. §8 E3) l'évite
définitivement.
h) wg-quick au démarrage d'une machine Wi-Fi part souvent avant que le
réseau soit prêt. Ajouter une dépendance explicite (network-online.target)
évite de rejouer l'échec à chaque redémarrage (§8, E1).
Le 30/08/2026, PC1 était en déplacement, connecté derrière un routeur tiers
utilisant également le sous-réseau [LAN] (plage très répandue
chez les box grand public). Symptôme : nœuds fixes injoignables en SSH direct
(No route to host), moniteur cluster en échec sur tous les nœuds distants.
Ce n'est pas une panne du cluster : les adresses 192.168.1.x visées sont
celles du LAN maison. Sur un réseau d'accueil qui utilise la même plage,
ssh [IP_PC2] cherche la machine sur le réseau local courant — elle
n'y est pas. Premier réflexe : comparer la passerelle par défaut
(ip route | grep default) à celle du LAN maison ; si elle diffère, passer
par le tunnel WireGuard, pas par les IP LAN.
Le tunnel montrait un handshake récent (sudo wg show), mais l'interface
wg0 n'avait aucune adresse IP — montée à moitié.
| # | Erreur | Cause | Conséquence |
|---|---|---|---|
| E1 |
wg0 monté sans IP au démarrage |
wg-quick@wg0 lancé au boot avant que le Wi-Fi soit connecté → l'endpoint <hostname>.duckdns.org n'était pas résolvable → l'unité échoue après avoir créé l'interface |
Tunnel à moitié mort au retour de déplacement |
| E2 | Le script de reprise automatique ne réparait pas | Il testait la présence de l'interface (wg show wg0), jamais sa santé (handshake réel) |
Le tunnel cassé n'était jamais relancé automatiquement |
| E3 | Collision [LAN]
|
AllowedIPs incluait [LAN] → wg-quick ajoute une route qui avale la passerelle locale sur tout LAN d'accueil utilisant la même plage |
Coupe l'Internet IPv4 local en déplacement ; échec de wg-quick up au boot |
| E4 | SSH et moniteur sur IP LAN en dur | Les scripts de connexion visaient directement les IP 192.168.1.x des nœuds fixes |
Volets SSH et moniteur en échec en déplacement |
-
Test de santé plutôt que de présence : le script de reprise automatique
teste désormais un
pingvers l'IP du bastion côté tunnel ([WG_PC4]) ; en cas d'échec, il relancewg-quick downpuisupet re-teste. -
AllowedIPsréduit à[RESEAU_WG]seul (rebond pur par le bastion) : le tunnel ne transporte plus que le sous-réseau VPN. PC2/PC3 sont atteints à travers le bastion, jamais par une route LAN directe injectée dans le tunnel — élimine la collision, quel que soit le réseau d'accueil. -
Moniteur et session tmux via
ProxyJump: les nœuds non-bastion sont contactés parssh -J <utilisateur>@[WG_PC4] ...plutôt que par IP LAN directe ; le bastion reste joignable en direct sur[WG_PC4]. Détection automatique du contexte (tunnel up/down) pour choisir la bonne route. -
Démarrage après le réseau :
After=network-online.target+Wants=network-online.targetsur l'unitéwg-quick@wg0, pour éviter un montage tenté avant que l'endpoint DDNS soit résolvable.
En déplacement (hotspot mobile), ip -6 addr ne montrait qu'une adresse fe80::
lien-local — aucune IPv6 globale, donc aucun handshake WireGuard possible
(l'endpoint DuckDNS est IPv6 seul). Piste initialement soupçonnée : opérateur
mobile sans IPv6. Fausse piste — un redémarrage complet du partage de
connexion (déconnexion/reconnexion réelle, confirmée dans les logs noyau) n'a
rien changé : toujours aucune IPv6 globale ensuite.
Proton VPN, actif sur le portable, interceptait la connexion et bloquait l'IPv6 (comportement anti-fuite classique des VPN commerciaux). Le hotspot fournissait bien l'IPv6 depuis le début.
Preuve par élimination :
Proton ACTIF : ip -6 addr show | grep -v fe80 → rien · ping6 externe → injoignable
Proton COUPÉ : ip -6 addr show | grep -v fe80 → 2a02:...:.../64 global · ping6 → OK
sudo wg-quick up wg0 ; ping [WG_PC4] → 0% perte, ~58 ms
Seul changement entre les deux états : Proton VPN coupé. Handshake immédiat.
Pendant la période sans IPv6 (Proton actif), le dispatcher réseau redéclenchait
wg_auto.sh à chaque event, qui tentait de réparer un tunnel structurellement
injoignable (pas d'IPv6) → boucle "tunnel MORT → réparation → échec" toutes les
~10 secondes. Ce n'était pas un bug du script : il réparait fidèlement un
symptôme (pas de handshake) dont la vraie cause (Proton) lui était invisible.
wg_auto.sh v2 : garde IPv6 globale avant toute tentative de réparation ou
notification en déplacement (détail complet : Guide-WireGuard-Acces-Distant
§3.4). Committé le 05/09/2026 sur Riemann_Lab_C
(fix(scripts): wg_auto.sh — auto-réparation handshake + garde IPv6 avant notif/action). Backups conservés : wg_auto.sh.bak-20260905 (état 30/08),
wg_auto.sh.bak-20260905-avant-v2.
Un test répété qui échoue de la même façon ne prouve pas la même cause à chaque fois. « Ça marchait avant sur ce même hotspot » était le bon indice — la variable qui avait changé n'était pas le réseau mais un logiciel tiers actif sur le client, invisible depuis PC1 sans vérification explicite.
- Guide-WireGuard-Acces-Distant — procédure de dépannage à jour (TL;DR, niveaux débutant→expert, commandes de référence), à consulter en premier en cas de nouvelle panne
- Migration-PC4-Compaq-CQ58-20260816 — migration matérielle à l'origine du changement d'adresse IPv6 de PC4 (déclencheur probable de l'occurrence d'août, §2)
- Architecture-Cluster-Zeta — chaîne d'accès distant complète, rôle de bastion de PC4
- JOURNAL — historique daté, append-only
- STACK — outils, roadmap, matériel, formation
- Guide-Linux-Commandes — §18, §27-§28, commandes réseau
Diagnostic-WireGuard-Hotspot.md · wiki racine · branche master · hprzeta · MAJ 2026-09-05 · 536 lignes