elmprodvpn (Selective VPN Dashboard)

Local Linux toolset (Go API + Qt GUI) to manage selective VPN routing and DNS wildcarding for AdGuard VPN / SmartDNS.

Key features:

  • Selective routes via nftables sets (agvpn4 / agvpn_dyn4) + policy routing table (agvpn).
  • DNS upstream management (default + meta) and optional SmartDNS wildcard list.
  • Traffic modes: Selective (fwmark 0x66), Full tunnel, Direct.
  • Auto-local bypass to keep LAN/docker reachable in Full tunnel.
  • Policy overrides: force VPN/Direct by source subnet, UID, or systemd cgroup.
  • Runtime per-app routing: launch an app in a systemd --user unit and apply a temporary cgroup-based mark (VPN/Direct).
  • Saved app profiles + desktop shortcuts: one-click launch for a profile (uses selective-vpn-gui/svpn_run_profile.py).

Repo layout:

  • selective-vpn-api/ - Go backend API (localhost, default 127.0.0.1:8080).
  • selective-vpn-gui/ - PySide6 GUI (vpn_dashboard_qt.py).
    • selective-vpn-gui/svpn_run_profile.py - headless launcher used by profile shortcuts.
  • selective-vpn-web/ - Vite + React + TypeScript web prototype foundation (SPA, read-only at current stage).

Requirements (high level):

  • Linux with systemd, nftables, iproute2, cgroup v2.
  • Python 3 + PySide6 + requests (GUI).
  • Root privileges for routing/nftables changes (run API as a privileged service).

Quick traffic checklist (production-safe):

  • Start from Selective mode for mixed host/server workloads.
  • For Full tunnel, open Advanced bypass in Traffic basics and usually enable:
    • Auto-local bypass (LAN/container reachability),
    • Ingress-reply bypass (keep inbound/public services reachable).
  • Verify mode health is OK and ingress diagnostics are active when ingress bypass is enabled.
  • If something breaks, use Reset bypass (advanced bypass dialog) or temporarily switch back to Selective.
Description
Devlop app selective vpn
Readme AGPL-3.0 1.9 MiB
Languages
Go 57.4%
Python 38.7%
Shell 2.8%
TypeScript 0.8%
CSS 0.2%