Frp的TCP模式問(wèn)題,這里主要存在2個(gè)問(wèn)題。
第一個(gè)是安全問(wèn)題:
試想一下,frp的tcp模式相當(dāng)于你的設(shè)備直接向公網(wǎng)暴露了一個(gè)tcp端口。任何設(shè)備都可以嘗試連接這個(gè)端口。這里就會(huì)有很大的安全風(fēng)險(xiǎn)。
第二個(gè)問(wèn)題是網(wǎng)絡(luò)問(wèn)題:
我的所有請(qǐng)求都需要進(jìn)行frp的服務(wù)器進(jìn)行中轉(zhuǎn),這里勢(shì)必會(huì)造成比較大的網(wǎng)絡(luò)延時(shí)。以及耗掉服務(wù)器流量,這對(duì)我們的服務(wù)響應(yīng)速度和經(jīng)濟(jì)價(jià)值會(huì)造成較大影響。
解決安全問(wèn)題(stcp)模式
對(duì)于安全問(wèn)題,frp的思路是,既然這些服務(wù)有可能被壞人攻擊,那我們只要限制特定設(shè)備能夠使用這個(gè)端口就好了。
那么問(wèn)題來(lái)了,我怎么知道哪些設(shè)備是允許使用的呢?
服務(wù)端配置?那就又陷入了內(nèi)網(wǎng)穿透的問(wèn)題。
最簡(jiǎn)單的方法是使用密鑰驗(yàn)證。這就是frp的Secret TCP(stcp)模式的思路。
如下圖所示,frp客戶端1需要暴露一個(gè)tcp端口。于是他在向服務(wù)端注冊(cè)時(shí),額外傳了一個(gè)密鑰。
所有其他設(shè)備期望訪問(wèn)這個(gè)端口,必須要先驗(yàn)證這個(gè)密鑰。
這樣一來(lái),我們就需要在發(fā)起請(qǐng)求的設(shè)備上也配置一個(gè)frp客戶端,通過(guò)這個(gè)客戶端帶著密鑰發(fā)起請(qǐng)求。
如何配置
服務(wù)端:配置仍然同默認(rèn)配置一致,直接運(yùn)行即可
客戶端1配置:需要將type改為stcp,并且增加一個(gè)sk字段。這里不需要遠(yuǎn)端端口,因?yàn)椴还_(kāi)
# frpc.ini 配置:
[common]
# 你的frp服務(wù)器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務(wù)器的默認(rèn)端口
server_port = 7000
[rdp]
type = stcp
# 只有 sk 一致的用戶才能訪問(wèn)到此服務(wù)
sk = abcdefg
local_ip = 127.0.0.1
# 遠(yuǎn)程桌面的本地端口號(hào)
local_port = 3389
客戶端2配置:
# frpc.ini
[common]
# 你的frp服務(wù)器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務(wù)器的默認(rèn)端口
server_port = 7000
[rdp_visitor]
type = stcp
# stcp 的訪問(wèn)者
role = visitor
# 要訪問(wèn)的 stcp 代理的名字
server_name = rdp
# 只有 sk 一致的用戶才能訪問(wèn)到此服務(wù)
sk = abcdefg
# 綁定本地端口用于訪問(wèn) 遠(yuǎn)程桌面 服務(wù)
bind_addr = 127.0.0.1
bind_port = 6000
此時(shí),你在客戶端2,使用127.0.0.1:6000即可訪問(wèn)客戶端1的遠(yuǎn)程服務(wù)。
解決網(wǎng)絡(luò)問(wèn)題(xtcp)模式
思考一下,我們的frp服務(wù)器主要目的是為了解決兩臺(tái)設(shè)備相互識(shí)別的情況。在正式運(yùn)行時(shí),其實(shí)并不需要服務(wù)端做什么事情。
frp客戶端就好比兩個(gè)相親的對(duì)象,frp服務(wù)端是媒婆。媒婆介紹完之后,就應(yīng)該有相親對(duì)象自己聊天了。
這個(gè)就是點(diǎn)對(duì)點(diǎn)模式(p2p)。在frp中,這個(gè)可以通過(guò)設(shè)置xtcp實(shí)現(xiàn)。
如何配置
服務(wù)端:配置需要增加一個(gè)udp端口 7001,增加完之后就是如下
# frps.ini
[common]
bind_port = 7000
bind_udp_port = 7001
客戶端1:配置需要將type改為xtcp即可
# frpc.ini
[common]
# 你的frp服務(wù)器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務(wù)器的默認(rèn)端口
server_port = 7000
[rdp]
type = xtcp
# 只有 sk 一致的用戶才能訪問(wèn)到此服務(wù)
sk = abcdefg
local_ip = 127.0.0.1
# 遠(yuǎn)程桌面的本地端口號(hào)
local_port = 3389
客戶端2:配置需要將type改為xtcp即可
# frpc.ini
[common]
# 你的frp服務(wù)器的公網(wǎng)ip
server_addr = x.x.x.x
# 你的frp服務(wù)器的默認(rèn)端口
server_port = 7000
[rdp_visitor]
type = xtcp
# stcp 的訪問(wèn)者
role = visitor
# 要訪問(wèn)的 stcp 代理的名字
server_name = rdp
# 只有 sk 一致的用戶才能訪問(wèn)到此服務(wù)
sk = abcdefg
# 綁定本地端口用于訪問(wèn) 遠(yuǎn)程桌面 服務(wù)
bind_addr = 127.0.0.1
bind_port = 6000
此時(shí),你在客戶端2,使用同樣的方式,以127.0.0.1:6000即可訪問(wèn)客戶端1的遠(yuǎn)程服務(wù)。
不過(guò)需要注意的是,目前frp的p2p服務(wù)還不完善,很多nat設(shè)備還是不能夠穿透的。
此時(shí)大家還是需要切換回stcp來(lái)使用。