从外网访问内网HTTP服务
使用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端口
- 我尝试了,但是不行。。