一、引言
對於許多中小團隊、開發者或實驗室環境而言,購買昂貴的商業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。