FRP指定訪問者:安全地暴露內(nèi)網(wǎng)服務(wù)
之前的教程介紹的frp內(nèi)網(wǎng)穿透都是用tcp模式,但是tcp模式是直接把端口映射到公網(wǎng)IP上,很容易被掃描爆破,還是存在一定的風(fēng)險(xiǎn)。我們可以使用frp提供的stcp模式來避免公開暴露端口,要求訪問者運(yùn)行一個(gè)frpc作為身份認(rèn)證和流量轉(zhuǎn)發(fā),把訪問者的本地端口綁定到內(nèi)網(wǎng)frpc服務(wù)上。不再公開映射內(nèi)網(wǎng)frpc端口。
frps配置
作為中間傳輸?shù)姆?wù)器端的frps配置不變,參考之前的文章,如果想自定義其他端口,注意兩端的frpc中的"server_addr"、"server_port"參數(shù)要一致。frps用到的端口要在防火墻或者寶塔那里放行。
frps.ini
- [common]
- bind_port = 7100
- token=12310086N
- dashboard_port = 7501
- dashboard_user = admin
- dashboard_pwd = admin123
客戶端
stcp模式的演示,我們以windwos的遠(yuǎn)程桌面為例,不再直接把內(nèi)網(wǎng)的3389端口映射到公網(wǎng)IP的端口上,而是通過stcp模式指定驗(yàn)明訪問者分身,要求訪問者也要運(yùn)行一個(gè)frpc 作為身份校驗(yàn)和流量轉(zhuǎn)發(fā),讓訪問者把訪問本地端口的請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)機(jī)器上。
frpc兩端分為外部的"控制端"和處于內(nèi)網(wǎng)中的"受控端"。
內(nèi)網(wǎng)中的受控端
編輯 fcpc.ini文件。服務(wù)[secret_rdp]之類的服務(wù)名可以自定義,見名知意即可。
- [common]
- server_addr = 服務(wù)器ip
- server_port = 7100
- token=12310086N
- [secret_rdp]
- type = stcp
- sk = 58iD9tfjPIHQ0dWO
- local_ip = 127.0.0.1
- local_port = 3389
- frpc.exe -c frpc.ini
外網(wǎng)的控制端
編輯 fcpc.ini文件,服務(wù)[secret_rdp_visitor]之類的服務(wù)名可以自定義,見名知意即可。
- [common]
- server_addr = 服務(wù)器ip
- server_port = 7100
- token=12310086N
- [secret_rdp_visitor]
- type = stcp
- role = visitor
- sk = 58iD9tfjPIHQ0dWO
- server_name = secret_rdp
- bind_addr = 127.0.0.1
- bind_port = 30009
- frpc.exe -c frpc.ini
牽線成功
兩端都顯示連接成功了,frp的在線面板里也看到stcp中多了"secret_rdp"一個(gè)連接記錄。

控制端啟動(dòng)連接成功時(shí)候也會(huì)看到frps出現(xiàn)連接成功的日志。
連接
我們在外網(wǎng)的控制端,打開遠(yuǎn)程桌面,輸入 "127.0.0.1:30009",就彈出來連接成功的登錄界面了。
原 理
原理兩端的frpc啟用的stcp模式,就是要求frps把一端訪問本地端口的請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)frpc上。一端必須運(yùn)行訪客模式的frpc表明身份才會(huì)被frps接納再轉(zhuǎn)發(fā)。
受控端
受控端中frpc讀取配置文件:
- “[secret_rdp]”服務(wù)中,以stcp模式,把受控端本地的3389轉(zhuǎn)發(fā)到服務(wù)器的frps上。
- "sk"是stcp服務(wù)的密鑰,兩端中的"sk"不匹配,不允許連接。
- 受控端stcp模式以服務(wù)名的形式匹配連接,不需要映射到公網(wǎng)IP的端口上,也不再需要remote_port。
控制端
控制端中的配置:
- [secret_rdp_visitor]服務(wù)中"role=visitor"是指定本機(jī)的服務(wù)為"訪問者"的stcp模式。
- "sk"密鑰。
- 控制端中的“server_name”是指定要連接的受控端中的服務(wù)名,服務(wù)名必須一致。
- 控制端中的"bind_addr"必須是"127.0.0.1"。
- "bind_addr"、"bind_port"這兩個(gè)參數(shù)是指本地端口。指定本地frpc轉(zhuǎn)發(fā)要通過frps和受控端連接的本地端口。
流程
- frps啟動(dòng),等著兩端frpc的stcp轉(zhuǎn)發(fā)配置。
- 受控端frpc啟動(dòng),讀取配置文件:服務(wù)名[secret_rdp]以stcp模式,將本地的3389端口轉(zhuǎn)發(fā)到frps上。
- 控制端frpc讀取配置文件和frps連接。
- 控制端frpc的配置指定"sk"密鑰和受控端的服務(wù)名,要frps把控制端本地30009端口和受控端的[secret_rdp]服務(wù)綁定上。
- 控制端訪問本地30009端口,請求被控制端的frpc轉(zhuǎn)發(fā)到frps上,frps再將請求轉(zhuǎn)發(fā)到受控端的[secret_rdp]服務(wù)上。
- 受控端[secret_rdp]服務(wù)里也指明了受控端哪些端口來接收響應(yīng)處理被轉(zhuǎn)發(fā)請求。
總 結(jié)
流程就是frpc指定使用stcp訪問,要求校驗(yàn)正確身份和服務(wù)名后再轉(zhuǎn)發(fā)請求,把訪問者的本地端口綁定到內(nèi)網(wǎng)frpc服務(wù)上。不再直接把受控端映射到公網(wǎng)端口上,也避免因?yàn)楣_被掃描爆破的風(fēng)險(xiǎn),安全的暴露內(nèi)網(wǎng)服務(wù)。表達(dá)水平有限,多讀幾遍上面的步驟,就是把訪問者的本地端口綁定到內(nèi)網(wǎng)frpc服務(wù)上,這一套下來比較繞,如果沒看懂,照著教程操作一次,理解了就豁然開朗了。同時(shí)也可以著手實(shí)踐安全的暴露其他的內(nèi)網(wǎng)服務(wù),比如MySQL:指定控制端訪問本地的33306端口的響應(yīng)由內(nèi)網(wǎng)的MySQL 3306響應(yīng)。
本文轉(zhuǎn)載自微信公眾號(hào)「Linux就該這么學(xué)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Linux就該這么學(xué)公眾號(hào)。