frp內網穿透實戰
什麼是frp
frp是一個使用非常簡單的開源內網穿透軟體,程式碼地址://github.com/fatedier/frp ,使用條前提你需要有一台公網伺服器,大致原理是:公網伺服器監聽某個埠等待內網伺服器連接,內網伺服器連接成功後用戶訪問公網的某一個埠,訪問的所有內容都會轉發到內網伺服器,也就是所有的請求都會經過公網伺服器轉發一次,還不是真正的完全內網穿透。
準備工作
- 準備一台公網伺服器,內網伺服器可以直接用本地電腦模擬;
- 本地電腦準備一個可訪問的 //127.0.0.1:8080 地址供測試;
- 2端各下載好對應平台軟體,下載地址://github.com/fatedier/frp/releases
配置&啟動
公網伺服器
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
,不出意外的話已經內網穿透成功了:
訪問 //公網IP:7080 返回的應該是 //127.0.0.1:8080 的內容。
進階
自定義域名
直接使用IP最多只能允許一台內網伺服器訪問連接,自定義域名可以解決此問題。內網伺服器將custom_domains
修改為一個能指向公網伺服器的域名,例如:
custom_domains = testfrp.haoji.me
然後訪問://testfrp.haoji.me:7080 即可看到 //127.0.0.1:8080 的內容。
只使用一個埠
公網伺服器的vhost_port其實可以和bind_port保持一致,這樣可以更好理解:
[common]
bind_port = 7000
vhost_http_port = 7000
vhost_https_port = 7000
token = 123456
然後訪問://testfrp.haoji.me:7000 即可看到 //127.0.0.1:8080 的內容。
隱藏訪問埠
用戶訪問的時候還需要帶一個埠,訪問不太方便,可以利用nginx再轉發一層:
server {
listen 80;
server_name testfrp.haoji.me;
location / {
proxy_pass //testfrp.haoji.me:7000;
}
}
然後訪問://testfrp.haoji.me 即可看到 //127.0.0.1:8080 的內容,實現了最完美的內網穿透。