frp內網穿透實戰

2022-09-23 21:00:30

什麼是frp

frp是一個使用非常簡單的開源內網穿透軟體,程式碼地址:https://github.com/fatedier/frp ,使用條前提你需要有一臺公網伺服器,大致原理是:公網伺服器監聽某個埠等待內網伺服器連線,內網伺服器連線成功後用戶存取公網的某一個埠,存取的所有內容都會轉發到內網伺服器,也就是所有的請求都會經過公網伺服器轉發一次,還不是真正的完全內網穿透。

準備工作

設定&啟動

公網伺服器

tar -zxvf frp_0.43.0_linux_amd64.tar.gz
mv frp_0.43.0_linux_amd64 frps
cd frps
# 刪除使用者端相關無用檔案
rm -rf frpc*
vim frps.ini

frps.ini設定:

[common]
# 等待內網伺服器連線的埠
bind_port = 7000
# 終端使用者存取的埠(http)
vhost_http_port = 7080
# 終端使用者存取的埠(https)
vhost_https_port = 7081
# 金鑰,最好設定,避免你的伺服器被他人冒用
token = 123456

啟動:./frps -c ./frps.ini,不出意外的話就啟動成功了:

內網伺服器

也就是你本機,假設以Mac為例:

tar -zxvf frp_0.43.0_darwin_arm64.tar.gz
mv frp_0.43.0_darwin_arm64 frpc
cd frpc
# 刪除伺服器端相關檔案
rm -rf frps*
vim frpc.ini

frpc.ini設定:

[common]
# 你的公網IP
server_addr = 112.*.*.*
# 前面設定的連線埠
server_port = 7000
# 前面設定的金鑰
token = 123456

# 這個名字可以隨便取web1、web2等,但是需要保證所有使用者端唯一
[web1]
type = http
# 需要轉發的內網埠
local_port = 8080
# 自定義域名,如果沒有域名直接填寫公網伺服器的IP
custom_domains = 112.*.*.*

然後啟動:./frpc -c ./frpc.ini,不出意外的話已經內網穿透成功了:

存取 http://公網IP:7080 返回的應該是 http://127.0.0.1:8080 的內容。

進階

自定義域名

直接使用IP最多隻能允許一臺內網伺服器存取連線,自定義域名可以解決此問題。內網伺服器將custom_domains修改為一個能指向公網伺服器的域名,例如:

custom_domains = testfrp.haoji.me

然後存取:http://testfrp.haoji.me:7080 即可看到 http://127.0.0.1:8080 的內容。

只使用一個埠

公網伺服器的vhost_port其實可以和bind_port保持一致,這樣可以更好理解:

[common]
bind_port = 7000
vhost_http_port = 7000
vhost_https_port = 7000
token = 123456

然後存取:http://testfrp.haoji.me:7000 即可看到 http://127.0.0.1:8080 的內容。

隱藏存取埠

使用者存取的時候還需要帶一個埠,存取不太方便,可以利用nginx再轉發一層:

server {
    listen       80;
    server_name  testfrp.haoji.me;
    location / {
           proxy_pass http://testfrp.haoji.me:7000;
    }
}

然後存取:http://testfrp.haoji.me 即可看到 http://127.0.0.1:8080 的內容,實現了最完美的內網穿透。