fix: WireGuard deploy — убрать kmod-wireguard, ndmc первым, fallback через wg+ip

- Убрать 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 <noreply@anthropic.com>
This commit is contained in:
Андрей Бобырев
2026-04-28 14:35:31 +03:00
parent e63138eca0
commit 7d30e55f0d

View File

@@ -710,49 +710,85 @@ async def wg_deploy(name: str, x_admin_password: str = Header("")):
client_ip = peer["ip"] client_ip = peer["ip"]
script = f"""\ script = f"""\
set -e
echo '[1/3] Установка wireguard-tools...' echo '[1/3] Установка wireguard-tools...'
opkg update 2>/dev/null || true opkg update 2>/dev/null || true
opkg install wireguard-tools kmod-wireguard 2>/dev/null || true opkg install wireguard-tools 2>/dev/null || true
command -v wg >/dev/null 2>&1 || {{ echo 'ОШИБКА: wg не установлен'; exit 1; }} command -v wg >/dev/null 2>&1 || {{ echo 'ОШИБКА: wg не установлен (opkg install wireguard-tools)'; exit 1; }}
echo '[2/3] Запись конфига...' echo '[2/3] Запись конфига...'
mkdir -p /opt/etc/wireguard mkdir -p /opt/etc/wireguard
cat > /opt/etc/wireguard/wg0.conf << 'WGEOF' cat > /opt/etc/wireguard/wg0.conf << 'WGEOF'
{wg_conf}WGEOF {wg_conf}WGEOF
chmod 600 /opt/etc/wireguard/wg0.conf 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' cat > /opt/etc/init.d/S50wg0 << 'INITEOF'
#!/bin/sh #!/bin/sh
case "$1" in case "$1" in
start) wg-quick up /opt/etc/wireguard/wg0.conf 2>/dev/null ;; start)
stop) wg-quick down /opt/etc/wireguard/wg0.conf 2>/dev/null ;; ip link show wg0 >/dev/null 2>&1 || ip link add wg0 type wireguard 2>/dev/null || exit 0
restart) wg-quick down /opt/etc/wireguard/wg0.conf 2>/dev/null; wg-quick up /opt/etc/wireguard/wg0.conf ;; 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 esac
INITEOF INITEOF
chmod +x /opt/etc/init.d/S50wg0 chmod +x /opt/etc/init.d/S50wg0
echo '[3/3] Запуск VPN...' echo '[3/3] Настройка WireGuard...'
wg-quick down /opt/etc/wireguard/wg0.conf 2>/dev/null || true DONE=0
wg-quick up /opt/etc/wireguard/wg0.conf
# Вариант 1: Keenetic CLI (ndmc) — нативная интеграция (появится в Подключениях)
if command -v ndmc >/dev/null 2>&1; then if command -v ndmc >/dev/null 2>&1; then
echo 'Keenetic CLI (ndmc)...'
printf '%s\\n' \\ printf '%s\\n' \\
'interface Wireguard0' \\ 'interface Wireguard0' \\
'description HydraVPN' \\ 'ip address {client_ip}/32' \\
'wireguard private-key {priv_key}' \\ 'wireguard private-key {priv_key}' \\
'wireguard peer {pub_key}' \\ 'wireguard peer {pub_key}' \\
'wireguard allowed-ips 0.0.0.0 0.0.0.0' \\ 'wireguard allowed-ips 0.0.0.0 0.0.0.0' \\
'wireguard endpoint {vps_host} {port}' \\ 'wireguard endpoint {vps_host} {port}' \\
'wireguard persistent-keepalive 25' \\ 'wireguard persistent-keepalive 25' \\
'exit' \\ 'exit' \\
'system configuration save' | ndmc 2>/dev/null && \\ 'exit' \\
echo 'Keenetic CLI: нативная интеграция OK (проверь в Подключениях)' || \\ 'system configuration save' | ndmc 2>&1 && DONE=1 && \\
echo 'Keenetic CLI: не удалось, wg-quick запущен' 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 fi
echo '=== OK ===' echo '=== OK ==='
echo 'VPN IP роутера: {client_ip}' echo 'VPN IP: {client_ip}'
ip addr show wg0 2>/dev/null | grep inet || wg show wg0 2>/dev/null || true 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) rc, out, err = await _ssh_on_router(rcfg, script, timeout=120)