利用 FRP 來實現內網穿透

前言

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

☆ 本篇內容已經過時,你仍然可以繼續參考。FRP 如今提供更複雜的操作,如果你在尋找一樣簡單的解決方案,你可以參考 Rathole

前置作業

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

若你要使用 Public Cloud 的主機:

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

操作環境

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