利用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 Service目前離台灣最近的機房是香港或日本,延遲可能較高,遊戲類服務可能要稍微注意,是這三大Public Cloud中最不推薦的。

操作環境

先說明一下這篇教學文章的環境,伺服器端會使用Linux (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

進到資料夾後,可以看到檔名大致分為兩類開頭:frpc及frps,frpc是客戶端使用,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.ini
server_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_port、dashboard_user及dashboard_pwd。 對的沒錯,他是有一個統計網頁的,你可以輸入 你的IP:7500 來檢視他。 而帳號跟密碼就是dashboard_user及dashboard_pwd,本篇文章就是admin及123456。

006.jpg

007.jpg

總結

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