利用 FRP 來實現內網穿透

FRP 是一個在 Github 上的專案,他可以幫助在內網或是防火牆後端的電腦,提供對外網的 TCP 或是 UDP 服務。而我認為FRP提供的平台相當廣泛,他也支援 arm64,也就是可以使用樹莓派來當作伺服器端,相當方便。
Github 網址:https://github.com/fatedier/frp

前置作業

你需要有一台具有公網 IP 的電腦,這個電腦可以是從 Public Cloud 上面租來的,又或者是買一台樹莓派放在可以提供公網IP的地方。

若你要使用 Public Cloud 的主機:

建議可以使用 Google Cloud Platform ,因為他在彰化線西鄉有機房,可以提供較低的延遲。
而目前 Microsoft Azure 也正在台灣蓋機房,或許可以期待一下。
而 Amazon Web Services 目前離台灣最近的機房是香港或日本,延遲可能較高,遊戲類服務可能要稍微注意,是這三大 Public Cloud 中最不推薦的。

操作環境

先說明一下這篇教學文章的環境,伺服器端會使用 Ubuntu 來操作,用戶端則是使用較為大宗的 Windows。
伺服器端是放在我家,使用中華電信的網路,以 PPPoE 取得 IP 位址。 用戶端則是學校宿舍的電腦,學校網路是個 NAT 網路,並沒有配給學生獨立 IP 位址,超級不方便,有點肚爛 (偷罵w
而這篇文章是示範從宿舍電腦開 Minecraft 伺服器,並通過 FRP 來連上網際網路。

伺服器端

更新系統

sudo apt-get update
sudo apt-get upgrade

FRP使用Go語言,大部分Linux主機都有預裝了,但如果你的沒有,可以先執行以下指令

sudo apt-get install bison ed gawk gcc libc6-dev make golang-go

接著你必須到 FRP 的 Github 上查看最新 Release 的並下載他,拱寫這篇文章時,版本為 v0.36.2。若你是 32 位元主機,就下載 386 的版本;如果是 64 位元,就下載 amd64;那如果你是樹莓派,就下載 arm64。

wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz

解壓縮檔案並重新命名資料夾為 frp

tar -zxvf frp_0.36.2_linux_amd64.tar.gz
mv frp_0.36.2_linux_amd64/ frp/

接著我的習慣會把這個資料夾移動到 /var 底下,這部分是個人習慣,可做可不做

mv frp/ /var
cd /var/frp

進到資料夾後,可以看到檔名大致分為兩類開頭:frpcfrpsfrpc 是客戶端使用,frps 則是伺服器端。
現在編輯frps.ini這個檔案

sudo vim frps.ini

可以大致編輯成下方的樣子,詳細設定可以到 https://gofrp.org/docs/ 查看。
若你是使用 Public Cloud 的主機,記得到防火牆內把Port打開

[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 8089
vhost_https_port = 443
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456

[client]
type = tcp
auth_token = 123456
bind_addr = 0.0.0.0
listen_part = 25565

若要啟動他,則使用以下指令。

sudo ./frps -c ./frps.ini

不過這個啟動方法,在關閉 SSH 畫面後,就會關閉了,因此我們來把他註冊成服務。 服務名稱我是叫 frps.service 啦,名稱也是你喜歡就好w

sudo vim /lib/systemd/system/frps.service

內容如下:
Description 指的是描述而已。 ExecStart 是指路徑名稱,還記得我把 frp 資料夾移到 /var 底下吧,如果你不是像我這樣設定,那麼這邊的路徑名稱就要記得改哦~

[Unit]
Description=FRP Server
After=multi-user.target

[Service]
Type=simple
ExecStart=/var/frp/frps -c /var/frp/frps.ini

[Install]
WantedBy=multi-user.target

儲存退出後,我們讓系統的設定檔重讀一次

sudo systemctl daemon-reload

接著你就可以透過以下指令來控制 FRP 服務啦,用法我會註解在後方

sudo systemctl start frps.service //啟動 FRP Server 服務
sudo systemctl stop frps.service //停止 FRP Server 服務
sudo systemctl restart frps.service //重啟 FRP Server 服務
sudo systemctl enable frps.service //開機時自動啟動 FRP Server 服務
sudo systemctl disable frps.service //開機時不要啟動 FRP Server 服務
sudo systemctl status frps.service //查看FRP Server 狀態

用戶端

https://github.com/fatedier/frp/releases 下載檔案,我們這邊選擇 windows_amd64 的版本。

001.jpg

下載後解壓縮他,我將他放到 C:\ 底下,資料夾重新命名為 frp,可以看到以下檔案。

002.jpg

我們編輯 frpc.iniserver_addr 請填寫伺服器端的IP位置。

[common]
server_addr = X.X.X.X
server_port = 7000
auth_token = 123456

[client]
type = tcp
local_ip = 127.0.0.1
local_port = 25565
remote_port = 25565

存檔後,我們打開命令提示字元 (cmd),輸入以下內容:

C:\frp\frpc.exe -c C:\frp\frpc.ini

執行時請不要關閉這個黑色視窗,關了他就會斷線了

003.jpg

接著為了乾淨的測試,我載了一個新的 Minecraft Server,保持預設值的打開他

004.jpg

接著可以請你的朋友,輸入伺服器端的 IP,看看可不可以接進你的伺服器
那如果你沒有朋友….,你可以發郵件給我,我幫忙你w

005.jpg

統計網頁

還記得我們在設定伺服器端文件的時候,有出現 dashboard_portdashboard_userdashboard_pwd。 對的沒錯,他是有一個統計網頁的,你可以輸入 你的 IP:7500 來檢視他。 而帳號跟密碼就是 dashboard_userdashboard_pwd,本篇文章就是 admin123456

006.jpg

007.jpg

總結

好啦,那本篇教學就結束了,總結來說我覺得 FRP 是一個相當方便的工具,他可以幫助沒有實體 IP 的人,讓他的服務可以連線出去。 如果你有任何問題或建議,可以在底下留言,也歡迎把這篇文章分享出去讓更多人看到w。