NGINX 进行 TCP 流量转发的原理并不是简单地修改 TCP 包的目标地址,而是通过建立代理连接,在客户端和目标服务器之间进行中转。以下是详细解释:
NGINX TCP 流量转发的原理
-
客户端连接:
- 客户端发起 TCP 连接请求到 NGINX 服务器,连接到 NGINX 配置的监听端口(如 5432)。
-
NGINX 接收连接:
- NGINX 接收到客户端的连接请求,并根据配置文件中的
proxy_pass指令确定将流量转发到哪个上游服务器。
- NGINX 接收到客户端的连接请求,并根据配置文件中的
-
建立到上游服务器的连接:
- NGINX 代理模块(
ngx_stream)会代表客户端发起与上游服务器的 TCP 连接。此时,NGINX 是作为一个客户端连接到上游服务器的。
- NGINX 代理模块(
-
流量转发:
- 建立连接后,NGINX 在客户端和上游服务器之间传递数据。NGINX 接收来自客户端的数据包,并将其发送给上游服务器;同样地,接收来自上游服务器的数据包,并将其发送给客户端。
数据流的中转
-
客户端到NGINX: 客户端 → NGINX 监听端口
-
NGINX到上游服务器: NGINX 代理模块 → 上游服务器
图示
[Client] <--TCP--> [NGINX] <--TCP--> [Upstream Server]
具体步骤
-
客户端连接 NGINX:
Client ---> SYN (TCP handshake) ---> NGINX -
NGINX 接受客户端连接:
NGINX ---> SYN-ACK ---> Client -
NGINX 连接上游服务器:
NGINX ---> SYN (TCP handshake) ---> Upstream Server -
上游服务器接受连接:
Upstream Server ---> SYN-ACK ---> NGINX -
数据传输:
Client ---> Data ---> NGINX ---> Data ---> Upstream Server Upstream Server ---> Data ---> NGINX ---> Data ---> Client
与修改目标地址的区别
与直接修改 TCP 包的目标地址(如 NAT 或 IP 重写)不同,NGINX 的 TCP 代理会保持两个独立的 TCP 连接:
- 一个连接在客户端和 NGINX 之间。
- 另一个连接在 NGINX 和上游服务器之间。
这意味着 NGINX 可以对数据流进行更多的控制和处理,例如负载均衡、访问控制、流量监控等。
配置示例
以下是 NGINX 的 stream 模块配置 TCP 代理的示例:
stream {
upstream backend {
server 192.168.0.190:5432;
}
server {
listen 5432;
proxy_pass backend;
}
}
通过以上配置,NGINX 将监听本地的 5432 端口,将收到的所有流量转发到 192.168.0.190:5432。
总结
NGINX 通过建立独立的代理连接来实现 TCP 流量转发,而不是简单地修改 TCP 包的目标地址。这样可以提供更强的流量控制和处理能力,同时确保客户端和上游服务器之间的通信透明。