NGINX TCP 流量转发的原理

1,704 阅读2分钟

NGINX 进行 TCP 流量转发的原理并不是简单地修改 TCP 包的目标地址,而是通过建立代理连接,在客户端和目标服务器之间进行中转。以下是详细解释:

NGINX TCP 流量转发的原理

  1. 客户端连接

    • 客户端发起 TCP 连接请求到 NGINX 服务器,连接到 NGINX 配置的监听端口(如 5432)。
  2. NGINX 接收连接

    • NGINX 接收到客户端的连接请求,并根据配置文件中的 proxy_pass 指令确定将流量转发到哪个上游服务器。
  3. 建立到上游服务器的连接

    • NGINX 代理模块(ngx_stream)会代表客户端发起与上游服务器的 TCP 连接。此时,NGINX 是作为一个客户端连接到上游服务器的。
  4. 流量转发

    • 建立连接后,NGINX 在客户端和上游服务器之间传递数据。NGINX 接收来自客户端的数据包,并将其发送给上游服务器;同样地,接收来自上游服务器的数据包,并将其发送给客户端。

数据流的中转

  • 客户端到NGINX: 客户端 → NGINX 监听端口

  • NGINX到上游服务器: NGINX 代理模块 → 上游服务器

图示

[Client]  <--TCP-->  [NGINX]  <--TCP-->  [Upstream Server]

具体步骤

  1. 客户端连接 NGINX

    Client ---> SYN (TCP handshake) ---> NGINX
    
  2. NGINX 接受客户端连接

    NGINX ---> SYN-ACK ---> Client
    
  3. NGINX 连接上游服务器

    NGINX ---> SYN (TCP handshake) ---> Upstream Server
    
  4. 上游服务器接受连接

    Upstream Server ---> SYN-ACK ---> NGINX
    
  5. 数据传输

    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 包的目标地址。这样可以提供更强的流量控制和处理能力,同时确保客户端和上游服务器之间的通信透明。