frp 用於內網穿透的基本設定和使用

2022-06-03 15:00:11

frp 用於內網穿透的基本設定和使用

今天是端午節,先祝端午安康!

frp 是一個專注於內網穿透的高效能的反向代理應用,支援 TCP、UDP、HTTP、HTTPS 等多種協定。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。

本文就以 設定 frp,使得可以從外網存取內網遠端桌面(埠號 3389)為最終目標 展開。使用的公網伺服器作業系統為 CentOS 7.6,內網的機器作業系統為 Windows 10。存取 frp 的網站以下載對應作業系統和架構的程式。另外不要忘記在內網機器上設定「允許遠端連線」哦。

frps

frp 的伺服器端,用於部署在公網的伺服器上,與內網通訊轉發流量,下載程式後自帶了組態檔 frps.ini

frp 組態檔如下:

[common]
bind_port = 7000
log_file = ./frps.log
token = nihaonihao123123

bind_port 表示監聽在伺服器原生的埠log_file 表示紀錄檔檔案位置token 表示密碼 (只有在 frpc 中設定相同的密碼才能連線該 frps)

設定完成後可以使用 ./frps -c ./frps.ini 啟動(如果沒有執行許可權,可使用 chmod a+x frps賦予其許可權後再執行)

註冊為 systemctl 服務

首先建立 systemctl 組態檔frps.service

[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
WorkingDirectory=/root/FRP
ExecStart = /root/FRP/frps -c /root/FRP/frps.ini

[Install]
WantedBy = multi-user.target

其中 WorkingDirectoryExecStart 要改為 frps 程式所在的路徑。需要注意的是,由於在 frps 的組態檔中 log_file 使用了相對路徑,因此需要要指定 WorkingDirectory。

執行如下命令以註冊並啟動 frps 服務:

cp /PATH_TO_FILE/frps.service /etc/systemd/system
systemctl enable frps
systemctl start frps

可以使用 netstat -lntup | grep 7000 (即 frp 組態檔中設定的埠)檢視服務是否成功啟動。

至此,伺服器端的服務設定完成~

frpc

frp 的使用者端,部署在需要穿透出去的內網機器上。啟動後會與上面的伺服器端通訊,告訴他該怎麼轉發我 frpc 的流量(也就是我們要做的設定了)。下載程式後自帶了組態檔 frpc.ini(注意與上面的 frps.ini 區分)。

設定如下:

[common]
server_addr = 124.223.177.47
server_port = 7000
log_file = .\\frps.log
token = nihaonihao123123

[LBWNB]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6135

common 項中設定的是伺服器端的資訊,注意 Linux 和 Windows 下的路徑分隔符不同,Windows 下由於 「\」 會跳脫因此需要兩個 「\」

下面的一個項中是自定義的一個名字(不能與其它 frpc 重複),type 表示通訊協定型別,local_ip 表示監聽內網機器原生的地址(將資料轉發到這個地址上),local_port 表示監聽內網機器原生的埠號,remote_port告知遠端伺服器,我這個 frpc 要通過(伺服器上的)這個埠與外界通訊,請它在伺服器上監聽。

設定完成後可以使用 ./frpc -c ./frpc.ini 啟動。

註冊為 Windows 服務

起初使用了 sc create,不僅沒有服務描述,還總是啟動失敗。感覺這個命令似乎有點過於簡單,甚至有點過時了。後改用 WinSW

WinSW 的組態檔命名比較奇怪。需要與可執行檔名一致,如我的 exe 檔案為 WinSW-x64.exe,組態檔名就一定要為 WinSW-x64.xml。好處似乎是,可以將 WinSW-x64.exe 隨意命名,如 NiHao.exe ,組態檔名為 NiHao.xml 即可。
本來以為第二個引數可以任意指定組態檔的名稱,嘗試了數次。最後參考了WinSW組態檔的官方檔案,第二個引數為 path,只是路徑,不是檔名,好吧。

將組態檔改為如下(自行替換為實際路徑):

<service>
  <id>my_frpc</id>
  <name>frpC</name>
  <description>frp 使用者端程式,用於對映至外網</description>
  <executable>C:\MY\PATH\TO\frpc\frpc.exe</executable>
  <arguments>-c frpc.ini</arguments>
</service>

似乎無需顯式指定工作路徑也可以正常列印紀錄檔,如需指定,可以使用 <workingdirectory> 標籤

執行一下 install 和 start 命令即可註冊和啟動 frpc 服務。

.\WinSW-x64.exe install
.\WinSW-x64.exe start

對應的,停止和刪除可以執行 stop, uninstall。

可以使用 netstat -ano | findstr 7000 檢查是否與伺服器端建立了連線(Linux 和 Windows 下的 netstat 引數也不太相同)。

至此,伺服器端的服務設定完成~ 此時可以使用 遠端桌面應用 在 網際網路上存取內網機器了。

圖為在 Android 手機上進行遠端桌面

後記

nssm 似乎也可以用來方便地註冊 Windows 服務,沒有嘗試,可以參考文章:註冊frpc為windows服務,可在未登入使用者時啟動將frpc註冊成windows系統服務

可以在微軟的遠端桌面使用者端頁面對應跳轉下載。居然還有 Android 或 IOS 的遠端桌面應用,在緊急情況下用用吧QAQ。

沒想到的是,週末剛剛部署好,現在就用上了——突然通知線上有個樣式的問題。心想直接用這個試試吧。結果還是有點卡的(伺服器頻寬為6M,像是當前網路的問題)。直接遠端寫程式碼還是夠嗆,而且很多圖示背景還是黑色,估計是檔案資源管理器 explorer.exe 的bug了。最後在本地下載程式碼寫好後,拷貝到遠端再編譯釋出。最為詭異的是,我第二天回到公司開啟電腦,右下角的圖示還是模模糊糊的,就像前一天弱網環境下遠端一樣0.0。

後來嘗試在網路環境較好的時候,體驗還是不錯的。

參考

frp中文站

windows下基於frp的內網穿透部署

frp 內網穿透遠端桌面(Windows 10)設定

WINDOWS將FRP設定為服務並開機自啟

如何線上下載Google Play裡面的應用

apkpure(用於下載 Google Play 的 Android 應用)