使用frp內網穿透技術實現
一. 背景
已經開發好了一個前后端分離的web項目,在內網集群上部署使用,現在需要提供一個外網訪問使用的入口。
二. 使用工具
- 外網服務器(這里使用實驗室之前買的一台阿里雲服務器使用)
- 內網穿透工具frp
三. 需要的技術:使用frp暴露內網的http端口
前提:外網服務器A和內網服務器B上都安裝了frp
1. 外網服務器設置
修改配置文件 frps.ini (也可以不叫這個名字,只要內容如下格式即可)
# frps.ini
[common]
# 這個端口是暴露給內網服務器連接的,通過該端口完成內外網穿透
bind_port = 7000
# vhost端口設置為哪個端口,就會把內網端口暴露在該端口上
vhost_http_port = 8080
根據配置文件啟動frp服務端
./frps -c ./frps.ini
2.內網服務器設置
修改配置文件 frpc.ini
# frpc.ini
# common部分完成內外網端口綁定的配置
[common]
# addr 設置為外網服務器ip
server_addr = x.x.x.x
# 這里的 port 和服務端設置的bind_port相對應
server_port = 7000
# web部分完成內網需要映射的端口的配置
[web]
# 設置協議為http
type = http
# 設置為本機內網ip
local_ip = x.x.x.x
# 設置為需要映射的端口
local_port = 80
# 設置為外網服務器ip
custom_domains = x.x.x.x
根據配置文件啟動frp客戶端
./frpc -c ./frpc.ini
這時,在外網ip:8080發送請求,請求可以穿透到內網機器的80端口上
直觀而可能不恰當的理解映射關系如下:
1. 請求從外網的ip:8080端口(即服務端設置的vhost端口)發出
2. 請求轉發到外網服務器的7000端口(即服務端和客戶端設置的bind_port)
3. 請求從7000端口轉發到內網機器
4. 請求轉發至內網的ip:80端口上(對應客戶端設置的local_ip和local_port)
四. 外網訪問主要思路
項目為前后端分離的,前后端分別部署在內網的 cluster-03:8080 和 cluster-06:8001,在內網中,前端是直接向 cluster-06:8001 發送http請求的。
下面簡單說下項目穿透思路
1)映射前端
根據(三)中所說的HTTP穿透思路,將 cluster-03:8080 映射到 外網ip:8081 上(因為8080端口被其他服務占用了)
2)映射后端
- 在前端映射完畢后,訪問 外網ip:8081 是可以加載出項目的初始登陸界面(index.html)的,但是無法進行任何和后端請求相關的操作。
- 因為此時前端向后端發送的請求路徑為 cluster-06:8001/xxxx 而在外網服務器根本無法解析 cluster-06 這個host或者內網ip
- 由此想出折中的方案,即將后端端口也映射到外網端口上,然后修改前端請求發送到該外網端口上
- 如后端 cluster-06:8001 映射到 外網ip:6001 端口上, 修改前端請求發往 外網ip:6001 上
五. 穿透具體操作(基於四中的思路)
1.在阿里雲服務器 ip = a.b.c.d 上分別創建前端和后端映射的frp服務端配置文件
# frps_frontend.ini
[common]
vhost_http_port = 8081
bind_port = 8558
# frps_backend.ini
[common]
bind_port=8559
vhost_http_port = 6001
# 后台啟動
nohup ./frps -c frps_frontend.ini&
nohup ./frps -c frps_backend.ini&
2.在cluster-03上設置前端的frp客戶端配置
# frpc.ini
[common]
server_addr = a.b.c.d
server_port = 8558
[web]
type = http
local_ip = 10.105.222.243
local_port = 8080
custom_domains = a.b.c.d
后台啟動
nohup ./frpc -c frpc.ini&
3. 在cluster-06上設置后端的frp客戶端配置
# frpc.ini
[common]
server_addr = a.b.c.d
server_port = 8559
[web]
type = http
local_ip = 10.105.222.246
local_port = 8001
custom_domains = a.b.c.d
后台啟動
nohup ./frpc -c frpc.ini&
4.修改前端請求發向 a.b.c.d:6001
修改前端向后端的的請求uri 從內網地址 => a.b.c.d:6001
大功告成!此時訪問 http://a.b.c.d:8081 發現可以正常訪問內網部署的項目了
六. 問題和討論
- 客戶端配置的 local_ip 是否可以設置為 localhost 或者 127.0.0.1
- 我嘗試過localhost和127.0.0.1,但是穿透失敗了,反而寫內網ip可以成功
- 可不可以不修改前端發送請求的后端地址
- 比如在內網中可能是往后端入口 hostName:8001 發送請求的,將后端穿透暴露到外網ip的8001端口。
- 修改外網機器的hosts文件,設置 hostName 映射到 127.0.0.1,是不是就可以將該請求轉發到本地的8001端口
- 我嘗試了,但是不行。。