Add monorepo structure for NexaVPN WireGuard control plane including: - .gitignore for node_modules, build artifacts, and environment files - README with project overview, monorepo layout, and quick start guide - Admin web UI with React, Vite, TypeScript, and nginx reverse proxy - API client with type definitions for users, devices, policies, gateways, and audit logs - Admin pages for dashboard, users, devices, policies, g
5.1 KiB
5.1 KiB
NexaVPN Architecture
System Overview
NexaVPN is a self-hosted remote access platform that uses WireGuard for transport and a centralized control plane for identity, device enrollment, provisioning, and policy enforcement.
The platform is split into four major planes:
- Control plane
- Go REST API
- PostgreSQL
- JWT auth and refresh sessions
- policy engine
- audit logging
- WireGuard profile builder
- gateway state publisher
- Management plane
- React admin console
- user, device, policy, gateway, and audit workflows
- Endpoint plane
- Tauri desktop client for Windows and macOS
- local secure token/config storage
- on-device WireGuard keypair generation
- embedded tunnel lifecycle management
- Data plane
- Linux WireGuard gateway
- nftables policy enforcement
- routed access to protected resources
Logical Components
Backend
auth- username/password login
- access and refresh token issuance
- session tracking
user- user CRUD
- role assignment
- account enable/disable
device- device registration
- enrollment lifecycle
- device revocation
- device profile rotation
policy- user and device policy resolution
- group-aware target model
- allow-list centric MVP with deny precedence reserved in schema
gateway- gateway inventory
- endpoint metadata
- peer sync bundle generation
- firewall rule translation output
profile- WireGuard config assembly
- connect metadata response
audit- immutable security and admin events
ipam- VPN address pool allocation
- uniqueness and lifecycle tracking
Admin UI
- Dashboard
- counts, enrollment trend, latest audit events
- Users
- create, edit, disable, password reset
- Devices
- list, revoke, rotate, inspect assigned profile metadata
- Policies
- create CIDR-based allow rules and attach them to users, devices, or groups
- Gateways
- endpoint configuration, sync status, address pool view
- Audit
- searchable event history
- Settings
- DNS defaults, token lifetimes, bootstrap settings
Desktop Client
- onboarding
- server URL
- username
- password
- enrollment
- machine fingerprint generation
- WireGuard keypair generation on-device
- device registration
- profile provisioning
- runtime
- secure local storage
- connect/disconnect
- status display
- last sync time
- allowed resources display
- diagnostics
- logs
- TLS trust warning surface
- profile refresh retry
Gateway
- WireGuard interface
- issued peers synced from control plane
- nftables chain generated from effective device policies
- route advertisement limited to assigned resources or full tunnel mode
Key Design Decisions
Authentication
- Access tokens are short-lived JWTs.
- Refresh tokens are opaque, hashed in the database, and bound to a session.
- Admin and standard-user authorization is role-based.
Device Trust
- A device is represented as a durable record linked to a user.
- Clients generate their own WireGuard keypairs.
- Only the public key is stored server-side.
- Device rotation invalidates the old peer and issues a fresh profile revision.
Policy Model
- Effective access is the union of active allow policies targeted at:
- the user
- the device
- any future groups
- Device-specific policies can narrow or extend user-level access.
- Gateway enforcement is authoritative; the client display is informational.
WireGuard Provisioning
- The backend returns structured peer metadata and a rendered profile payload.
- The desktop client stores the private key and profile locally.
- The MVP uses an embedded tunnel-management abstraction rather than depending on the standalone WireGuard desktop app.
Expandability
The schema and package layout reserve room for:
- MFA
- OIDC and SSO
- approval-based enrollment
- group and role expansion
- multiple gateways
- route and posture-aware policies
- richer sync agents at the gateway edge
Request Flow Summary
Login and Enrollment
- User enters server URL, username, and password in the desktop app.
- Client authenticates against
/api/v1/auth/login. - Client generates a WireGuard keypair and device fingerprint locally.
- Client registers with
/api/v1/devices/enroll. - Backend resolves policy, allocates IP, selects a gateway, stores the peer, and returns profile metadata.
- Client stores tokens and WireGuard config securely.
- Client uses the embedded tunnel manager to create the local profile and expose one-click connect/disconnect.
Policy Update
- Admin changes a policy in the web UI.
- Backend stores the update and writes an audit event.
- Gateway sync state is recalculated.
- Gateway rule bundle is regenerated for affected peers.
- The client sees refreshed allowed resources on next sync.
Security Posture
- Passwords use Argon2id.
- Refresh tokens are stored hashed.
- Device private keys stay local.
- Audit logs capture auth, enrollment, policy, and admin actions.
- TLS is assumed in production behind a reverse proxy.
- Gateway firewalling enforces allowed destinations independently from the client.