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:
+1
-1
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user