從外網訪問內網HTTP服務


使用frp內網穿透技術實現

一. 背景

已經開發好了一個前后端分離的web項目,在內網集群上部署使用,現在需要提供一個外網訪問使用的入口。

二. 使用工具

  1. 外網服務器(這里使用實驗室之前買的一台阿里雲服務器使用)
  2. 內網穿透工具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 發現可以正常訪問內網部署的項目了

六. 問題和討論

  1. 客戶端配置的 local_ip 是否可以設置為 localhost 或者 127.0.0.1
    • 我嘗試過localhost和127.0.0.1,但是穿透失敗了,反而寫內網ip可以成功
  2. 可不可以不修改前端發送請求的后端地址
    • 比如在內網中可能是往后端入口 hostName:8001 發送請求的,將后端穿透暴露到外網ip的8001端口。
    • 修改外網機器的hosts文件,設置 hostName 映射到 127.0.0.1,是不是就可以將該請求轉發到本地的8001端口
    • 我嘗試了,但是不行。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM