背景
創(chuàng)業(yè)公司為節(jié)約運(yùn)維成本,往往把應(yīng)用服務(wù)放在阿里云等平臺(tái)上。除了對(duì)外服務(wù),公司還存在一些對(duì)內(nèi)的測試環(huán)境、監(jiān)控等服務(wù),如果這些內(nèi)部服務(wù)同時(shí)也有外網(wǎng)訪問的需求。直接用云平臺(tái)構(gòu)建也蠻省事,但對(duì)于初創(chuàng)公司而言,會(huì)是一筆不小的成本。本文章將介紹一種更好的方式:基于frp開源工具,構(gòu)建一個(gè)外網(wǎng)可訪問的內(nèi)網(wǎng)穿透環(huán)境。
前提條件
外網(wǎng)可訪問,必須要有一個(gè)外網(wǎng)的固定ip。這個(gè)ip可以是運(yùn)營商安裝網(wǎng)絡(luò)時(shí)給的(一般運(yùn)營商網(wǎng)絡(luò)多是浮動(dòng)ip,要固定網(wǎng)絡(luò)ip需額外掏錢購買),也可以是一臺(tái)阿里云服務(wù)器(云服務(wù)器上有綁定對(duì)外的固定ip)。本文以一臺(tái)阿里云主機(jī)作為內(nèi)網(wǎng)穿透的跳板接入入口。即構(gòu)建環(huán)境必須滿足以下兩個(gè)條件:
- 一臺(tái)阿里云主機(jī)
- 內(nèi)網(wǎng)環(huán)境至少一臺(tái)機(jī)器能訪問外網(wǎng)(運(yùn)營商網(wǎng)絡(luò)可以是浮動(dòng)ip)
方案原理
以阿里云主機(jī)作為外網(wǎng)訪問的跳板入口,通過內(nèi)網(wǎng)穿透工具frp,轉(zhuǎn)發(fā)請(qǐng)求到內(nèi)網(wǎng)環(huán)境,以達(dá)到內(nèi)網(wǎng)環(huán)境服務(wù)對(duì)外開放的目的。其中云主機(jī)上需安裝frp內(nèi)網(wǎng)穿透server端,公司內(nèi)網(wǎng)環(huán)境安裝frp client端,依靠frp server 到 client的連接作為內(nèi)外網(wǎng)數(shù)據(jù)交換的通道。
frp地址
frp官方地址:
GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
frp下載地址:
Releases · fatedier/frp · GitHub
安裝
Frp使用Go語言開發(fā),支持linux、window、mac等操作系統(tǒng)。安裝非常方便,選擇平臺(tái)下載相應(yīng)安裝包,解壓即可使用。本文以Linux centos系統(tǒng)為例介紹。
安裝目錄執(zhí)行以下命令:
wget https://github.com/fatedier/frp/releases/download/v0.31.0/frp_0.31.0_linux_amd64.tar.gz
tar xzvf frp_0.31.0_linux_amd64.tar.gz
mv frp_0.31.0_linux_amd64 frp
cd frp目錄

其中frps前綴是服務(wù)端相關(guān)文件,frpc前綴為客戶端相關(guān)文件。
服務(wù)端配置
編輯服務(wù)端frps.ini配置文件
vi frps.ini

bind_port:frps服務(wù)端監(jiān)聽端口,用于frpc客戶端建立連接時(shí)使用。
vhost_http_port:http訪問監(jiān)聽端口,可根據(jù)需要自行調(diào)整其他端口。
vhost_https_port:https訪問監(jiān)聽端口,可根據(jù)需要自行調(diào)整其他端口。
subdomain_host:子域名地址定義。用于服務(wù)端請(qǐng)求域名地址轉(zhuǎn)發(fā),如***.com
dashboard:一個(gè)簡單的frp服務(wù)監(jiān)控面板設(shè)置。
注意:以上配置端口,在云主機(jī)上需開放對(duì)應(yīng)端口訪問權(quán)限,否則服務(wù)將無法正常訪問。
完成配置后,啟動(dòng)frps服務(wù)
nohup ./frps -c frps.ini &
客戶端配置
編輯frpc.ini客戶端配置

server_addr:frps服務(wù)端ip地址,對(duì)應(yīng)云主機(jī)外網(wǎng)訪問ip地址。
server_port:對(duì)應(yīng)frps服務(wù)端監(jiān)聽端口,這里7000與上一步配置端口對(duì)應(yīng)。
[web]:轉(zhuǎn)發(fā)規(guī)則配置分組。
type:協(xié)議類型。http或https等。
local_port:請(qǐng)求轉(zhuǎn)發(fā)端口。
subdomain:請(qǐng)求轉(zhuǎn)發(fā)子域名域名地址。frps.ini文件subdomain_host定義了***.com子域名,這里實(shí)際對(duì)應(yīng)test.***.com格式的域名請(qǐng)求地址。
注意:以上配置端口,需開放防火墻對(duì)應(yīng)端口限制,否則訪問可能失敗。
完成配置后,啟動(dòng)frpc服務(wù)
nohup ./frpc -c frpc.ini &
小結(jié)
完成以上步驟,內(nèi)網(wǎng)服務(wù)器上啟動(dòng)相關(guān)服務(wù)。瀏覽器訪問test.***.com域名服務(wù),即可在外網(wǎng)訪問內(nèi)部服務(wù)。
本文介紹了內(nèi)網(wǎng)穿透工具frp的使用背景,構(gòu)建方式。通過簡單的frp服務(wù)端和客戶端配置,實(shí)現(xiàn)了內(nèi)網(wǎng)服務(wù)的外網(wǎng)域名訪問。實(shí)際frp的實(shí)現(xiàn)遠(yuǎn)遠(yuǎn)不止http/https域名的穿透訪問,它也支持ssh、tcp、udp等路由功能,有興趣的小伙伴可以自行參考官網(wǎng)介紹。這里僅做拋磚引玉,歡迎一起深入討論。