前言
僅供自己學習記錄
一、簡介
1.1 簡述
- frp 是一個開源、簡潔易用、高性能的內網穿透和反向代理軟件,支持 tcp, udp, http, https等協議,最牛逼最好用的完全開源的內網穿透工具frps。frp是實現內網穿透的C/S架構軟件,滿足在外網環境下使用內網服務的需求
1.2 原理如下圖
- 簡單解釋就是,A是公網服務器,B是內網服務器,C是個人用戶。A安裝frps服務端,B安裝frpc客戶端並指向A的IP端口,此時C想訪問B的內網服務,只需要訪問A的服務,A與B相互轉發,完成C訪問內網B。

二、安裝與使用
2.1 文件下載(這里需要注意的是,同一個文件夾就包含了同類型系統的服務端frps和客戶端frpc程序)
2.2 服務端安裝
- 將文件拷貝到服務器任意指定文件目錄,並解壓文件
tar -zxvf + 壓縮包文件名
2.3 修改服務端配置文件
- 2.3.1進入解壓的壓縮包內,編輯服務端配置文件
vim frps.ini
- 2.3.2 修改fprs.ini礎配置,並保存退出
[common]
# frp監聽的端口,默認是7000,可以改成其他的
bind_port = 7000
# 授權碼,請改成更復雜的,這個token之后在客戶端會用到
token = 52010
# frp管理后台端口,請按自己需求更改
dashboard_port = 7500
# frp管理后台用戶名和密碼,請改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
# [必須]標識頭
[common]
#服務監聽的ip
bind_addr = 0.0.0.0
#[必須]frp連接通訊口,用於和客戶端內網穿透傳輸數據的端口,可自定義。
bind_port = 7000
# 用於KCP協議UDP通訊端口,也可以和“bind_port”共用同一端口,如果沒有設置,則kcp在frps中被禁用,可自定義。
kcp_bind_port = 7000
# 以幫助使UDP打洞穿透NAT,可自定義。
bind_udp_port = 7001
#訪問web服務需要用到的端口,如果你想支持https,必須指定https端口監聽
vhost_http_port = 8001
#https需要用到的端口
vhost_https_port = 443
# 指定 Dashboard (frp管理后台端口)的監聽的 IP 地址
dashboard_addr = 0.0.0.0
#指定 Dashboard(frp管理后台端口) 的監聽的端口
dashboard_port = 7500
# 指定訪問 Dashboard(frp管理后台端口) 的用戶名
dashboard_user = admin
# 指定訪問 Dashboard (frp管理后台端口)的端口
dashboard_pwd = admin
#防止被隨意注冊,密鑰token,可以設置為更復雜的
token = 123456
# 心跳配置,默認的心跳配置時間是30,不建議修改
heartbeat_timeout = 30
#frp內網穿透服務端監聽的端口,如果不設置的話,所有端口都可以連接使用,但為為了不占用系統使用的端口號,限制只能使用服務端的指定端口,建議設置允許的堅挺端口,比如www.chuantou.org提供的內網穿透服務器就是開放50000-60000端口,
#
privilege_allow_ports = 2000-3000,3001,3003,4000-50000
#連接池的數量,如果frp內網穿透客戶端設置的連接池的數量大於下面的數值,就會修改frp客戶端的連接池為下面的數值
max_pool_count = 100
# 每個客戶端最大可以使用的端口,0表示無限制
max_ports_per_client = 0
# 每個內網穿透可以創建的連接池上限,避免大量資源占用。可自定義。
max_pool_count = 5
# frp內網穿透服務端frps和frp內網穿透的客戶端frpc兩台電腦的時間差,如果設置為0的話,不校驗時間差異,默認校驗時間差為900秒。
authentication_timeout = 900
# 是否使用tcp復用,默認為true;
# frp只對同意客戶端的連接進行復用;
tcp_mux = true
# 自定義二級域名,通過在 frps 的配置文件中配置 subdomain_host,就可以啟用該特性。之后在 frpc 的 http、https 類型的代理中可以不配置 custom_domains,而是配置一個 subdomain 參數。
只需要將 *.{subdomain_host} 解析到 frps 所在服務器。之后用戶可以通過 subdomain 自行指定自己的 web 服務所需要使用的二級域名,通過 {subdomain}.{subdomain_host} 來訪問自己的 web 服務。
subdomain_host = frps.com
# 日志的記錄級別,分為debug, info, warn, error四級,日志保存的天數,默認3天
# 日志存放路徑
log_file = ./log/frps.log
# 日志記錄類別
log_level = info
最多保存多少天日志,可自定義
log_max_days = 3
2.4 開放端口規則
- 2.4.1 如何是阿里雲或者騰訊雲,則需要打開上訴相應端口的入規則。如果是公網物理服務器,則需要開放相應防火牆端口,系統不一樣的自己修改指令,當然可以直接關閉防火牆。

# 添加監聽端口
sudo firewall-cmd --permanent --add-port=7000/tcp
# 添加管理后台端口
sudo firewall-cmd --permanent --add-port=7500/tcp
sudo firewall-cmd --reload
2.5 啟動frps服務
# 前台啟動
./frps -c ./frps.ini
# 后台啟動
./frps -c ./frps.ini &
# 查詢frp服務pid
ps -ef | grep frp
# 停止frp服務
kill -9 + pid
sudo mkdir -p /etc/frp
sudo cp frps.ini /etc/frp
sudo cp frps /usr/bin
sudo cp systemd/frps.service /usr/lib/systemd/system/
sudo systemctl enable frps
sudo systemctl start frps
2.6 運行驗證
- 啟動成功后,登錄frp管理后台,默認 IP:7500,admin/admin,即可查看服務啟動

2.7 客戶端的安裝
- 2.7.1 假設客戶端是內網的linux系統,將之前下載好的frp壓縮包拷入本地linux文件夾,並解壓縮
tar -zxvf + 壓縮包文件名
- 2.7.2 進入解壓縮文件夾,編輯客戶端配置文件
vim frpc.ini
- 2.7.3 修改fprc.ini基礎配置如下
# frpc.ini
[common]
server_addr = 服務器公網IP
server_port = 7000
token = 123456
[ssh] //名字跟下面的不能重復,否則會被覆蓋
type = tcp //協議
local_ip = 127.0.0.1 //相對客戶端的ip(如果是局域網內其它電腦,這里應該填寫局域網內的IP)
local_port = 22 //客戶端被映射的端口
remote_port = 6000 //服務器的端口
[mysql] //名字跟下面的不能重復,否則會被覆蓋
type = tcp //協議
local_ip = 127.0.0.1 //相對客戶端的ip(如果是局域網內其它電腦,這里應該填寫局域網內的IP)
local_port = 3306 //客戶端被映射的端口
remote_port = 3307 //服務器的端口
#[必須]標識頭
[common]
#外網服務器的IP地址
server_addr = 116.85.28.230
#外網服務監聽端口
server_port = 7000
#這個和服務端的token保持一致
token = 123456
# 客戶端日志
log_file = ./frpc.log # 指定日志文件;
log_level = info # 指定日志等級;
log_max_days = 3
# 設置管理地址,用於通過http api控制frpc的動作,如重新加載;
admin_addr = 127.0.0.1
admin_port = 7500
admin_user = admin
admin_passwd = admin
# 初始連接池的數量上限,默認為0;
#pool_count = 5
# 是否啟用tcp復用,默認為true;
tcp_mux = true
# 你的內網穿透名稱,將顯示為 {名稱}.{對應服務名稱}
# frpc的用戶名,用於區別不用frpc的代理;
# user = your_name
# 決定首次登錄失敗時是否退出程序,否則連續登錄到frps服務端,可選:false,true
login_fail_exit = true
# 用於連接服務器的協議,支持tcp、kcp、websocket;支持tcp和kcp,默認是tcp,注意:kcp需要服務端配置參數已開啟,才支持。
protocol = tcp
# 使用tcp流復用,默認為true,可選:false,true,必須與frps服務端已經配置參數相同,否則服務端沒有,可以不填此參數。
tcp_mux = true
# 為frp 客戶端指定一個單獨的DNS服務器;
#dns_server = 8.8.8.8
# 要啟用的代理的名字,默認為空表示所有代理;
# start = ssh,dns
# 心跳檢查
# heartbeat_interval = 30 # 失敗重試次數
# heartbeat_timeout = 90 # 超時時間
#TCP的配置隨便加
[ssh_01]
# 協議默認tcp,可選tcp,udp,http,https,stcp,xtcp;
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 22
# 在服務器端開啟的遠程端口;
remote_port = 8022
# 是否加密服務端和客戶端的通信信息,默認為不加密;
use_encryption = false
# 是否開啟壓縮,默認不開啟;
use_compression = false
# 負載均衡配置
#group = test_group # 負載均衡組名,會將同一組內的客戶端進行負載;
#group_key = 123456 # 負載均衡組密鑰;
[web2]
# 協議默認tcp,可選tcp,udp,http,https,stcp,xtcp;
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 80
# 在服務器端開啟的遠程端口;
remote_port= 8811
# 是否加密服務端和客戶端的通信信息,默認為不加密;
use_encryption = false
# 是否開啟壓縮,默認不開啟;
use_compression = false
# 負載均衡配置
#group = test_group # 負載均衡組名,會將同一組內的客戶端進行負載;
#group_key = 123456 # 負載均衡組密鑰;
#https和http 的端口在服務其上面已經定好了的,所以這里不能指定
[web]
type = https
local_ip = 127.0.0.1
local_port = 88
# 是否加密服務端和客戶端的通信信息,默認為不加密;
use_encryption = false
# 是否開啟壓縮,默認不開啟;
use_compression = true
# 訪問web頁面啟用認證,用戶名admin
http_user = admin
# 密碼
http_pwd = admin
# 子域名,需要服務端配置了subdomain_host參數;
#subdomain = web01
# web的域名,和subdomain二選一
custom_domains = fy2018.online
# 指定用於路由的URL前綴;
#locations = /,/pic
# 配置http包頭域名重寫;
host_header_rewrite = example.com
# 添加包頭信息X-From-Where: frp;
header_X-From-Where = frp
[web1]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = fy2018.online
- 2.7.4 如果開起了防火牆的,記得開放端口,如果沒開的就不用管,系統不一樣的自己修改指令
sudo firewall-cmd --permanent --add-port=6000/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
2.8 frp客戶端啟動運行
# 前台啟動
./frpc -c ./frpc.ini
# 后台啟動
./frpc -c ./frpc.ini &
2.9 驗證
- 2.9.1 前后端均正常啟動成功后,打開第三方ssh連接客戶端,連接公網IP:[映射端口],如47.55.66.88:6000,即可連接到B電腦ssh服務的22端口。
三、常見問題處理
3.1 frp異常