This commit is contained in:
2026-06-03 09:55:39 +02:00
parent b3f0a2eecc
commit 2f9ca6b553
2 changed files with 0 additions and 114 deletions
-63
View File
@@ -245,69 +245,6 @@ def ping_server(host: str, timeout: int = 2) -> int | None:
return None return None
# ── Kill switch ──────────────────────────────────────────────────────────
_KS_CHAIN = "WGS_KILLSWITCH"
def enable_kill_switch(cfg: Config) -> tuple[bool, str]:
"""Active le kill switch : bloque tout trafic hors du tunnel WireGuard."""
if is_windows():
return False, "Kill switch non disponible sur Windows (utilisez le pare-feu Windows)"
iface = cfg.wg.get("interface_name", "wgs0")
server = cfg.wg.get("server_endpoint", "")
port = str(cfg.wg.get("server_port", 51820))
# Créer la chaîne dédiée (idempotent)
run_privileged(["iptables", "-N", _KS_CHAIN])
run_privileged(["iptables", "-F", _KS_CHAIN])
rules = [
["iptables", "-A", _KS_CHAIN, "-o", "lo", "-j", "ACCEPT"],
["iptables", "-A", _KS_CHAIN, "-o", iface, "-j", "ACCEPT"],
["iptables", "-A", _KS_CHAIN, "-m", "state",
"--state", "ESTABLISHED,RELATED", "-j", "ACCEPT"],
]
if server:
rules.append(["iptables", "-A", _KS_CHAIN,
"-d", server, "-p", "udp", "--dport", port, "-j", "ACCEPT"])
rules.append(["iptables", "-A", _KS_CHAIN, "-j", "REJECT",
"--reject-with", "icmp-net-unreachable"])
for rule in rules:
code, _, err = run_privileged(rule)
if code != 0:
disable_kill_switch(cfg)
return False, f"Erreur iptables : {err}"
# Insérer la chaîne dans OUTPUT (évite les doublons)
run_privileged(["iptables", "-D", "OUTPUT", "-j", _KS_CHAIN])
code, _, err = run_privileged(["iptables", "-I", "OUTPUT", "-j", _KS_CHAIN])
if code != 0:
disable_kill_switch(cfg)
return False, err
return True, f"Kill switch activé (interface {iface})"
def disable_kill_switch(cfg: Config) -> tuple[bool, str]:
"""Désactive le kill switch."""
if is_windows():
return True, "N/A"
run_privileged(["iptables", "-D", "OUTPUT", "-j", _KS_CHAIN])
run_privileged(["iptables", "-F", _KS_CHAIN])
run_privileged(["iptables", "-X", _KS_CHAIN])
return True, "Kill switch désactivé"
def kill_switch_active() -> bool:
if is_windows():
return False
code, out, _ = run_command(["iptables", "-L", "OUTPUT", "-n"])
return _KS_CHAIN in out
# ── Test DNS leak ───────────────────────────────────────────────────────── # ── Test DNS leak ─────────────────────────────────────────────────────────
def dns_leak_test(cfg: Config) -> dict: def dns_leak_test(cfg: Config) -> dict:
-51
View File
@@ -524,34 +524,6 @@ class AdminWindow(QDialog):
lay.addWidget(grp1) lay.addWidget(grp1)
grp_ks = QGroupBox("🔒 Kill Switch (Linux)")
g_ks = QVBoxLayout(grp_ks)
note_ks = QLabel(
"Bloque tout trafic internet si le tunnel VPN tombe.\n"
"Nécessite des droits root (iptables)."
)
note_ks.setWordWrap(True)
note_ks.setStyleSheet("color: rgba(255,255,255,0.7); font-size: 11px;")
g_ks.addWidget(note_ks)
ks_row = QHBoxLayout()
self._btn_ks_enable = QPushButton("🔒 Activer")
self._btn_ks_enable.clicked.connect(self._enable_kill_switch)
self._btn_ks_disable = QPushButton("🔓 Désactiver")
self._btn_ks_disable.setStyleSheet(
"QPushButton { background: #6e2e1c; border-radius: 5px; padding: 7px 12px;"
" color: white; border: none; } QPushButton:hover { background: #922b21; }"
)
self._btn_ks_disable.clicked.connect(self._disable_kill_switch)
self._ks_status = QLabel("")
self._ks_status.setStyleSheet("font-size: 11px; color: #aed6f1;")
ks_row.addWidget(self._btn_ks_enable)
ks_row.addWidget(self._btn_ks_disable)
ks_row.addWidget(self._ks_status)
ks_row.addStretch()
g_ks.addLayout(ks_row)
lay.addWidget(grp_ks)
self._refresh_ks_status()
grp2 = QGroupBox("Auto-reconnexion") grp2 = QGroupBox("Auto-reconnexion")
form2 = QFormLayout(grp2) form2 = QFormLayout(grp2)
@@ -965,29 +937,6 @@ class AdminWindow(QDialog):
f"padding: 8px; border-radius: 6px; font-size: 11px; {css}" f"padding: 8px; border-radius: 6px; font-size: 11px; {css}"
) )
def _refresh_ks_status(self):
active = wg_core.kill_switch_active()
if active:
self._ks_status.setText("🔒 Actif")
self._ks_status.setStyleSheet("color: #a9dfbf; font-size: 11px;")
else:
self._ks_status.setText("🔓 Inactif")
self._ks_status.setStyleSheet("color: #f1948a; font-size: 11px;")
def _enable_kill_switch(self):
self._save_values()
ok, msg = wg_core.enable_kill_switch(self._cfg)
self._refresh_ks_status()
if ok:
QMessageBox.information(self, "Kill Switch", msg)
else:
QMessageBox.warning(self, "Kill Switch", msg)
def _disable_kill_switch(self):
ok, msg = wg_core.disable_kill_switch(self._cfg)
self._refresh_ks_status()
QMessageBox.information(self, "Kill Switch", msg)
def _set_admin_password(self): def _set_admin_password(self):
p1 = self._admin_pw1.text() p1 = self._admin_pw1.text()
p2 = self._admin_pw2.text() p2 = self._admin_pw2.text()