Add Remote DNS

This commit is contained in:
2026-09-04 08:55:35 +02:00
parent 910c04f845
commit 902c177330
9 changed files with 876 additions and 599 deletions
+35 -8
View File
@@ -268,6 +268,20 @@ def _wait_connected(cfg: Config, timeout: int = 15) -> bool:
time.sleep(0.5)
def _post_connect_message(cfg: Config) -> str:
"""Message de succès de connexion, complété d'un avertissement si le
split-DNS configuré n'a pas pu être appliqué.
Son échec était auparavant ignoré silencieusement (`setup_split_dns`
appelé sans regarder son retour) : le tunnel se déclarait « activé »
même quand les noms du réseau distant ne se résolvaient jamais.
"""
ok, msg = dns_util.setup_split_dns(cfg)
if not ok:
return f"Tunnel WireGuard activé\n{msg}"
return "Tunnel WireGuard activé"
def connect(cfg: Config) -> tuple[bool, str]:
if not cfg.configured:
return False, "WireGuard non configuré. Ouvrez le panneau Admin."
@@ -302,9 +316,7 @@ def connect(cfg: Config) -> tuple[bool, str]:
# démarrage effectif du tunnel est asynchrone. Tester l'état
# immédiatement conclurait « échec » sur un tunnel qui monte.
if code == 0 and _wait_connected(cfg, timeout=15):
# Configurer le split-DNS si un serveur dédié est défini
dns_util.setup_split_dns(cfg)
return True, "Tunnel WireGuard activé"
return True, _post_connect_message(cfg)
force_cleanup(cfg)
return False, err or f"Échec de l'installation du tunnel (code {code})"
@@ -320,9 +332,7 @@ def connect(cfg: Config) -> tuple[bool, str]:
# Passer le nom d'interface (pas le chemin) : AppArmor autorise /etc/wireguard/ seulement
code, _, err = run_privileged(["wg-quick", "up", name], timeout=90)
if code == 0:
# Configurer le split-DNS si un serveur dédié est défini
dns_util.setup_split_dns(cfg)
return True, "Tunnel WireGuard activé"
return True, _post_connect_message(cfg)
# Échec : wg-quick a pu s'arrêter après set_dns (ou être tué par le
# dépassement de délai avant son trap de nettoyage). On démonte
@@ -862,8 +872,25 @@ def _diag_tunnel(cfg: Config) -> list[dict]:
steps.append(_step(_FAIL, "Résolution DNS dans le tunnel",
"Plus aucun nom ne se résout — utilisez "
"« Réparer le DNS »"))
else:
steps.append(_step(_OK, "Résolution DNS dans le tunnel", "Fonctionnelle"))
return steps
steps.append(_step(_OK, "Résolution DNS dans le tunnel", "Fonctionnelle"))
# Un résolveur qui répond ne dit rien sur le split-DNS lui-même : le nom
# peut très bien se résoudre... vers une réponse publique inattendue au
# lieu du réseau distant. On vérifie donc explicitement le(s) domaine(s)
# configurés, pas seulement qu'une résolution quelconque fonctionne.
domains = wg.get("split_dns_domains") or []
for domain in domains:
ok, ips = dns_util.resolve_host(domain, timeout=3.0)
if ok:
steps.append(_step(_OK, f"Résolution distante ({domain})",
"" + ", ".join(ips)))
else:
steps.append(_step(
_WARN, f"Résolution distante ({domain})",
"Ne se résout pas — vérifiez le serveur DNS distant "
f"({wg.get('split_dns_server', '?')}) et les règles NRPT/"
"systemd-resolved du split-DNS"))
return steps