一、引言
对于许多中小团队、开发者或实验室环境而言,购买昂贵的商业VPN网关并非首选。我们通常已经拥有性能强大的本地工作站或服务器,存放着核心代码、数据和测试环境。能否将这些本地资源安全、便捷地开放给远程团队成员访问呢?
传统方案可能是在路由器上配置端口转发,但这需要公网IP,并会将内网服务直接暴露在公网上,面临安全风险。而直接在云上搭建VPN,虽然管理方便,但所有访问云下本地设备的流量都需要经过云服务器中转,会产生不必要的带宽费用和延迟。
本教程将介绍一种 “鱼与熊掌兼得” 的创新方案:核心VPN服务(Pritunl)部署在您本地的强大工作站上,通过轻量级的FRP内网穿透工具,借助阿里云ECS提供的稳定公网入口,安全地将其服务能力发布到互联网。 这样,远程员工只需连接到一个统一的云上地址,即可直接接入您办公室或实验室的本地网络,访问其中的设备,实现真正意义上的“远程局域网”体验。
1. 方案架构
本方案的核心思想是:“服务在身边,入口在云端”。它巧妙地将服务主体与访问入口分离,兼顾了成本、性能和安全性。
1)核心组件与角色:
本地工作站:
- 角色:整个VPN体系的核心。
- 运行服务:
- Pritunl Server:提供专业的OpenVPN/WireGuard接入服务,管理用户认证和VPN IP分配。
- FRP Client:作为内网穿透的主动发起方。
阿里云ECS:
- 角色:提供稳定、可靠的公网访问入口。
- 运行服务:
- FRP Server:接收FRP Client的连接,建立加密隧道,并将外部对特定端口的访问转发到本地Pritunl服务。
FRP(Fast Reverse Proxy):
- 角色:连接云端与本地的“安全信使”。它避免了在本地网络进行复杂的端口转发,实现了“服务隐藏”。

2)整体数据流如下:
- 准备阶段:本地工作站上的FRP客户端主动连接到云ECS上的FRP服务端,建立一条稳定的加密隧道。
- 连接阶段:远程用户配置Pritunl客户端,连接至云ECS服务器的公网IP和FRP映射的端口(例如,
your-ecs-ip:11940)。 - 阶段:ECS上的FRP服务端收到VPN连接请求后,通过已建立好的隧道,将该请求无缝转发给本地工作站的Pritunl服务。
- 接入阶段:远程用户通过Pritunl的身份验证后,成功接入本地工作站所在的物理网络,获取到一个该内网的IP地址(如
192.168.1.x)。 - 访问阶段:此时,远程用户如同直接坐在办公室的局域网内一样,可以直接访问网络中的其他设备,如NAS(
192.168.1.10)、开发服务器(192.168.1.20)或打印机等。
3) 架构优势:
- 成本极低:云ECS仅需最基础的配置(1核1G),仅作为流量入口,消耗资源极少。
- 性能无损:访问本地设备时,数据在远程用户和本地网络间直接路由(通过VPN隧道),不经过ECS中转,避免了云服务带宽费用和延迟。
- 安全性高:本地网络无需配置公网IP或端口转发,所有服务都被FRP隧道保护起来,外部无法直接扫描到Pritunl服务.
2. 为何选择Pritunl?
在本架构中,Pritunl的价值不仅在于其自身强大,更在于它与FRP结合的可行性。一个命令行操作的OpenVPN服务器很难通过FRP稳定地暴露出去,而Pritunl解决了这个难题。
| 特性 | 传统方案(纯CLI OpenVPN) | 本方案(Pritunl + FRP) | 本方案的优势 |
|---|---|---|---|
| 内网穿透适配性 | 配置复杂,需要通过脚本处理IP转发和路由,与FRP结合难度高 | Web界面统一配置路由,与FRP无缝集成,只需转发VPN端口即可 | 极大地简化了穿透部署,使“本地VPN上云”成为可能 |
| 运维管理 | 需SSH到本地工作站,通过命令行管理证书和用户,非常不便 | 无论身处何地,都能通过Web界面管理本地VPN。用户配置可通过链接分发,体验堪比商业VPN | 实现了本地服务的远程化管理,运维效率飞跃式提升 |
| 用户体验 | 需要为每个用户手动分发证书文件,体验差且不安全 | 管理员在Web界面创建用户后,可直接生成预配置链接或二维码,用户一键导入 | 提供了现代化、友好的用户接入流程,降低培训成本 |
| 状态可视性 | 需要登录服务器查看日志,无法实时了解谁在连接 | 提供清晰的实时连接监控面板,在线用户、流量、连接时长一目了然 | 让运维状态透明化,快速响应问题 |
| 安全与灵活性 | 证书管理繁琐,吊销需要维护CRL列表 | 支持数据库后端、OAuth2集成,可以方便地启用双因素认证(2FA),轻松管理用户生命周期 | 为企业级安全要求提供了便捷的实现路径 |
二、部署详解
1. ECS部署Frps服务
- Github克隆或下载frp:
https://github.com/fatedier/frp
- 编辑配置文件:
# nano frp_0.65.0_linux_amd64/frps.toml
# 服务绑定的IP与端口
bindAddr = "0.0.0.0"
bindPort = 8888
# web dashboard配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin@123"
# token权限验证,需与客户端配置一致,随机的、足够长的字符串
auth.method = "token"
auth.token = "Q5-CzF2v-GkVXylfpTBqpjoJdB71wyYWSGV4yzyM7Gw"
# 日志配置
log.to = "/root/frp_0.65.0_linux_amd64/logs/frps.log"
log.level = "info"
log.maxDays = 3
- 编辑service文件,实现开机自启动:
# nano /etc/systemd/system/frps.service
[Unit]
# 服务名称
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令 您的frps的安装路径
ExecStart = /root/frp_0.65.0_linux_amd64/frps -c /root/frp_0.65.0_linux_amd64/frps.toml
[Install]
WantedBy = multi-user.target
- 启动frps service:
systemctl daemon-reload
systemctl start frps
systemctl enable frps
注意: ECS防火墙需开放8888端口,安全组开放8888端口
2. 本地安装MongoDB和Pritunl
# 添加 MongoDB 源
sudo tee /etc/apt/sources.list.d/mongodb-org.list << EOF
deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse
EOF
# 添加 Pritunl 源
sudo tee /etc/apt/sources.list.d/pritunl.list << EOF
deb [ signed-by=/usr/share/keyrings/pritunl.gpg ] https://repo.pritunl.com/stable/apt noble main
EOF
# 添加 OpenVPN 源
sudo tee /etc/apt/sources.list.d/openvpn.list << EOF
deb [ signed-by=/usr/share/keyrings/openvpn-repo.gpg ] https://build.openvpn.net/debian/openvpn/stable noble main
EOF
# 安装并启动服务
sudo apt --assume-yes install gnupg
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor --yes
curl -fsSL https://swupdate.openvpn.net/repos/repo-public.gpg | sudo gpg -o /usr/share/keyrings/openvpn-repo.gpg --dearmor --yes
curl -fsSL https://raw.githubusercontent.com/pritunl/pgp/master/pritunl_repo_pub.asc | sudo gpg -o /usr/share/keyrings/pritunl.gpg --dearmor --yes
sudo apt update
sudo apt --assume-yes install pritunl openvpn mongodb-org
sudo systemctl start pritunl mongod
sudo systemctl enable pritunl mongod
3. Web登录并初始化
访问
https://192.168.1.88/setup获取初始化密钥:
sudo pritunl setup-key # 填入setup key完成数据库初始化获取默认用户名和密码登录:
sudo pritunl default-password # 根据username和password登录web,然后填入ECS的公网IP和新密码完成初始化

- 添加组织:
Users->Add Organization

- 添加用户
Users->Add User

4. Server配置
- 添加server
Servers->Add Server ,其中port为你的frpc客户端转发的端口。

- 添加route
Servers->Add Route,其中network为你内网设备的IP段

5. 本地Frpc配置
- 编辑frpc.toml配置文件:
# nano frp_0.65.0_linux_amd64/frpc.toml
#配置公网服务器上frp服务的IP与端口
serverAddr = "xxx.xxx.xxx.xxx"
serverPort = 8888
#日志配置
log.to = "/root/frp_0.65.0_linux_amd64/logs/frpc.log"
log.level = "info"
log.maxDays = 3
#token权限验证,需与服务端配置一致
auth.method = "token"
auth.token = "Q5-CzF2v-GkVXylfpTBqpjoJdB71wyYWSGV4yzyM7Gw"
#面板相关配置
webServer.port = 7200
webServer.user = "admin"
webServer.password = "admin"
#代理配置
[[proxies]]
name = "gz_vpn_admin" #名称
type = "tcp" #代理类型
localIP = "127.0.0.1" #本地IP
localPort = 13204 #内网服务监听的端口
remotePort = 13204 #需要在公网服务器上监听的端口
注意: ECS防火墙开放13204端口,安全组开放13204端口
- 启动frpc服务:
# cat /etc/systemd/system/frpc.service
[Unit]
# 服务名称
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frpc的命令 您的frpc的安装路径
ExecStart = /home/snpbio/frp_0.65.0_linux_amd64/frpc -c /home/snpbio/frp_0.65.0_linux_amd64/frpc.toml
[Install]
WantedBy = multi-user.target
# frpc开机自启
systemctl daemon-reload
systemctl start frpc
systemctl enable frpc
6. 远程测试
1)安装OpenVPN客户端:
https://openvpn.net/client/
2)从本地的Pritunl Web下载用户的配置文件:

3)解压下载的tar文件,打开OpenVPN客户端导入.ovpn:

输入创建用户时设置的PIN登录
提示连接成功!

三、ENJOY
教程到这,我们已经成功地将本地的强大工作站,通过FRP这把“神奇的钥匙”,变成了一个拥有云上公网入口的专业级VPN网关。这个方案架构最大限度地利用了现有资源:本地工作站的算力和云服务器的网络可达性。
本方案的核心价值:
- 资源最大化:无需购买专用VPN硬件,将已有的高性能本地工作站物尽其用。
- 成本最优化:云服务器仅作为入口,配置要求低,有效控制云端开支。
- 访问直接化:远程用户直接接入目标局域网,访问延迟低,体验流畅。
- 管理现代化:通过Pritunl的Web界面,像管理云服务一样管理您部署在本地的VPN。