WireGuard Management
Create and manage VPN peers with automatic IPv4/IPv6 allocation, QR code provisioning, and downloadable .conf files.
GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing bartei.github.io — WireGUI - Self-hosted WireGuard VPN Management Open source · AGPL-3.0 Self-hosted WireGuardVPN managementA clean web interface for managing WireGuard peers, firewall rules, and user authentication — without depending on any third-party cloud service. Fully transparent, fully yours. ![]() Everything you need to manage your VPNBuilt for teams and individuals who want full control over their VPN infrastructure. WireGuard ManagementCreate and manage VPN peers with automatic IPv4/IPv6 allocation, QR code provisioning, and downloadable .conf files. Firewall RulesPer-user nftables chains with CIDR, protocol, and port range support. Network policies apply instantly. Site-to-Site RelayRoute whole subnets through a peer for site-to-site links and VPN relays. Server-side allowed-ips, kernel routes, and firewall jumps are configured automatically and reconciled with your config. Multi-Factor AuthTOTP authenticator apps (Google Authenticator, Authy, 1Password) and WebAuthn security keys (YubiKey, Touch ID). Single Sign-OnOpenID Connect and SAML 2.0 with auto-provisioning. Works with Okta, Auth0, Keycloak, Azure AD, and more. REST APIFull-featured /api/v0 with token authentication for programmatic management of users, devices, rules, and configuration. Real-Time MonitoringLive RX/TX counters, traffic charts, handshake tracking, WAN connectivity checks, and system notifications. Magic LinksPasswordless email-based login when SMTP is configured. No password to remember, no friction for users. Session ManagementConfigurable VPN session durations with automatic peer expiry. Users re-authenticate on schedule. Dark ModeUser-selectable dark/light theme stored in profile. Auto mode follows system preference. See it in actionA clean, intuitive interface for every aspect of VPN management. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Up and running in minutesDocker Compose is the recommended way to deploy WireGUI. 1Production (Docker Compose)terminal The container runs migrations automatically, manages the WireGuard interface, and requires 2Developmentterminal Open Web UI & API :13000 TCP WireGuard VPN :51820 UDP Python 3.13+ required Bare metal: VM or LXCDocker is the recommended path, but nothing in WireGUI requires it. Here is the full install on a plain VM or an LXC container. WireGUI is a Python application that shells out to RequirementsPython 3.13+ plus uv for dependency management PostgreSQL 15+ local or remote; the source of truth Valkey / Redis sessions and cache wireguard-tools the wg CLI iproute2 the ip CLI — creates and addresses wg0 nftables the nft CLI — per-user chains and NAT CAP_NET_ADMIN required to manage the interface and firewall WireGuard kernel module in-tree since Linux 5.6 1System packagesDebian / UbuntuOn releases without a Fedora / RHEL / RockyPython version. WireGUI needs 3.13+. If your distro ships something older, you do not need a PPA — 2Database and cacheCreate the role and database WireGUI will own. Valkey needs no configuration for a single-host install; it just has to be listening. 3Install WireGUIA dedicated system user owns the code and runs the service. It needs no login shell and no home directory beyond the install path. Dependencies install from prebuilt wheels on glibc x86-64 and arm64. On musl distributions such as Alpine, 4ConfigurationEvery setting is an environment variable with the /etc/wiregui/wiregui.env Lock the file down. It holds the database password and the key that encrypts stored secrets: Leave The full variable list is in the configuration reference below. 5Kernel forwardingA VPN server routes between the tunnel and everything else, so forwarding has to be on. This is per network namespace: setting it on an LXC host does not set it inside the container. 6Migrations and first runAlembic reads Run this once before the first start, and again after every upgrade. The service itself does not migrate — only the Docker image does that on boot. 7systemd unitWireGUI needs /etc/systemd/system/wiregui.service Do not put wg0 under a host network manager. systemd-networkd, NetworkManager and dhcpcd will happily claim an interface they did not create and strip its addresses. WireGUI restores them periodically and logs a warning when it has to, but the fix is to exclude 8VerifyAll four should succeed. Admin → Diagnostics shows the same state from the UI, including the live ruleset. Put a reverse proxy in front for TLS — seeDeployment for nginx and Caddy configs. LXC containersAn LXC container shares the host kernel, so WireGuard works from inside it as long as the host provides the module and the container is allowed to run its own network namespace. This is the normal case on Proxmox: an unprivileged container is enough — it holds On the host, onceInside the container, checkRun these before installing anything. If the first one fails, the host is missing the module or the container profile blocks it, and no amount of WireGUI configuration will help. Proxmox notes
Virtual machinesA VM has its own kernel, so there is no host to coordinate with: steps 1–8 above are the whole install. Two things still bite people. The hypervisor may filter Routing traffic for the tunnel subnet means emitting packets with source addresses that are not the VM's own. Anti-spoofing or MAC filtering on the virtual NIC will silently drop them — on VMware disable MAC address changes and forged transmits, on Proxmox leave the firewall's IP filter off for that interface. MTU WireGUI hands clients an MTU of 1280, which is conservative enough for nested tunnels and most overlay networks. If your path is clean you can raise it, but 1280 is the safe default and rarely worth changing. UpgradingThe database is the source of truth and the interface is rebuilt from it on every start, so an upgrade is a pull, a sync, a migration and a restart. Peers, rules and keys all live in PostgreSQL. That dump is the backup — there is no separate WireGuard state to preserve. Troubleshooting
Still stuck? Open an issue on GitHubwith the output of the four verification commands above. DocumentationEverything you need to deploy and configure WireGUI. See the full wiki for detailed guides. AuthenticationMultiple authentication methods can be used individually or in combination. Local AuthenticationDefaultDefault email/password login. Can be disabled when SSO is configured. OpenID ConnectSSOIntegrate with Okta, Auth0, Keycloak, Azure AD, Google Workspace, or any OIDC-compliant provider. SAML 2.0SSOEnterprise single sign-on with auto-provisioning and metadata configuration. Magic LinksPasswordlessPasswordless email-based login. Requires SMTP configuration. TOTPMFATime-based one-time passwords. Compatible with Google Authenticator, Authy, 1Password. WebAuthnMFAHardware security keys (YubiKey) and platform authenticators (Touch ID, Windows Hello). DeploymentWireGUI is distributed as a Docker image. Migrations run automatically on startup. Reverse Proxy (nginx)Reverse Proxy (Caddy)Caddy handles TLS certificates and WebSocket proxying automatically. BackupThe database is the single source of truth. WireGuard interface state is fully reconciled from the database on startup. docker compose exec postgres pg_dump -U wiregui wiregui > backup.sqlLAN-to-Peer RoutingWhen "Allow local network to reach peers" is enabled in Admin → Rules → Network Policies, WireGUI configures its firewall to accept traffic from your LAN to VPN peers. However, your LAN'sdefault gateway (router) also needs a static route so it knows to send traffic destined for the WireGuard subnet to the WireGUI server instead of out to the internet. Without this route, LAN devices can't reach VPN peers even if the policy is enabled — the router will forward WireGuard-subnet traffic to its WAN gateway where it gets dropped. The static route tells the router: "to reach the VPN subnet, forward packets to the WireGUI server." In the examples below, we use the default WireGUI subnets and assume the WireGUI server's LAN IP is
Linux GatewayRun on the gateway, or add to To persist with netplan: Generic Router (Web UI)Most consumer and business routers have a static routes section under Advanced or Routing.
MikroTik / RouterOSUbiquiti / EdgeOS / VyOSOPNsense / pfSenseNavigate to System → Routes → Configuration and add a new gateway and route.
Cisco IOSVerificationFrom any LAN device, confirm the route is working: If the traceroute shows your WAN gateway instead of the WireGUI server, the static route is missing or not applied. Configuration ReferenceAll settings use the
REST APIFull programmatic access via Create a device Generate API tokens from theAccount Settingspage. Tokens use the EndpointsAll endpoints require API token authentication GET /api/healthno authGET /api/v0/users/List all users POST /api/v0/users/Create user GET /api/v0/devices/List all devices POST /api/v0/devices/Create device GET /api/v0/rules/List firewall rules POST /api/v0/rules/Create rule GET /api/v0/configuration/Get configuration PUT /api/v0/configuration/Update configuration + PUT, DELETE for each resource Against enshittificationThis project exists because infrastructure software should serve its users, not its investors. Too many VPN tools have been enshittified — features locked behind paid tiers, telemetry quietly added, self-hosting made deliberately painful. WireGUI is AGPL-licensed specifically to prevent this. If you run it, you own it. If you modify it and offer it as a service, you share the source. No bait-and-switch, no open-core grift, no "community edition" that mysteriously lacks the features you actually need. Software that manages your network traffic should be fully transparent and fully yours. Built withNiceGUIFastAPISQLModelPostgreSQLValkeyAlembicauthlib + webauthnWireGuardnftablesPython 3.13 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |