From 7d30e55f0dd6206cbd4ceaea9d2a8815a1d3fc41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Tue, 28 Apr 2026 14:35:31 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20WireGuard=20deploy=20=E2=80=94=20=D1=83?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20kmod-wireguard,=20ndmc=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=BC,=20fallback=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20wg+ip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убрать kmod-wireguard из opkg (не существует, ядро Keenetic уже имеет WireGuard) - ndmc теперь основной путь (нативная интеграция в Keenetic UI), а не fallback - Fallback: raw wg set + ip link/addr (без wg-quick, которого нет в Entware) - init.d S50wg0 использует wg + ip вместо wg-quick - Приватный ключ пишется в отдельный файл wg0.key для wg set private-key - Убрать set -e — чтобы fallback-пути не прерывали скрипт Co-Authored-By: Claude Sonnet 4.6 --- server/main.py | 66 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/server/main.py b/server/main.py index 48deb96..1653426 100644 --- a/server/main.py +++ b/server/main.py @@ -710,49 +710,85 @@ async def wg_deploy(name: str, x_admin_password: str = Header("")): client_ip = peer["ip"] script = f"""\ -set -e echo '[1/3] Установка wireguard-tools...' opkg update 2>/dev/null || true -opkg install wireguard-tools kmod-wireguard 2>/dev/null || true -command -v wg >/dev/null 2>&1 || {{ echo 'ОШИБКА: wg не установлен'; exit 1; }} +opkg install wireguard-tools 2>/dev/null || true +command -v wg >/dev/null 2>&1 || {{ echo 'ОШИБКА: wg не установлен (opkg install wireguard-tools)'; exit 1; }} echo '[2/3] Запись конфига...' mkdir -p /opt/etc/wireguard cat > /opt/etc/wireguard/wg0.conf << 'WGEOF' {wg_conf}WGEOF chmod 600 /opt/etc/wireguard/wg0.conf +printf '%s\\n' '{priv_key}' > /opt/etc/wireguard/wg0.key +chmod 600 /opt/etc/wireguard/wg0.key + cat > /opt/etc/init.d/S50wg0 << 'INITEOF' #!/bin/sh case "$1" in - start) wg-quick up /opt/etc/wireguard/wg0.conf 2>/dev/null ;; - stop) wg-quick down /opt/etc/wireguard/wg0.conf 2>/dev/null ;; - restart) wg-quick down /opt/etc/wireguard/wg0.conf 2>/dev/null; wg-quick up /opt/etc/wireguard/wg0.conf ;; + start) + ip link show wg0 >/dev/null 2>&1 || ip link add wg0 type wireguard 2>/dev/null || exit 0 + wg set wg0 private-key /opt/etc/wireguard/wg0.key \\ + peer '{pub_key}' \\ + allowed-ips 0.0.0.0/0 \\ + endpoint '{vps_host}:{port}' \\ + persistent-keepalive 25 + ip addr add '{client_ip}/32' dev wg0 2>/dev/null || true + ip link set up dev wg0 + ;; + stop) + ip link set down dev wg0 2>/dev/null + ip link delete wg0 2>/dev/null + ;; + restart) $0 stop; sleep 1; $0 start ;; esac INITEOF chmod +x /opt/etc/init.d/S50wg0 -echo '[3/3] Запуск VPN...' -wg-quick down /opt/etc/wireguard/wg0.conf 2>/dev/null || true -wg-quick up /opt/etc/wireguard/wg0.conf +echo '[3/3] Настройка WireGuard...' +DONE=0 +# Вариант 1: Keenetic CLI (ndmc) — нативная интеграция (появится в Подключениях) if command -v ndmc >/dev/null 2>&1; then + echo 'Keenetic CLI (ndmc)...' printf '%s\\n' \\ 'interface Wireguard0' \\ - 'description HydraVPN' \\ + 'ip address {client_ip}/32' \\ 'wireguard private-key {priv_key}' \\ 'wireguard peer {pub_key}' \\ 'wireguard allowed-ips 0.0.0.0 0.0.0.0' \\ 'wireguard endpoint {vps_host} {port}' \\ 'wireguard persistent-keepalive 25' \\ 'exit' \\ - 'system configuration save' | ndmc 2>/dev/null && \\ - echo 'Keenetic CLI: нативная интеграция OK (проверь в Подключениях)' || \\ - echo 'Keenetic CLI: не удалось, wg-quick запущен' + 'exit' \\ + 'system configuration save' | ndmc 2>&1 && DONE=1 && \\ + echo 'OK: Keenetic WireGuard нативно (проверь в Подключениях)' || true +fi + +# Вариант 2: raw wg + ip (Entware, без wg-quick) +if [ "$DONE" = "0" ]; then + echo 'Используем wg + ip...' + ip link show wg0 >/dev/null 2>&1 || ip link add wg0 type wireguard 2>/dev/null || true + wg set wg0 private-key /opt/etc/wireguard/wg0.key \\ + peer '{pub_key}' \\ + allowed-ips 0.0.0.0/0 \\ + endpoint '{vps_host}:{port}' \\ + persistent-keepalive 25 && DONE=1 || true + ip addr add '{client_ip}/32' dev wg0 2>/dev/null || true + ip link set up dev wg0 2>/dev/null || true + [ "$DONE" = "1" ] && echo 'OK: wg0 поднят' +fi + +if [ "$DONE" = "0" ]; then + echo 'ОШИБКА: не удалось настроить WireGuard' + echo 'Конфиг сохранён: /opt/etc/wireguard/wg0.conf' + echo 'После перезагрузки S50wg0 попробует снова' + exit 1 fi echo '=== OK ===' -echo 'VPN IP роутера: {client_ip}' -ip addr show wg0 2>/dev/null | grep inet || wg show wg0 2>/dev/null || true +echo 'VPN IP: {client_ip}' +wg show wg0 2>/dev/null | head -8 || ip addr show wg0 2>/dev/null | grep inet || true """ rc, out, err = await _ssh_on_router(rcfg, script, timeout=120)