原文鏈接:https://www.aiprose.com/blog/17
本篇文章全程使用的案例域名是aiprose.com
frp 是一個(gè)可用于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 tcp, udp, http, https 協(xié)議。
frp 的作用
- 利用處于內(nèi)網(wǎng)或防火墻后的機(jī)器,對(duì)外網(wǎng)環(huán)境提供 http 或 https 服務(wù)。
- 對(duì)于 http, https 服務(wù)支持基于域名的虛擬主機(jī),支持自定義域名綁定,使多個(gè)域名可以共用一個(gè)80端口。
- 利用處于內(nèi)網(wǎng)或防火墻后的機(jī)器,對(duì)外網(wǎng)環(huán)境提供 tcp 和 udp 服務(wù),例如在家里通過(guò) ssh 訪問(wèn)處于公司內(nèi)網(wǎng)環(huán)境內(nèi)的主機(jī)。
開(kāi)發(fā)狀態(tài)
frp 仍然處于前期開(kāi)發(fā)階段,未經(jīng)充分測(cè)試與驗(yàn)證,不推薦用于生產(chǎn)環(huán)境。
master 分支用于發(fā)布穩(wěn)定版本,dev 分支用于開(kāi)發(fā),您可以嘗試下載最新的 release 版本進(jìn)行測(cè)試。
目前的交互協(xié)議可能隨時(shí)改變,不保證向后兼容,升級(jí)新版本時(shí)需要注意公告說(shuō)明同時(shí)升級(jí)服務(wù)端和客戶端。
架構(gòu)

使用示例
根據(jù)對(duì)應(yīng)的操作系統(tǒng)及架構(gòu),從 Release 頁(yè)面下載最新版本的程序。
將 frps 及 frps.ini 放到具有公網(wǎng) IP 的機(jī)器上。
將 frpc 及 frpc.ini 放到處于內(nèi)網(wǎng)環(huán)境的機(jī)器上。
centos64位下載amd64,我寫(xiě)文章的時(shí)候,最新版本是0.22
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
通過(guò) ssh 訪問(wèn)公網(wǎng)機(jī)器
- 修改 frps.ini 文件,這里使用了最簡(jiǎn)化的配置:
# frps.ini
[common]
bind_port = 7000
注意:7000端口要開(kāi)放
- 啟動(dòng) frps:
nohup ./frps -c ./frps.ini &
通過(guò) ssh 訪問(wèn)內(nèi)網(wǎng)機(jī)器
1.修改 frpc.ini 文件,假設(shè) frps 所在服務(wù)器的公網(wǎng) IP 為 x.x.x.x;
這里是指將內(nèi)網(wǎng)的22端口映射到公網(wǎng)的6000端口上
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
注意:公網(wǎng)服務(wù)器6000、7000端口要開(kāi)放
2.啟動(dòng) frpc:
nohup ./frpc -c ./frpc.ini &
3.上面是吧公網(wǎng)服務(wù)器的6000端口映射到內(nèi)網(wǎng)服務(wù)器的22端口,這樣就可以隨時(shí)使用ssh連接內(nèi)網(wǎng)服務(wù)器了。

通過(guò)自定義域名訪問(wèn)部署于內(nèi)網(wǎng)的 web 服務(wù)
有時(shí)想要讓其他人通過(guò)域名訪問(wèn)或者測(cè)試我們?cè)诒镜卮罱ǖ?web 服務(wù),但是由于本地機(jī)器沒(méi)有公網(wǎng) IP,無(wú)法將域名解析到本地的機(jī)器,通過(guò) frp 就可以實(shí)現(xiàn)這一功能,以下示例為 http 服務(wù),https 服務(wù)配置方法相同, vhost_http_port 替換為 vhost_https_port, type 設(shè)置為 https 即可。
- 修改 frps.ini 文件,設(shè)置 http 訪問(wèn)端口為 86,因?yàn)槲业?0端口用了nginx對(duì)外提供博客服務(wù),所以就使用86端口:
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 86
-
啟動(dòng) frps;
注意:如果之前啟動(dòng)過(guò),一定要關(guān)閉frps進(jìn)程
nohup ./frps -c ./frps.ini &
-
修改 frpc.ini 文件,假設(shè) frps 所在的服務(wù)器的 IP 為 x.x.x.x,local_port 為本地機(jī)器上 web 服務(wù)對(duì)應(yīng)的端口, 綁定自定義域名
frp.aiprose.com:這里相當(dāng)于把內(nèi)網(wǎng)服務(wù)器的80端口綁定到外網(wǎng)服務(wù)器的86端口上 ,這里我使用了二級(jí)域名,其實(shí)也沒(méi)有必要配置,只是為了區(qū)分,后面會(huì)有二級(jí)泛域名的配置
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = frp.aiprose.com
-
啟動(dòng) frpc:
注意:如果之前啟動(dòng)過(guò),一定要關(guān)閉frpc進(jìn)程
nohup ./frpc -c ./frpc.ini &
- 將
frp.aiprose.com的域名 A 記錄解析到 IPx.x.x.x,如果服務(wù)器已經(jīng)有對(duì)應(yīng)的域名,也可以將 CNAME 記錄解析到服務(wù)器原先的域名。

- 通過(guò)瀏覽器訪問(wèn)
http://frp.aiprose.com:86即可訪問(wèn)到處于內(nèi)網(wǎng)機(jī)器上的 web 服務(wù)。

自定義二級(jí)域名
在多人同時(shí)使用一個(gè) frps 時(shí),通過(guò)自定義二級(jí)域名的方式來(lái)使用會(huì)更加方便。
通過(guò)在 frps 的配置文件中配置 subdomain_host,就可以啟用該特性。之后在 frpc 的 http、https 類型的代理中可以不配置 custom_domains,而是配置一個(gè) subdomain 參數(shù)。
只需要將 *.{subdomain_host} 解析到 frps 所在服務(wù)器。之后用戶可以通過(guò) subdomain 自行指定自己的 web 服務(wù)所需要使用的二級(jí)域名,通過(guò) {subdomain}.{subdomain_host} 來(lái)訪問(wèn)自己的 web 服務(wù)。
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 86
subdomain_host = aiprose.com
將泛域名 *.aiprose.com 解析到 frps 所在服務(wù)器的 IP 地址。
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
subdomain = frp
frps 和 frpc 都啟動(dòng)成功后,通過(guò) http://frp.aiprose.com:86 就可以訪問(wèn)到內(nèi)網(wǎng)的 web 服務(wù)。如果你的vhost_http_port是80,就訪問(wèn)http://frp.aiprose.com
需要注意的是如果 frps 配置了 subdomain_host,則 custom_domains 中不能是屬于 subdomain_host 的子域名或者泛域名。
同一個(gè) http 或 https 類型的代理中 custom_domains 和 subdomain 可以同時(shí)配置。
這里只用到了一些常用的,frp還有好多功能,具體請(qǐng)參看文檔 點(diǎn)擊查看