Nginx TCP/UDP代理简述

Nginx 并不直接提供 TCP/UDP 的应用响应,Nginx Stream 模块的核心功能是将客户端的 TCP/UDP 连接反向代理给后端的被代理服务器。

1) 核心配置指令

TCP/UDP 代理功能的核心配置指令如下表所示。

指令名称 指令值格式 默认值 指令说明
proxy_bind address[transparent] 或 off -- 设置从指定的本地 IP 地址及端口与被代理服务器建立连接,指令值可以是变量。指令值参数为 transparent 时,允许将客户端的真实 IP 透传给被代理服务器,并以客户端真实 IP 为访问被代理服务器的源 IP;指令值参数为 off 时,则取消上一层指令域同名指令的配置
proxy_buffer_size size 16k 设置用于从被代理服务器读取数据的缓冲区的大小,也用于设置从客户端读取会话数据的缓冲区的大小
proxy_connect_timeout time 60s 与被代理服务器建立连接的超时时间
proxy_timeout time 10m Nginx 服务器与客户端或被代理服务器的两个连续成功的读或写操作的最大间隔时间,如果在间隔时间内没有数据传输,则关闭连接
proxy_download_rate rate 0 限制每个连接每秒从被代理服务器中读取数据的字节数,默认不限制
proxy_upload_rate rate 0 限制每个连接每秒发送到被代理服务器的数据的字节数,默认不限制
proxy_next_upstream on 或 off on 当被代理的服务返回错误或超时时,将未返回响应的客户端连接请求传递给 upstream 中的下一个服务器
proxy_next_upstream_timeout time 0 设置将符合条件的客户端连接请求传递给 upstream 中下一个服务器的超时时间。“0”为不做超时限制,即直到遍历完所有上游服务器组中的服务器为止
proxy_next_upstream_tries number 0 设置将符合条件的客户端连接请求传递给 upstream 中下一个服务器的尝试次数,包括第一次的失败次数。“0”为不做尝试次数限制,即直到遍历完所有上游服务器组中的服务器为止
proxy_pass address -- 被代理服务器的地址,支持 IP 或域名加端口、UNIX 域套接字、upstream 名
proxy_protocol on 或 off off 设置是否对被代理服务器的连接启用代理协议(proxy_protocol)支持
proxy_socket_keepalive on 或 off off 设置 Nginx 与被代理服务器的 TCP keepalive 行为的心跳检测机制,默认使用操作系统的 socket 配置,若指令值为 on,则开启 SO_KEEPALIVE 选项进行心跳检测
proxy_ssl on 或 off off 设置是否启用 SSL/TLS 协议与被代理服务器建立连接
proxy_ssl_protocols [SSLv2][SSLv3]
[TLSv1][TLSv1.1]
[TLSv1.2][TLSv1.3]
TLSv1
TLSv1.1
TLSv1.2
指定可用于 Nginx 与被代理服务器建立 SSL 连接的 SSL 协议版本
proxy_ssl_session_reuse on 或 off on 是否启用与被代理服务器 SSL TCP 连接的 SSL 会话重用功能
proxy_ssl_ciphers ciphers DEFAULT 设置与被代理服务器建立 SSL 连接时,用于协商使用的加密算法组合,也称为密码套件,指令值内容为 openssl 的密码套件名称,多个套件名称由“:”分隔
proxy_ssl_server_name on 或 off off 在与被代理服务器建立 SSL 连接时,设置是否启用通过 SNI 或 RFC 6066 传递主机名
proxy_ssl_certificate file -- 指定被代理服务器对 Nginx 服务器身份验证的 PEM 格式 SSL 证书文件
proxy_ssl_certificate_key file -- 指定被代理服务器对 Nginx 服务器身份验证的 PEM 格式 SSL 证书私钥文件
proxy_ssl_password_file file -- 存放被代理服务器对 Nginx 服务器身份验证的 PEM 格式 SSL 证书私钥文件的密码文件,一个密码一行。有多个密码时,Nginx 会依次尝试
proxy_ssl_verify on 或 off off 设置是否启用对被代理服务器的 SSL 证书的验证功能
proxy_ssl_name name proxy_pass
指令指定的主机名
指定对被代理服务器 SSL 证书验证的主机名
proxy_ssl_crl file -- 证书品销列表文件,用于验证被代理服务器 SSL 证书有效性的 PEM 格式文件
proxy_ssl_trusted_certificate file -- 指定一个 PEM 格式的 CA 证书(根或中间证书)文件,该证书用作被代理服务器的证书链验证
proxy_ssl_verify_depth number 1 设置被代理服务器的证书链的验证深度
proxy_requests number 0 UDP 代理时,设置同一客户端被 Nginx 在每次 UDP 会话中,转发给被代理服务器的数据报的数量。当达到这个数量时,将启用一个新的 UDP 会话继续转发。可用于 Nginx 对 UDP 虚拟连接会话的控制
proxy_responses number -- UDP 代理时,设置允许被代理服务器返回 UDP 数据报的数量,超过指令值时将中止会话。默认无限制,0 为不返回响应数据

该模块的指令使用的指令域范围为 stream、server。

2) TCP 反向代理配置样例

配置样例如下:
stream {
    server {
        listen 389 ;                          # 设置监听端口为389
        proxy_pass 192.168.2.100:389;         # 将连接代理到后端192.168.2.100:389
        proxy_timeout 5s;                     # 与被代理服务器的连续通信间隔大于5s,
                                              # 则认为通信超时,将关闭连接
        proxy_connect_timeout 5s;             # 与被代理服务器建立连接的超时时间为5s
        access_log logs/ldap_access.log tcp;  # 记录日志文件为logs/ldap_access.log,
                                              # 日志模板为tcp
    }
}

3) 代理 SSL TCP

代理模块 stream 可以实现基于 SSL/TLS 协议的被代理服务器的反向代理,部署方式为客户端 → Nginx 服务器(TCP)→ 被代理服务器(SSL TCP)。配置样例如下:
stream {
    server{
        listen 636;                            # 设置监听端口为636
        access_log  logs/ldap_access.log tcp;
        proxy_pass  192.168.2.100:636;
        proxy_ssl   on;                        # 启用SSL/TLS协议,与被代理服务器建立连接
        proxy_ssl_session_reuse on;            # 与被代理服务器SSL TCP连接的SSL会话重用功能
    }
}

4) UDP 反向代理配置

UDP 协议是一种无连接的协议,发送端与接收端传输数据之前不需要建立连接,发送端会尽最大努力把数据发送出去,不能保证安全地传输到接收端。由于传输数据不建立连接,也不需要维持复杂的链路关系(包括连接状态、收发状态等),因此发送端可同时向多个接收端传输相同的消息。

虽然 UDP 的数据传输是不可靠的,但如果有一个数据报丢失,另一个新的数据报会在几秒内替换它发送到接收端。UDP 协议通常被用在单向传输无须返回响应及信息分发的场景,如日志收集或在屏幕上的航班信息、股票行情等多媒体场景。
stream {
    server {
        listen 1514 udp;               # 设置监听端口为1514并启用UDP协议
        proxy_pass 192.168.2.123:1514;
        proxy_responses 0;             # 会话接收数据报后无须等待返回响应,立即关闭会话
    }
}