在 Nginx 中配置客户端真实 IP 的转发通常是为了让后端服务器(如应用服务器)能够获取到客户端的真实 IP 地址,而不是看到反向代理(Nginx)的 IP。以下是常见的配置方法:


1. 基础配置(HTTP 反向代理场景)

当 Nginx 作为反向代理时,默认会将客户端的 IP 替换为自己的 IP。为了让后端获取真实 IP,需要设置 HTTP 头 X-Forwarded-For 和 X-Real-IP。

步骤:
  1. 在 http 块或 server/location 块中添加以下配置:

    nginx

    复制

    location / {
        proxy_set_header X-Real-IP $remote_addr;          # 客户端真实 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 包含所有代理链的 IP 列表
        proxy_set_header Host $http_host;                 # 保留原始 Host 头
        proxy_pass http://backend_server;                 # 后端服务器地址
    }
    • X-Real-IP: 直接传递客户端的真实 IP。

    • X-Forwarded-For: 追加客户端 IP 到现有的代理链 IP 列表(如果存在)。

  2. 重启 Nginx:

    bash

    复制

    sudo nginx -s reload

2. 四层 TCP/UDP 代理场景(Stream 模块)

如果使用 Nginx 的 stream 模块做四层代理(如 TCP/UDP 负载均衡),需要使用 proxy_protocol 协议传递客户端 IP。

步骤:
  1. 在 stream 块中启用 proxy_protocol:

    nginx

    复制

    server {
        listen 12345 proxy_protocol;  # 启用 Proxy Protocol
        proxy_pass backend_server;
    }
  2. 后端服务器需支持 Proxy Protocol(如 HAProxy 或配置了 proxy_protocol 的 Nginx)。


3. 后端服务器配置

确保后端服务器(如 Apache、Node.js、Tomcat 等)正确解析 X-Forwarded-For 或 X-Real-IP 头。

示例:Apache 配置

apache

复制

# 安装并启用 mod_remoteip
LoadModule remoteip_module modules/mod_remoteip.so

<IfModule mod_remoteip.c>
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 192.168.1.0/24  # 允许信任的代理 IP 段
</IfModule>
示例:Node.js (Express)

javascript

复制

app.set('trust proxy', true); // 信任代理头

4. 多层代理场景

如果客户端请求经过多个代理(如 CDN → Nginx → 后端),确保每一层都正确传递 X-Forwarded-For。

示例配置:

nginx

复制

location / {
    proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $remote_addr";
    proxy_pass http://backend_server;
}

5. 获取真实 IP 的安全注意事项

  • 信任代理链:确保只信任已知的代理 IP(如使用 set_real_ip_from 指令)。

  • 防止伪造:如果未配置信任的代理 IP,攻击者可能伪造 X-Forwarded-For 头。

安全配置示例:

nginx

复制

# 仅允许特定 IP 段的代理
set_real_ip_from 192.168.1.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;  # 忽略不可信代理的 IP

验证配置

  1. 使用 curl 或浏览器访问服务。

  2. 检查后端日志是否记录了真实客户端 IP。


通过以上配置,Nginx 可以将客户端的真实 IP 传递给后端服务器,确保应用正确处理来源信息。

更多推荐