美文网首页网络
【tcp】反向代理服务器,怎么实现的链路中的端口转换?

【tcp】反向代理服务器,怎么实现的链路中的端口转换?

作者: Bogon | 来源:发表于2022-06-06 00:02 被阅读0次

nginx 反向代理场景

客户端 A,ip为 A_ip,端口为 A_random_port

反向代理 B,ip 为 B_ip ,监听端口为固定的 443

后端 C,ip 为 C_ip ,监听端口为固定的 443

以一条反向代理连接为例,链路为:

A_ip: A_random_port ----- B_ip:443 ----- B_ip:B_random_port ---- C_ip:443

A:A_random_port ---- B1:443 ---- B2:B_random_port ---- C:443

B1 和B2 ip 相同,监听的端口不同
B1 监听固定端口443,B2监听的是一个随机端口

具体一点:
192.168.1.101:12345 <----> 192.168.1.102:443 <----> 192.168.1.102:45678 <---> 192.168.1.103:443

A是纯粹的客户端 ;B既作为A的服务端,又作为C的客户端;C纯粹的服务端。
B 作为 C的客户端,发起socket连接时,会向反向代理服务器内核申请注册一个空闲的随机端口。

A:A_random_port ---- B1:443 和 B2:B_random_port ---- C:443 这两段链路socket好理解。
但是 B1:443 ---- B2:B_random_port 这段链路 nginx反向代理 是怎么实现的?

对nginx来说就是同一块内存,后面的链接的直接从前面那段链接的结尾的内存地址开始读。
首先上下游都建立好tcp链接,然后上游收到一个报文后会把报文头去掉,把payload临时存到一个地方,然后有个指针指向该内存,接着就会构筑往后发送的报文头,从该指针获取内容,拼接成一个往后发的报文,然后发出去。


image.png

nginx中两个模块有proxy_pass指令,用于反向代理配置项,分别是:
ngx_http_proxy_module
ngx_stream_proxy_module
ngx_http_upstream_module

nginx + vip 反向代理场景

nginx + keepalived,实现反向代理的高可用

image.png

用户公网IP:随机端口 ----> www.example.com:20080----(NAT)-->outer_nginx_vip:20080 ----> nginx01_ip:随机端口 -----> upstream:20080

跟没有vip 的代理链路比,outer_nginx_vip:20080 ----> nginx01_ip:随机端口 这段链路ip有了变更,跟后端交互时并不是使用物理nginx01_ip,而是使用虚拟的outer_nginx_vip,这跟keepalived的网络实现有关,当然此处outer_nginx_vip 和nginx01_ip 是同一个mac地址。

参考

tcp四次挥手状态 TIME_WAIT
https://www.jianshu.com/p/3658730d76d7

How to view and edit the ephemeral port range on Linux?
https://stackoverflow.com/questions/28573390/how-to-view-and-edit-the-ephemeral-port-range-on-linux

nginx使用proxy_bind负载tcp socket,解决代理端口耗尽
https://b.sundayle.com/nginx-proxy-65535-port

如何解决使用nginx作为反向代理端口耗尽问题?
https://blog.csdn.net/michaelwoshi/article/details/120170134

Overcoming Ephemeral Port Exhaustion in NGINX and NGINX Plus
https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus

相关文章

网友评论

    本文标题:【tcp】反向代理服务器,怎么实现的链路中的端口转换?

    本文链接:https://www.haomeiwen.com/subject/dgarmrtx.html