什麼是 frp
frp 全名 Fast Reverse Proxy,是用於提供內網穿透服務的工具,主要用於解決一些內網服務沒有公網 ip 但是卻需要提供外網訪問的問題。使用 frp 你可以將內網中的 TCP、UDP、HTTP、HTTPS 等協議類型的服務發布到公網,並且支持 Web 服務根據域名進行路由轉發。
為什麼要內網穿透
針對不同業務需求,總結為以下幾點:
- Web 項目對於電腦(伺服器)的性能(內存、CPU、硬盤和圖形運算等)要求比較高,需要部署在局域網性能較高的電腦上,且需求進行外網訪問。
- 搭建內網穿透小工具,服務於有項目部署需求但沒有伺服器(或公網 IP)的人群。
- 遠程桌面連接,當然這個需求可以使用很多遠程桌面軟體代替,但是如果要使用 Windows 遠程桌面連接公司電腦的話就需要內網穿透。
準備工作
在使用 frp 之前,需要一台有公網 IP 的伺服器(下文稱外網主機),一台需要實現內網穿透的機器(就是自己的電腦),SSH 工具,以及一個域名(如果只是建立 SSH 反向代理則不需要域名)。
伺服器是用來部署 frp 服務端,個人電腦用來實現內網穿透,SSH 工具是用來連伺服器,如果是 Windows Server 伺服器則使用 Windows 系統自帶的遠程桌面就可以。
如上圖的 frp 架構圖所示:
- (必須)想要使用 frp 服務,將內網中的服務發布到公網。你需要先擁有一台擁有公網 ip 的網絡設置搭建 frp 服務端,再在內網需要穿透的設置中搭建 frp 客戶端服務才能進行穿透。
- (非必需)你需要擁有一個域名解析到公網的 ip 地址,才能夠實現 web 服務的通過域名進行路由轉發的功能。
Frp 服務的搭建#
搭建 frp 很簡單,關鍵的步驟只有三步:
- 獲取 frp 文件
- 設置 frp 配置文件
- 啟動 frp 服務
注意:frp 搭建的這三步是分為客戶端和服務端的,但是操作基本是一致的。本教程 frp 服務的搭建主要介紹 frp 搭建的主要三步,以及 frp 服務端和客戶端配置文件內容的解釋說明,以及如何將 frp 在 linux 系統中創建 systemd 服務,進行服務管理。
第一步:獲取 frp 文件#
frp 支持 linux 平台和 windows 平台。參照你的設置的運行平台下載 linux 版本的文件或者是 windows 的。
下載地址:https://github.com/fatedier/frp/releases
一般 linux 平台下載的版本為:frp_版本號_linux_amd64.tar.gz
windows 平台下載的版本為:frp_版本號_windows_amd64.zip
linux 版本文件的解壓命令為tar zxvf 文件名
,windows 版本文件直接右鍵解壓即可。
文件解壓後,一般都含有 frps (frp 服務端運行文件)、frpc (frp 客戶端運行文件)、frps.ini (frp 服務端配置文件)、frpc.ini (frp 客戶端配置文件),以及 frp_full.ini (frp 全部配置文件解釋說明和參考。)
frp 配置文件分為服務端和客戶端,想要正常只用 frp 工具,我們需要對服務端和客戶端的配置文件分別進行設置。
- frps.ini(服務端)配置文件解釋說明:
[common]
bind_port = 7000
vhost_http_port = 8080
注:【bind_port】是 frp 客戶端連接服務端的端口,【vhost_http_port】是 http 訪問的端口(外網端口)。
- frpc.ini(客戶端)配置文件解釋說明:
[common]
server_addr = 127.0.0.1 #伺服器IP
server_port = 7000 #frp服務端端口地址
[web]
type = http
local_port = 8080 #本地項目端
custom_domains = test.frp.xxx.com #域名
第三步:啟動服務#
linux 環境下啟動服務,需要先把運行文件添加可執行權限。
例如我的文件實在 root 文件夾中,我需要搭建 frp 服務端,那麼待設置好服務端配置文件(frps.ini)後執行以下命令即可:
cd /root
chmod +x frps
nohup ./frps -c ./frps.ini &
執行成功後,會顯示 frp 的進程號碼。你也可以通過命令來查看 frps 運行的進程編號:ps -e | grep frps
。
在 windows 環境下則是以管理員身份運行 cmd 命令提示符。進入相應的目錄後,運行命令即可: frps -c frps.ini &
。
關於 frp 管理的優化設置#
注:現官方已提供 systemd 服務配置文件,可直接使用。
debian8.0,或者是 centos7.0 以上的版本,服務都是基於 systemd 的方式進行管理的。frp 通過設置後也可以實現 systemd 的方式進行管理,這樣我們就可以通過 systemctl 命令來進行服務的統一管理,同時通過這樣的設置也可以將 frp 服務加入開機自啟動。
- 將 frp 設置成 linux 系統的服務,基於 systemd 方式管理 編寫 frps.service 文件,以 centos7 為例:
nano /usr/lib/systemd/system/frps.service
內容如下:
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
[Install]
WantedBy=multi-user.target
編寫 frpc.service 文件,以 centos7 為例:
nano /usr/lib/systemd/system/frps.service
內容如下:
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini
[Install]
WantedBy=multi-user.target
- 將 frp 設置成開機自啟動
#frps
systemctl enable frps
systemctl start frps
#frpc
systemctl enable frpc
systemctl start frpc
Frp 到此就配置完了。
附:個人參考配置#
伺服器端:
[common]
bind_addr = 0.0.0.0 //綁定地址
bind_port = 8888 //TCP綁定端口
bind_udp_port = 8888 //UDP綁定端口
kcp_bind_port = 8888 //KCP綁定端口
vhost_http_port = 80 //HTTP代理端口
vhost_https_port = 443 //HTTPS代理端口
dashboard_addr = 0.0.0.0 //儀表盤地址
dashboard_port = 10000 //儀表盤端口
dashboard_user = admin //儀表盤用戶名
dashboard_pwd = admin //儀表盤密碼
token = 123456 //連接密碼
subdomain_host = test.com //子域名使用的主機名
客戶端:
[common]
server_addr = 172.16.100.100 //伺服器地址
server_port = 8888 //伺服器綁定端口
token = 123456 //特權模式密碼
tls_enable = true //加密傳輸
admin_addr = 127.0.0.1 //客戶端Web地址
admin_port = 7400 //Web訪問端口
admin_user = admin //Web訪問賬戶
admin_pwd = admin //Web訪問密碼
user = your_name //用戶名,設置後代理將顯示為 <用戶名.代理名>
[web] //服務名稱(自定義)
local_ip = 127.0.0.1 //本機ip
type = http //鏈路類型
local_port = 80 //本機端口
subdomain = web //服務端為test.com,故此處子域名為web.test.com
custom_domains = demo.com //自定義訪問域名,多個使用,分割
use_compression = true //使用壓縮
use_encryption = true //使用加密
[ssh]
local_ip = 127.0.0.1
type = tcp
local_port = 22
remote_port = 9000
use_compression = true
use_encryption = true
- 👻:具體參數請根據需要配置。