管理整个组织内的 VPN 用户不应该再像 2005 年那样了。不再需要使用包含凭据的电子表格、手动配置文件,也不再需要费心去了解“现在谁在线?”。
OpenVPN Manager——一个开源的 Web 应用程序,它为您的 VPN 基础架构带来现代化的用户管理;同时发布的还有OpenVPN Client——一个配套工具,它可以将所有内容无缝集成。

问题
如果你曾经为团队管理过 OpenVPN 服务器,你就会了解这些痛点:
- 用户管理一片混乱——添加用户意味着生成证书、编辑配置,还要祈祷别搞砸了什么。
- 完全看不到任何信息——谁在线?带宽使用情况如何?连接历史记录?祝你好运,希望能找到答案。
- 访问控制难题——工程部门和人力资源部门需要不同的网络访问权限,但 OpenVPN 并没有简化这一过程。
- 审计要求——当安全部门询问“谁在何时访问了什么?”时,您可能需要花费数小时翻阅日志。
- 承包商访问权限——本应过期但从未过期的临时用户。
解决方案:两个项目,一个完整系统
OpenVPN 管理器(Web 应用程序)
整个系统的核心。一个基于网页的管理面板,您可以在这里管理所有事项:

基于角色的访问控制的用户管理
三个角色确保一切井然有序:
- 用户——可以查看和编辑自己的个人资料
- 管理员——可以创建和管理团队中的用户
- 管理员——拥有所有权限
非常适合团队负责人需要管理团队的 VPN 访问权限,而又不想麻烦 IT 部门的组织。


基于组的网络访问
定义用户组(例如工程组、人力资源组、财务组),并为每个用户分配网络段。用户继承其所属用户的访问权限。简单、可扩展且可审计。


VPN IP 自动分配
只需配置一次 VPN 网络范围,系统就会自动为新用户分配下一个可用的 IP 地址。从此告别 IP 地址冲突和手动追踪。

会话跟踪与审核
最后,了解您的 VPN 信息:
- 实时连接状态
- 用户带宽使用情况
- 完整的连接历史记录
- 所有变更的完整审计跟踪


限时访问
需要授予承包商两周的访问权限?设置日期valid_from即可valid_to。访问权限会自动过期。再也不用担心忘记登录了。
OpenVPN客户端(集成脚本)
将你的 OpenVPN 服务器连接到管理器的 Go 二进制文件:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ OpenVPN 服务器 │─────────────▶│ OpenVPN 客户端 │────▶│ OpenVPN 管理器
│ │ │ │ (Go 二进制文件) │ │ (Web 应用) │
└─────────────────┘ └───────────────────┘ └───────────────────┘
│
▼
┌───────────────────┐
│ nftables/iptables
│ │ (防火墙) │
└─────────────────┘
四个二进制文件处理所有事情:
BinaryPurpose 功能openvpn-login包括:根据 API 验证用户凭据openvpn-connect;分配 IP 地址;根据组成员身份推送路由openvpn-disconnect;记录会话结束和流量统计信息;openvpn-firewall为每个用户生成 nftables/iptables 规则。
完整安装指南
步骤 1:安装 OpenVPN 管理器
选项 A:DEB 软件包(Debian/Ubuntu)
VERSION="1.0.1"
wget https://github.com/tldr-it-stepankutaj/openvpn-mng/releases/download/v${VERSION}/openvpn-mng_${VERSION}_linux_amd64.deb
sudo dpkg -i openvpn-mng_${VERSION}_linux_amd64.deb
选项 B:RPM 软件包(RHEL/AlmaLinux/Rocky)
VERSION="1.0.1"
wget https://github.com/tldr-it-stepankutaj/openvpn-mng/releases/download/v${VERSION}/openvpn-mng_${VERSION}_linux_amd64.rpm
sudo dnf install ./openvpn-mng_${VERSION}_linux_amd64.rpm
选项 C:Docker
docker pull tldrit/openvpn-mng:latest
步骤 2:配置数据库
# PostgreSQL
sudo -u postgres psql
CREATE USER openvpn WITH PASSWORD 'your-secure-password';
CREATE DATABASE openvpn_mng OWNER openvpn;
\q
步骤 3:配置 OpenVPN 管理器
# 生成密钥
JWT_SECRET=$(openssl rand -hex 32)
VPN_TOKEN=$(openssl rand -hex 32)
echo "JWT_SECRET: $JWT_SECRET"
echo "VPN_TOKEN: $VPN_TOKEN"
# 编辑配置文件
sudo nano /etc/openvpn-mng/config.yaml
关键设置:
database:
type: "postgres"
host: "localhost"
password: "your-db-password"
database: "openvpn_mng"
auth:
jwt_secret: "your-generated-jwt-secret"
api:
vpn_token: "your-generated-vpn-token"
vpn:
network: "10.90.90.0/24"
server_ip: "10.90.90.1"
步骤 4:启动 OpenVPN 管理器
sudo systemctl enable --now openvpn-mng.service
# 验证
curl http://localhost:8080/
默认登录名:admin/ admin123— 请立即更改!
步骤 5:安装 OpenVPN 客户端
选项 A:DEB 软件包(Debian/Ubuntu)
VERSION="1.0.0"
wget https://github.com/tldr-it-stepankutaj/openvpn-client/releases/download/v${VERSION}/openvpn-client_${VERSION}_linux_amd64.deb
sudo dpkg -i openvpn-client_${VERSION}_linux_amd64.deb
选项 B:RPM 软件包(RHEL/AlmaLinux/Rocky)
VERSION="1.0.0"
wget https://github.com/tldr-it-stepankutaj/openvpn-client/releases/download/v${VERSION}/openvpn-client_${VERSION}_linux_amd64.rpm
sudo dnf install ./openvpn-client_${VERSION}_linux_amd64.rpm
选项 C:从源代码构建
git clone https://github.com/tldr-it-stepankutaj/openvpn-client.git
cd openvpn-client
make build-linux
sudo make install
步骤 6:配置 OpenVPN 客户端
sudo mkdir -p /etc/openvpn/client
sudo nano /etc/openvpn/client/config.yaml
api:
base_url: "http://127.0.0.1:8080"
token: "your-vpn-token-from-step-3"
timeout: 10s
openvpn:
session_dir: "/var/run/openvpn"
firewall:
type: "nftables"
nftables:
rules_file: "/etc/nftables.d/vpn-users.nft"
reload_command: "/usr/sbin/nft -f /etc/sysconfig/nftables.conf"
步骤 7:配置 OpenVPN 服务器
添加到您的 OpenVPN 服务器配置中:
# VPN network (must match OpenVPN Manager config)
server 10.90.90.0 255.255.255.0
topology subnet
# Authentication via OpenVPN Manager
username-as-common-name
auth-user-pass-verify /usr/bin/openvpn-login via-file
client-connect /usr/bin/openvpn-connect
client-disconnect /usr/bin/openvpn-disconnect
script-security 2
步骤 8:设置防火墙规则定时任务
# 创建初始规则
sudo mkdir -p /etc/nftables.d
sudo touch /etc/nftables.d/vpn-users.nft
sudo /usr/bin/openvpn-firewall
# 添加 cron 任务
echo "*/5 * * * * root /usr/bin/openvpn-firewall >> /var/log/openvpn-firewall.log 2>&1" | sudo tee /etc/cron.d/openvpn-firewall
步骤 9:重启 OpenVPN
sudo systemctl restart openvpn@server
这一切是如何协同运作的
- 用户使用用户名和密码连接
- openvpn-login使用 Manager API 验证凭据
- openvpn-connect获取用户的组和网络,然后推送路由
- 防火墙规则根据用户的组成员身份限制流量
- 会话在管理器数据库中进行跟踪。
- 管理员可在网页界面查看实时连接。
- openvpn-disconnect 会在用户断开连接时记录流量统计信息。
技术栈
OpenVPN 管理器:
- Go + Gin 框架
- GORM(PostgreSQL/MySQL)
- JWT 身份验证
- Bootstrap 5 Web UI
OpenVPN客户端:
- Go
- nftables/iptables 支持
- 结构化日志记录(slog)
两者都编译成单个二进制文件,可以部署到任何地方。
接下来是什么?
计划功能:
- LDAP/Active Directory 集成
- 双因素身份验证
- WireGuard 支持
- 普罗米修斯指标
- Terraform 提供程序
开始使用
OpenVPN 管理器:
OpenVPN客户端:
这两个项目均采用 Apache 2.0 许可协议。欢迎贡献代码!
如果您厌倦了传统的 VPN 用户管理方式,不妨试试这个方法。如果您觉得它有用,请在 GitHub 上点个星标,非常感谢!
原文:https://medium.com/@stepan_95301/openvpn-manager-a-complete-open-source-solution-for-enterprise-vpn-management-fe214b8f4627