一、frp 是什么?
frp 是一個專注於內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
二、frp的文檔
三、frp的代碼
https://github.com/fatedier/frp/
四、frp的下載
https://github.com/fatedier/frp/releases/tag/v0.33.0
一般選擇:
-
frp_0.33.0_linux_amd64.tar.gz
解壓之后frps開頭是服務端、frpc開頭的是客戶端,並包括各自的配置樣例文件。另外,systemd是啟動關閉服務用的。 -
frp_0.33.0_windows_amd64.zip
五、服務端配置要點
cp frps.ini /etc/frp/frps.ini
vim /etc/frp/frps.ini
========================================================================
[common]
bind_port = 7000
vhost_http_port = 8080
# 配置dashboard可以使用web界面管理frp
# 通過 http://[server_addr]:7500 訪問 Dashboard 界面,用戶名密碼默認都為 admin。
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
cp frps /usr/bin
cd systemd
cp frps.service /usr/lib/systemd/system
systemctl start frps.service
systemctl status frps.service
systemctl enable frps.service
六、客戶端配置要點
cp frpc.ini /etc/frp/frpc.ini
vim frpc.ini
==================================================================
[common]
server_addr=x.x.x.x # frps的地址
server_port=7000
[web]
type=http
local_ip=127.0.0.1
local_port=8080
custom_domains=a.domain.com
# 測試
./frpc -c frpc.ini
# 加入系統服務
cp frpc /usr/bin
cd systemd
cp frpc.service /usr/lib/systemd/system
systemctl start frpc.service
systemctl status frpc.service
systemctl enable frpc.service
七、Windows下如何注冊服務
下載winsw開源軟件注冊windows系統服務。
winsw的下載地址:https://github.com/winsw/winsw
下載好后把winsw.exe放在frpc的同級目錄並且編寫一個xml配置文件(myapp.xml)
<service>
<id>frp</id>
<name>frp這里是服務的名稱</name>
<description>這里是服務的介紹,隨便寫</description>
<executable>frpc</executable>這里是運行的軟件名
<arguments>-c frpc.ini</arguments>這里是運行的軟件配置文件
<onfailure action=”restart” delay=”60 sec”/>
<onfailure action=”restart” delay=”120 sec”/>
<logmode>reset</logmode>
</service>
然后以管理員啟動cmd命令窗口,cd到frp目錄,執行兩條命令winsw install和winsw start就行了。
如果要卸載先執行winsw stop再執行winsw uninstall。
八、為本地 HTTP 服務啟用 HTTPS
通過 https2http 插件可以讓本地 HTTP 服務轉換成 HTTPS 服務對外提供。
frps.ini 內容如下:
[common]
bind_port = 7000
frpc.ini 內容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[test_htts2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
# HTTPS 證書相關的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp
分別啟動 frps 和 frpc。
通過瀏覽器訪問 https://test.yourdomain.com。
九、安全地暴露內網服務
對於某些服務來說如果直接暴露於公網上將會存在安全隱患。
使用 stcp(secret tcp) 類型的代理可以避免讓任何人都能訪問到要穿透的服務,但是訪問者也需要運行另外一個 frpc 客戶端。
frps.ini 內容如下:
[common]
bind_port = 7000
在需要暴露到內網的機器上部署 frpc,且配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
在想要訪問內網服務的機器上也部署 frpc,且配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 綁定本地端口用於訪問 SSH 服務
bind_addr = 127.0.0.1
bind_port = 6000
通過 SSH 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@127.0.0.1
十、轉發 DNS 查詢請求
DNS 查詢請求通常使用 UDP 協議,frp 支持對內網 UDP 服務的穿透,配置方式和 TCP 基本一致。
frps.ini 內容如下:
[common]
bind_port = 7000
frpc.ini 內容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
這里反代了 Google 的 DNS 查詢服務器的地址,僅僅用於測試 UDP 代理,並無實際意義。
分別啟動 frps 和 frpc。
通過 dig 測試 UDP 包轉發是否成功,預期會返回 www.baidu.com 域名的解析結果。
dig @x.x.x.x -p 6000 www.baidu.com
十一、通過自定義域名訪問內網的 Web 服務
HTTP 類型的代理相比於 TCP 類型,不僅在服務端只需要監聽一個額外的端口 vhost_http_port 用於接收 HTTP 請求,還額外提供了基於 HTTP 協議的諸多功能。
修改 frps.ini 文件,設置監聽 HTTP 請求端口為 8080:
[common]
bind_port = 7000
vhost_http_port = 8080
修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port 為本地機器上 Web 服務監聽的端口, 綁定自定義域名為 custom_domains。
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
[web2]
type = http
local_port = 8080
custom_domains = www.yourdomain2.com
分別啟動 frps 和 frpc。
將 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 記錄解析到 IP x.x.x.x,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。或者可以通過修改 HTTP 請求的 Host 字段來實現同樣的效果。
通過瀏覽器訪問 http://www.yourdomain.com:8080 即可訪問到處於內網機器上 80 端口的服務,訪問 http://www.yourdomain2.com:8080 則訪問到內網機器上 8080 端口的服務。
十二、安全的SSH內網穿透案例
- frps的配置(代理服務器)
vim /etc/frp/frps.ini
===========================================================
[common]
bind_port = 7000
privilege_token = serverAuthKey
- frpc的配置(被代理的內網客戶端)
vim /etc/frp/frpc.ini
===========================================================
[common]
server_addr = 192.168.74.205
server_port = 7000
privilege_token = serverAuthKey
[secret_ssh]
type = stcp
sk = match2publicUserKey
local_ip = 127.0.0.1
local_port = 22
use_encryption = true
use_compression = true
- 公網用戶的frpc配置
vim /etc/frp/frpc.ini
===========================================================
[common]
server_addr = 192.168.74.205
server_port = 7000
[secret_ssh_visitor]
type = stcp
role = visitor
server_name = secret_ssh
sk = match2publicUserKey
bind_addr = 127.0.0.1
bind_port = 4567
啟動測試
./frpc -c ./frpc.ini
ssh -p 4567 bee@127.0.0.1
十三、Win10遠程桌面的代理
被代理的內網服務器 frpc.ini 內容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7002
遠端公網用戶mstsc,輸入x.x.x.x:7002即可內網穿透連接遠程桌面。