概述
最近一年的時間里,我所做的兩個項目的服務和一個游戲服務器(后面簡稱:項目應用)需要公開到公網上,由於我家的寬帶並沒有公網IP地址並且也無法申請到動態的公網IP,因此需要一個軟件或者是協議將服務和游戲掛到公網上。
早期有了解過 Apache 和 Nginx 可以實現反向代理,利用 SSH 連接的方式將項目應用連接至服務器,並實現從公網訪問。但多次發現SSH的連接並不穩定,就算安裝了 autossh 插件也會經常出現斷連的情況。因此在大半年的時間里,在有動態公網的環境下嘗試使用過 DDOS服務,還有許多許多其他的方式,例如:編寫Python腳本實時監測連接狀態,在更換IP地址的時候強制更新代理的地址,或者是采用P2P的方式,客戶機和服務器直連,效果都不盡人意。
因此需要換其他的方式來將項目應用掛在公網上,於是乎采用 FRP 也就是FRP內網穿透工具來將項目應用掛在公網上。
什么是 FRP
FRP 是一個可用於內網穿透的,對外網提供服務的高性能反向代理應用,支持 tcp, http, https 等協議類型,並且 web 服務支持根據域名進行路由轉發。
准備工作
在搭建一個完整的 FRP 服務之前,我們需要提前准備一些東西:
- 具有公網IP地址的雲主機(例如:阿里雲的ECS)或者是一台VPS;
- 具有公網IP地址的主機盡量安裝Ubuntu或者是Linux;
- 在公網的主機要經過工信部備案,否則容易被查水表;
- 本地的網絡要具備相對良好的網絡環境(下行 300Mbps 上行 30Mbps最佳,最低上行測試不要低於5Mbps);
- 本地的主機要安裝Windows操作系統;
- 要有一些簡單的Linux命令基礎(例如cd ls cp tar之類的簡單命令即可);
FRP服務之服務器端設置
首先,我們先從 FRP 的 Github 地址下載用於服務器端的安裝包,Github Releases 頁面,截止編寫該文檔,官方已經更新到0.39.0版本。
這里選擇linux_amd64.tar.gz
下載即可。通過FTP上傳到 /usr/local
目錄下。
進入到該目錄下,可以看到下面這個樣子:
紅色的就是我們的壓縮包,接着我們來解壓
tar -xvf frp_0.39.0_linux_amd64.tar
解壓完成之后可以看到左邊有一個不帶有任何后綴的文件夾,我們來cd進入文件夾。
可以看到文件夾目錄如下所示:
frp_0.39.0_linux_amd64
|- frpc
|- frpc_full.ini
|- frpc.ini
|- frps
|- frps_full.ini
|- frps.ini
|- LICENSE
|- systemd
服務器端只需要編輯frps.ini
,我們可以用vim打開也可以使用FTP下載到本地之后使用VSCode打開。
默認的狀態下是
[common]
bind_port = 7000
[common]
代表這部分是必須有的,bind_port
這個端口是用來設定 FRP 服務端端口的,我這里設定的是17465
端口
[common]
bind_port = 17465
你也可以加上token
來進行簡單的身份驗證,不然誰都可以用你的這台服務器做內網穿透。
服務器端作為服務端,可以刪掉一些不必要的客戶端文件,以免以后啟動的時候選錯配置文件。
rm -f frpc
rm -f frpc.ini
我們為了能讓服務在關掉SSH連接之后依然能夠運行,需要讓服務在后台運行。這里使用screen
指令,這個模塊Ubuntu本身是不涵蓋的,需要自行安裝:
apt-get update
在Update完成之后進行安裝
apt-get install screen
這個時候就已經安裝完成了。這里放幾個常用的screen
指令:
screen -S name 啟動一個名字為name的screen
screen -S name -X quit 刪除某個session
screen -ls 是列出所有的screen
screen -r name或者id 可以回到某個screen了(如不行先detached: screen -d name)
鍵盤 ctrl + a + d 可以回到前一個screen,當時在當前screen運行的程序不會停止
我們新建一個screen
screen -S frps
然后進入到 FRP 目錄里,輸入下面的指令啟動服務
./frps -c ./frps.ini
服務成功啟動!
這個時候鍵盤按下ctrl + a + d
返回,之后就可以退出SSH了,而程序並不會因此中斷。
FRP服務之客戶端設置
首先,我們先從 FRP 的 Github 地址下載用於客戶端的安裝包,Github Releases 頁面,截止編寫該文檔,官方已經更新到0.39.0版本。
這里選擇windows_amd64.zip
即可,然后將文件解壓到一個你中意的文件夾內,注意文件夾層次別太深。
客戶端只需要配置frpc
相關的文件,這里打開frpc.ini
,我的配置如下
[common]
server_addr = x.x.x.x
server_port = 17465
[minecraft]
type = tcp
local_ip = 127.0.0.1
local_port = 25565
remote_port = 17778
上述的配置需要與服務端的配置相吻合
[common]
中的server_addr
填寫的是剛才服務端的IP地址,server_port
填寫的是服務端的bind_port
。
[minecraft]
中的local_port
填寫的是ssh的端口,remote_port
則是遠程連接時要輸入的端口,通過frp服務映射到local_port
。
保存配置,在文件夾里打開cmd.exe
,然后輸入下面的命令啟動客戶端。
frpc.exe -c frpc.ini
這個時候應該能在服務端看到下面的字樣,表示連接成功。紅色部分是打碼。
方便客戶端啟動,寫了一個簡單的bat
文件,命名為frp-client.bat
,內容如下
@echo off
@title frp client service
frpc.exe -c frpc.ini
pause
保存雙擊啟動之后,點擊最小化即可,frp
服務就啟動了。
那些所謂的“坑”
無法連接到服務器或者從外網無法訪問?
請檢查Ubuntu的防火牆是否為開啟狀態,若開啟,請開放端口。若開放了端口或者沒有開啟防火牆,請登錄雲服務提供商的平台檢查服務商的防火牆有無出入站端口設置。如果沒有設置端口,請進行設置。
如果還是不行,請檢查客戶端電腦的防火牆出入站設置。