【Linux】【网络】frp 如何准确将 客户端B 请求转发给 服务器A 的
先来看一下上个文章的配置
1配置部分
1.1frp 配置
frp一直在监听7000这个端口上是否有请求到达
[common]
bind_port = 7000 # 云服务器监听的端口
1.2 服务器A配置
[common]
server_addr = frp_ip; # 云服务器的公网 IP
server_port = 7000 # FRP 服务器端口[ssh1]
type = tcp
local_ip = local_A_ip # 客户端 A 的内网 IP
local_port = 23 # 客户端 A 的 Telnet 服务端口
remote_port = 6001 # 云服务器上暴露的端口
大概解释一下这几个数据代表什么 :
- server_addr = frp_ip -->云服务器的公网 IP
- server_port = 7000 --> FRP 服务器端口
- local_ip = local_A_ip -->客户端 A 的内网 IP
- local_port = 23 -->frp代理能够访问的A的端口
- remote_port = 6001–>A在云服务器上暴露的端口
local_ip 和local_port 能够定位A以及对应的程序
remote_port,这个相当于A通过frp公开的端口 在外部连接时连接到这个端口 frp能够识别这是转发给 A再通过local_ip 和local_port 发送给A
1.3客户端B配置
[common]
server_addr = frp_ip # 云服务器的公网 IP
server_port = 7000 # FRP 服务器端口[ssh]
type = tcp
local_ip = local_B_ip # 客户端 B 的内网 IP
local_port = 22 # 客户端 B 的 SSH 服务端口
remote_port = 6000 # 云服务器上暴露的端口
B也是同理
下面来看一下测试代码
2测试代码
2.1服务器A
const char* host_ip = local_A_ip; // A 局域网服务器的内网 IP 地址
int host_port = 23; // 局域网服务端口
2.2客户端B
const char* server_ip = frp_ip; // 云服务器的公网 IP
int server_port = 6001; // FRP 映射的端口
因此在连接的时候
- 客户端B–>云服务器的公网 IP (frp_ip)+配置文件中**FRP 服务器端口(7000)**连接
- frp服务器收到连接后 知道客户端B 要连接的FRP映射端口(6001)
- 此时根据服务器A 在云服务器上暴露的端口(6001)–>知道要转发给A了 //remote_port = 6000
- A的local_ip 和local_port 定位到A 发送给A
注意 在FRP 服务器端口(7000)确定时,remote_port 是唯一的(连接FRP不同客户端/服务器) 用来标识彼此
这也就解释了我之前认为remote_port可以一样的问题 实际上必须不一致