Add Remote DNS
This commit is contained in:
+35
-8
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user