NGINX 进行 TCP 流量转发的原理并不是简单地修改 TCP 包的目标地址,而是通过建立代理连接,在客户端和目标服务器之间进行中转。以下是详细解释:
NGINX TCP 流量转发的原理
- 客户端连接:
- 客户端发起 TCP 连接请求到 NGINX 服务器,连接到 NGINX 配置的监听端口(如 5432)。
- NGINX 接收连接:
- NGINX 接收到客户端的连接请求,并根据配置文件中的
proxy_pass
指令确定将流量转发到哪个上游服务器。
- 建立到上游服务器的连接:
- NGINX 代理模块(
ngx_stream
)会代表客户端发起与上游服务器的 TCP 连接。此时,NGINX 是作为一个客户端连接到上游服务器的。
- 流量转发:
- 建立连接后,NGINX 在客户端和上游服务器之间传递数据。NGINX 接收来自客户端的数据包,并将其发送给上游服务器;同样地,接收来自上游服务器的数据包,并将其发送给客户端。
数据流的中转
- 客户端到NGINX: 客户端 → NGINX 监听端口
- NGINX到上游服务器: NGINX 代理模块 → 上游服务器
与修改目标地址的区别
与直接修改 TCP 包的目标地址(如 NAT 或 IP 重写)不同,NGINX 的 TCP 代理会保持两个独立的 TCP 连接:
- 一个连接在客户端和 NGINX 之间。
- 另一个连接在 NGINX 和上游服务器之间。
这意味着 NGINX 可以对数据流进行更多的控制和处理,例如负载均衡、访问控制、流量监控等
配置示例
以下是 NGINX 的 stream
模块配置 TCP 代理的示例:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
stream {
upstream backend {
server 106.75.198.227:2009;
}
server {
listen 5432;
proxy_pass backend;
}
}
http {
......
}
通过以上配置,NGINX 将监听本地的 5432 端口,将收到的所有流量转发到 192.168.0.190:5432
总结
NGINX 通过建立独立的代理连接来实现 TCP 流量转发,而不是简单地修改 TCP 包的目标地址。这样可以提供更强的流量控制和处理能力,同时确保客户端和上游服务器之间的通信透明。