v0.7.1 : diagnostics non-bloquants, DNS hors tunnel détecté

- Nouveau diagnostic : signale un DNS non couvert par les IPs autorisées
  sur un tunnel scindé (résolution forcée via une interface qui n'a pas
  de route vers ce serveur).
- Corrige le test de connexion, l'analyse DNS et la réparation DNS qui
  gelaient l'application (sondes lancées sur le thread graphique).
- Corrige le CHANGELOG absent de l'exécutable compilé (page « À propos »
  vide) et le badge de latence bloqué sur « hors ligne » quand l'ICMP est
  filtré alors que le tunnel fonctionne.
- wgsecure.iss installe désormais WireGuard for Windows automatiquement.
This commit is contained in:
2026-09-01 22:05:20 +02:00
parent ce4df4edb4
commit 8e40812f76
8 changed files with 119 additions and 26 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ _WG_DEFAULT: dict[str, Any] = {
}
_DEFAULT: dict[str, Any] = {
"version": "0.7.0",
"version": "0.7.1",
"admin_password_hash": "",
"admin_salt": "",
"mfa_enabled": False,
+37
View File
@@ -580,6 +580,43 @@ def _diag_config(cfg: Config) -> list[dict]:
steps.append(_step(_OK if valid else _FAIL, "Clé pré-partagée",
"Activée (doit être identique côté serveur)" if valid
else "Format invalide : 32 octets en base64 attendus"))
# En tunnel scindé (AllowedIPs ≠ 0.0.0.0/0), NetworkManager/systemd-resolved
# associe le DNS configuré à l'interface WireGuard avec un domaine de
# routage global (`~.`) : toute résolution de nom est alors tentée via
# cette interface, qui n'a de route que vers les réseaux listés dans les
# IPs autorisées. Un DNS hors de cette liste (ex. 1.1.1.1 sur un tunnel qui
# ne route que des sous-réseaux internes) devient injoignable par ce
# chemin — la résolution échoue en bloc alors que le reste d'Internet,
# non concerné par ce DNS, continue de fonctionner (d'où un `ping` sur une
# IP qui réussit à côté d'un `ping` sur un nom qui échoue).
dns_value = (wg.get("dns") or "").strip()
if dns_value and dns_util.has_dns_backend():
nets = _networks(wg.get("allowed_ips", ""))
full_tunnel = any(n.prefixlen == 0 for n in nets)
if nets and not full_tunnel:
uncovered = []
for part in dns_value.split(","):
part = part.strip()
if not part:
continue
try:
addr = ipaddress.ip_address(part)
except ValueError:
continue
if not any(addr in n for n in nets if n.version == addr.version):
uncovered.append(part)
if uncovered:
steps.append(_step(
_WARN, "Serveur DNS routé par le tunnel",
"DNS " + ", ".join(uncovered) + " absent des IPs "
"autorisées : une fois le tunnel monté, le système tente "
"de le joindre via l'interface WireGuard, qui n'a pourtant "
"aucune route vers cette adresse — toute résolution de "
"nom échoue, même si le reste d'Internet fonctionne. "
"Utilisez un DNS compris dans les IPs autorisées (ex. un "
"résolveur interne au réseau distant), ou ajoutez son "
"réseau à la liste."))
return steps