為什么需要內網穿透功能
從公網中訪問自己的私有設備向來是一件難事兒。
自己的主力台式機、NAS等等設備,它們可能處於路由器后,或者運營商因為IP地址短缺不給你分配公網IP地址。如果我們想直接訪問到這些設備(遠程桌面,遠程文件,SSH等等),一般來說要通過一些轉發或者P2P組網軟件的幫助。
我有一台計算機位於一個很復雜的局域網中,我想要實現遠程桌面和文件訪問,目前來看其所處的網絡環境很難通過簡單的端口映射將其暴露在公網之中,我試過這么幾種方法:
- 遠程桌面使用TeamViewer。可用,但需要訪問端也擁有TeamViewer軟件,不是很方便,希望能使用Windows自帶的遠程桌面。且TeamViewer不易實現遠程文件訪問。
- 使用蒲公英VPN軟件進行組網,可用,但免費版本網絡速度極慢,體驗不佳,幾乎無法正常使用。
- 使用花生殼軟件進行DDNS解析,可用,但同第二點所述,免費版本有帶寬限制,無法實際使用。
- 搭建frp服務器進行內網穿透,可用且推薦,可以達到不錯的速度,且理論上可以開放任何想要的端口,可以實現的功能遠不止遠程桌面或者文件共享。
frp是什么
簡單地說,frp就是一個反向代理軟件,它體積輕量但功能很強大,可以使處於內網或防火牆后的設備對外界提供服務,它支持HTTP、TCP、UDP等眾多協議。我們今天僅討論TCP和UDP相關的內容。
截至本文完成,frp的最新版本為v0.22.0,本文使用最新版本。
准備工作
搭建一個完整的frp服務鏈,我們需要
- VPS一台(也可以是具有公網IP的實體機)
- 訪問目標設備(就是你最終要訪問的設備)
- 簡單的Linux基礎(會用cp等幾個簡單命令即可)
VPS相關
- 因為frp的原理是利用服務端(所准備的VPS)進行轉發,因而VPS的速度直接決定了之后連接的質量,請根據自己的需要選擇相應主機配置。
- 我使用了DigitalOcean的新加坡機房,北京移動、中國教育網下測試速度尚可。
- 系統使用Ubuntu 16.04.5 x64,frp客戶端和服務端本身同時均支持Linux和Windows,且配置方法一樣,請根據實際環境自行測試,如果你是新建的VPS,那選擇Ubuntu 16.04.5 x64就可以了。
服務端設置
SSH連接到VPS之后運行如下命令查看處理器架構,根據架構下載不同版本的frp
arch
查看結果,如果是“X86_64“即可選擇”amd64”,
運行如下命令,根據架構不同,選擇相應版本並進行下載
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
然后解壓
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
文件夾改個名,方便使用
cp -r frp_0.22.0_linux_amd64 frp
把解壓出來的文件夾復制到你想要的目錄下,為了方便我直接放在用戶目錄下了,進入該目錄
cd frp
查看一下文件
ls -a
我們只需要關注如下幾個文件
- frps
- frps.ini
- frpc
- frpc.ini
前兩個文件(s結尾代表server)分別是服務端程序和服務端配置文件,后兩個文件(c結尾代表client)分別是客戶端程序和客戶端配置文件。
因為我們正在配置服務端,可以刪除客戶端的兩個文件
rm frpc
rm frpc.ini
然后修改frps.ini文件
vim frps.ini
這個文件應有如下格式
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
如果沒有必要,端口均可使用默認值,token、user和password項請自行設置。
- “bind_port”表示用於客戶端和服務端連接的端口,這個端口號我們之后在配置客戶端的時候要用到。
- “dashboard_port”是服務端儀表板的端口,若使用7500端口,在配置完成服務啟動后可以通過瀏覽器訪問 x.x.x.x:7500 (其中x.x.x.x為VPS的IP)查看frp服務運行信息。
- “token”是用於客戶端和服務端連接的口令,請自行設置並記錄,稍后會用到。
- “dashboard_user”和“dashboard_pwd”表示打開儀表板頁面登錄的用戶名和密碼,自行設置即可。
- “vhost_http_port”和“vhost_https_port”用於反向代理HTTP主機時使用,本文不涉及HTTP協議,因而照抄或者刪除這兩條均可。
編輯完成后保存(vim保存如果不會請自行搜索)。
之后我們就可以運行frps的服務端了
./frps -c frps.ini
如果看到屏幕輸出這樣一段內容,即表示運行正常,如果出現錯誤提示,請檢查上面的步驟。
2019/01/12 15:22:39 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2019/01/12 15:22:39 [I] [service.go:172] http service listen on 0.0.0.0:10080
2019/01/12 15:22:39 [I] [service.go:193] https service listen on 0.0.0.0:10443
2019/01/12 15:22:39 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500
2019/01/12 15:22:39 [I] [root.go:210] Start frps success
此時訪問 x.x.x.x:7500 並使用自己設置的用戶名密碼登錄,即可看到儀表板界面
frp服務端儀表板界面
服務端后台運行
至此,我們的服務端僅運行在前台,如果Ctrl+C停止或者關閉SSH窗口后,frps均會停止運行,因而我們使用 nohup命令將其運行在后台。
nohup后台程序管理或關閉相關命令可自行查詢資料,上面這個連接中也有所提及。
nohup ./frps -c frps.ini &
輸出如下內容即表示正常運行
nohup: ignoring input and appending output to 'nohup.out'
此時可先使用Ctrl+C關閉nohup,frps依然會在后台運行,使用jobs命令查看后台運行的程序
jobs
在結果中我們可以看到frps正在后台正常運行
[1]+ Running nohup ./frps -c frps.ini &
此時訪問 x.x.x.x:7500 依然可以打開儀表板界面,至此,服務端即設置完成,你可以關閉SSH窗口了。
客戶端設置
frp的客戶端就是我們想要真正進行訪問的那台設備,大多數情況下應該會是一台Windows主機,因而本文使用Windows主機做例子;Linux配置方法類似,不再贅述。
同樣地,根據客戶端設備的情況選擇相應的frp程序進行下載,Windows下下載和解壓等步驟不再描述。
假定你下載了“frp_0.22.0_windows_amd64.zip”,將其解壓在了C盤根目錄下,並且將文件夾重命名為“frp”,可以刪除其中的frps和frps.ini文件。
用文本編輯器打開frpc.ini,與服務端類似,內容如下。
[common]
server_addr = x.x.x.x
server_port = 7000
token = won517574356
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
[smb]
type = tcp
local_ip = 127.0.0.1
local_port = 445
remote_port = 7002
其中common字段下的三項即為服務端的設置。
- “server_addr”為服務端IP地址,填入即可。
- “server_port”為服務器端口,填入你設置的端口號即可,如果未改變就是7000
- “token”是你在服務器上設置的連接口令,原樣填入即可。
自定義規則
frp實際使用時,會按照端口號進行對應的轉發,原理如下圖所示。
frp的原理
上面frpc.ini的rdp、smb字段都是自己定義的規則,自定義端口對應時格式如下。
- “[xxx]”表示一個規則名稱,自己定義,便於查詢即可。
- “type”表示轉發的協議類型,有TCP和UDP等選項可以選擇,如有需要請自行查詢frp手冊。
- “local_port”是本地應用的端口號,按照實際應用工作在本機的端口號填寫即可。
- “remote_port”是該條規則在服務端開放的端口號,自己填寫並記錄即可。
RDP,即Remote Desktop 遠程桌面,Windows的RDP默認端口是3389,協議為TCP,建議使用frp遠程連接前,在局域網中測試好,能夠成功連接后再使用frp穿透連接。
SMB,即Windows文件共享所使用的協議,默認端口號445,協議TCP,本條規則可實現遠程文件訪問。
配置完成frpc.ini后,就可以運行frpc了
frpc程序不能直接雙擊運行!
使用命令提示符或Powershell進入該目錄下
cd C:\frp
並執行
./frpc -c frpc.ini
運行frpc程序,窗口中輸出如下內容表示運行正常。
2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0]
2019/01/12 16:14:56 [I] [proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb]
2019/01/12 16:14:56 [I] [control.go:143] [smb] start proxy success
2019/01/12 16:14:56 [I] [control.go:143] [rdp] start proxy success
不要關閉命令行窗口,此時可以在局域網外使用相應程序訪問 x.x.x.x:xxxx (IP為VPS的IP,端口為自定義的remote_port)即可訪問到相應服務。
客戶端后台運行及開機自啟
frpc運行時始終有一個命令行窗口運行在前台,影響美觀,我們可以使用一個批處理文件來將其運行在后台,而且可以雙擊執行,每次打開frpc不用再自己輸命令了。
在任何一個目錄下新建一個文本文件並將其重命名為“frpc.bat”,編輯,粘貼如下內容並保存。
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frp
frpc -c frpc.ini
exit
將cd后的路徑更改為你的frpc實際存放的目錄。
之后直接運行這個 .bat 文件即可啟動frpc並隱藏窗口(可在任務管理器中退出)。
至於開機啟動,把這個 .bat 文件直接扔進Windows的開機啟動文件夾就好了 :)
至此,客戶端配置完成,之后就是你自己根據需要在frpc.ini后追加規則即可。
強烈建議你在使用frp直接測試內網穿透前,先在局域網內測試好相關功能的正常使用,並配置好可能會影響的Windows防火牆等內容,在內網調試通過后再使用frp進行內網穿透測試。