Frp的TCP模式問題,這里主要存在2個問題。
第一個是安全問題:
試想一下,frp的tcp模式相當于你的設(shè)備直接向公網(wǎng)暴露了一個tcp端口。任何設(shè)備都可以嘗試連接這個端口。這里就會有很大的安全風險。
第二個問題是網(wǎng)絡(luò)問題:
我的所有請求都需要進行frp的服務器進行中轉(zhuǎn),這里勢必會造成比較大的網(wǎng)絡(luò)延時。以及耗掉服務器流量,這對我們的服務響應速度和經(jīng)濟價值會造成較大影響。
解決安全問題(stcp)模式
對于安全問題,frp的思路是,既然這些服務有可能被壞人攻擊,那我們只要限制特定設(shè)備能夠使用這個端口就好了。
那么問題來了,我怎么知道哪些設(shè)備是允許使用的呢?
服務端配置?那就又陷入了內(nèi)網(wǎng)穿透的問題。
最簡單的方法是使用密鑰驗證。這就是frp的Secret TCP(stcp)模式的思路。
如下圖所示,frp客戶端1需要暴露一個tcp端口。于是他在向服務端注冊時,額外傳了一個密鑰。
所有其他設(shè)備期望訪問這個端口,必須要先驗證這個密鑰。
這樣一來,我們就需要在發(fā)起請求的設(shè)備上也配置一個frp客戶端,通過這個客戶端帶著密鑰發(fā)起請求。

如何配置
服務端:配置仍然同默認配置一致,直接運行即可
客戶端1配置:需要將type改為stcp,并且增加一個sk字段。這里不需要遠端端口,因為不公開
# frpc.ini 配置:
[common]
# 你的frp服務器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務器的默認端口
server_port = 7000
[rdp]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
# 遠程桌面的本地端口號
local_port = 3389
客戶端2配置:
# frpc.ini
[common]
# 你的frp服務器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務器的默認端口
server_port = 7000
[rdp_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = rdp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
# 綁定本地端口用于訪問 遠程桌面 服務
bind_addr = 127.0.0.1
bind_port = 6000
此時,你在客戶端2,使用127.0.0.1:6000即可訪問客戶端1的遠程服務。

解決網(wǎng)絡(luò)問題(xtcp)模式
思考一下,我們的frp服務器主要目的是為了解決兩臺設(shè)備相互識別的情況。在正式運行時,其實并不需要服務端做什么事情。
frp客戶端就好比兩個相親的對象,frp服務端是媒婆。媒婆介紹完之后,就應該有相親對象自己聊天了。
這個就是點對點模式(p2p)。在frp中,這個可以通過設(shè)置xtcp實現(xiàn)。
如何配置
服務端:配置需要增加一個udp端口 7001,增加完之后就是如下
# frps.ini
[common]
bind_port = 7000
bind_udp_port = 7001
客戶端1:配置需要將type改為xtcp即可
# frpc.ini
[common]
# 你的frp服務器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務器的默認端口
server_port = 7000
[rdp]
type = xtcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
# 遠程桌面的本地端口號
local_port = 3389
客戶端2:配置需要將type改為xtcp即可
# frpc.ini
[common]
# 你的frp服務器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務器的默認端口
server_port = 7000
[rdp_visitor]
type = xtcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = rdp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
# 綁定本地端口用于訪問 遠程桌面 服務
bind_addr = 127.0.0.1
bind_port = 6000
此時,你在客戶端2,使用同樣的方式,以127.0.0.1:6000即可訪問客戶端1的遠程服務。
不過需要注意的是,目前frp的p2p服務還不完善,很多nat設(shè)備還是不能夠穿透的。
此時大家還是需要切換回stcp來使用。