VPS Linux 反向代理 frp 內網穿透 網路設定

沒有固定 IP 也能對外服務:用 VPS + frp 打通內網穿透

家裡的 NAS、辦公室的內部服務、沒有公網 IP 的開發機——只要有一台 VPS,用 frp 就能讓這些設備穩定對外。這篇從原理到實際設定,把常見的坑一起說清楚。

你的家用網路沒有固定 IP,或者 ISP 直接給你 CGNAT,連動態 IP 都拿不到。但你想從外面連回家裡的 NAS、存取辦公室的測試服務,或者讓客戶看你開發中的 demo。

這個問題的解法一直都有,只是沒人用繁體中文把它講清楚過。

問題的本質

一般家庭的網路架構:

1
外部網際網路 → ISP → 家用路由器 (NAT) → 你的電腦 / NAS

你的設備拿到的是路由器分配的私有 IP(例如 192.168.1.x),外面的人根本找不到你。就算設了 port forwarding,動態 IP 每次重新撥號就換一個,還是連不上。

frp(Fast Reverse Proxy)的解法很直觀:找一台有固定公網 IP 的 VPS 當中繼,讓你家的設備主動去連那台 VPS,建立一條持續的通道。外部請求打到 VPS,VPS 再透過這條通道轉進你的內網。

1
外部請求 → VPS (frps) ←→ 你的內網機器 (frpc) → 內部服務

因為連線是從內網往外發起的,不需要在路由器開任何 port,也不受 CGNAT 限制。

frp 的兩個角色

frp 只有一個執行檔,透過設定檔決定跑哪個角色:

  • frps(server):跑在有公網 IP 的 VPS 上,負責接收外部流量和管理 client 連線
  • frpc(client):跑在你想穿透的內網機器上,主動連回 frps,並宣告要轉發哪些服務

這個設計的好處是server 不需要知道 client 的 IP,只要 client 連得到 server 就行。

安裝

在 VPS 和內網機器上分別下載對應架構的 binary:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查 CPU 架構
uname -m
# x86_64 → 下載 linux_amd64
# aarch64 → 下載 linux_arm64

# 下載最新版(以 v0.62.0 為例,實際請到 GitHub Releases 確認)
VERSION="v0.62.0"
ARCH="linux_amd64"
wget "https://github.com/fatedier/frp/releases/download/${VERSION}/frp_${VERSION#v}_${ARCH}.tar.gz"
tar -xzf frp_*.tar.gz
cd frp_*

# 執行檔
ls frps frpc

frp 從 v0.52 起改用 TOML 設定格式,舊的 INI 格式不再支援,網路上很多舊教學的設定檔格式已經不適用。

VPS 端(frps)設定

在 VPS 上建立 /etc/frp/frps.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bindAddr = "0.0.0.0"
bindPort = 7000

# 管理面板(可選,方便監控連線狀態)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "換成你自己的密碼"

# 驗證 token,client 連線時必須提供
auth.method = "token"
auth.token = "換成一個夠長的隨機字串"

# log
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 7

設定 systemd 服務,讓 frps 開機自動啟動:

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/systemd/system/frps.service
[Unit]
Description=frp server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo systemctl status frps

記得在 VPS 的防火牆開放需要的 port:

1
2
3
4
5
# UFW
sudo ufw allow 7000/tcp # frp 控制 port
sudo ufw allow 7500/tcp # 管理面板(如果要開外部存取)
# 以及你待會要轉發的 port,例如:
sudo ufw allow 6000/tcp # 轉發 SSH 用

內網機器端(frpc)設定

在內網機器上建立 /etc/frp/frpc.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
serverAddr = "你的VPS IP或網域"
serverPort = 7000

auth.method = "token"
auth.token = "跟 frps 一樣的 token"

log.to = "/var/log/frpc.log"
log.level = "info"

# 轉發 SSH(範例)
[[proxies]]
name = "ssh-home"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

這個設定的意思:外部連線到 VPS 的 6000 port,會被轉發到這台內網機器的 22 port(SSH)。

同樣設成 systemd 服務:

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/systemd/system/frpc.service
[Unit]
Description=frp client
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
1
2
sudo systemctl daemon-reload
sudo systemctl enable --now frpc

驗證是否成功:從外部用 SSH 連到 VPS 的 6000 port:

1
ssh -p 6000 user@你的VPS_IP

連上了就代表整條通道跑通了。

轉發 HTTP 服務

frp 支援 HTTP/HTTPS 的虛擬主機轉發,可以用域名區分不同的內網服務,全部走同一個 80/443 port:

VPS 端的 frps.toml 加上:

1
2
vhostHTTPPort = 80
vhostHTTPSPort = 443

內網端的 frpc.toml 加上:

1
2
3
4
5
6
[[proxies]]
name = "nas-web"
type = "http"
localIP = "192.168.1.100"
localPort = 5000
customDomains = ["nas.你的網域.com"]

nas.你的網域.com 的 DNS A record 指向 VPS 的 IP,外部瀏覽器訪問這個網域就會被轉進內網的 192.168.1.100:5000

如果要 HTTPS,可以在 VPS 上用 Caddy 或 Nginx 做 TLS termination,然後再轉給 frp 的 HTTP port,或者直接讓 frpc 帶上憑證:

1
2
3
4
5
6
[[proxies]]
name = "nas-https"
type = "https"
localIP = "192.168.1.100"
localPort = 5001
customDomains = ["nas.你的網域.com"]

幾個實際會踩的坑

frps 的 remotePort 需要預先開防火牆。每加一個 TCP proxy 就要記得在 VPS 防火牆補開對應的 port,這個常常被忘記,結果 frpc 日誌顯示連線成功,外部卻連不進來。

token 一定要設。裸跑沒有 token 的 frps,任何人只要知道你的 VPS IP 和 port 就能建立 proxy,把你的 VPS 當跳板用。不要跳過這步。

frpc 斷線重連是正常的。內網機器如果 IP 改變、網路重啟,frpc 會中斷,但設了 Restart=on-failure 之後會自動重連。如果需要更穩定的連線,可以搭配 transport.heartbeatTimeout 讓 server 更快偵測到 client 斷線。

NAT 類型影響延遲,但不影響連通性。frp 的流量都走 VPS 中繼,所以無論你的 NAT 有多嚴格都沒關係,代價是所有流量都要過 VPS 一趟,VPS 的頻寬和延遲會直接影響使用體驗。

跟 Cloudflare Tunnel 的差別

Cloudflare Tunnel 也能做類似的事,而且免費。但它有幾個限制:只支援 HTTP/HTTPS 和少數協定(SSH 需要走 Cloudflare Access),不支援原生 TCP/UDP 轉發,而且所有流量都走 Cloudflare 的基礎設施,你無法控制路由。

如果你需要轉發 SSH、資料庫連線、遊戲伺服器(UDP)、或者任何非 HTTP 的 TCP 服務,frp 加上自己的 VPS 是更直接的選擇。控制權也全在你手上。


要跑 frps 的 VPS 不需要很大,1 核 512MB 記憶體足以應付一般家用或小型辦公室的穿透需求。如果你需要一台臺灣本地的 VPS 來做中繼,讓內外網的延遲都低一點,NCSE Network 的方案從小規格開始就有 NVMe SSD 和臺灣是方電訊機房,細節可以到 ncse.tw 查看。

需要穩定的雲端主機?

NCSE Network 提供企業級 VPS,7 天免費試用,臺灣是方電訊機房,99% SLA 保證。

查看 VPS 方案 →