管理整个组织内的 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

这一切是如何协同运作的

  1. 用户使用用户名和密码连接
  2. openvpn-login使用 Manager API 验证凭据
  3. openvpn-connect获取用户的组和网络,然后推送路由
  4. 防火墙规则根据用户的组成员身份限制流量
  5. 会话在管理器数据库中进行跟踪。
  6. 管理员可在网页界面查看实时连接。
  7. 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