Nginx 如何使用 ngx_http_realip_module 获取真实客户端 IP?

推荐答案

要使用 ngx_http_realip_module 获取真实客户端 IP,首先需要在 Nginx 配置文件中加载该模块,并配置 set_real_ip_fromreal_ip_header 指令。以下是一个示例配置:

-- -------------------- ---- -------
----------- ----------------------------------

---- -
    ---
    ---------------- ---------------
    ---------------- -----------
    -------------- ----------------
    ----------------- ---
    ---
-

在这个配置中:

  • set_real_ip_from 指定了可信的代理服务器 IP 地址或 CIDR 范围。
  • real_ip_header 指定了包含真实客户端 IP 的 HTTP 头字段,通常是 X-Forwarded-For
  • real_ip_recursive 启用递归查找,确保从 X-Forwarded-For 中提取最左边的非可信 IP。

本题详细解读

1. ngx_http_realip_module 的作用

ngx_http_realip_module 模块用于在 Nginx 作为反向代理时,获取真实的客户端 IP 地址。当请求经过多个代理服务器时,客户端的原始 IP 地址可能会被代理服务器的 IP 地址覆盖。该模块通过解析 X-Forwarded-For 等 HTTP 头字段,提取出真实的客户端 IP。

2. 配置指令详解

  • set_real_ip_from: 指定可信的代理服务器 IP 地址或 CIDR 范围。只有来自这些地址的请求,Nginx 才会尝试解析 X-Forwarded-For 头字段。

  • real_ip_header: 指定包含真实客户端 IP 的 HTTP 头字段。通常使用 X-Forwarded-For,但也可以根据实际情况使用其他字段。

  • real_ip_recursive: 启用递归查找。当 X-Forwarded-For 头字段中包含多个 IP 地址时,Nginx 会从右向左查找第一个不在 set_real_ip_from 列表中的 IP 地址,并将其作为真实客户端 IP。

3. 示例配置解析

在示例配置中:

  • set_real_ip_from 192.168.1.0/24;set_real_ip_from 10.0.0.0/8; 指定了两个可信的代理服务器 IP 范围。
  • real_ip_header X-Forwarded-For; 指定了 X-Forwarded-For 头字段作为真实 IP 的来源。
  • real_ip_recursive on; 启用了递归查找,确保从 X-Forwarded-For 中提取最左边的非可信 IP。

4. 注意事项

  • 确保 ngx_http_realip_module 模块已正确加载。可以通过 nginx -V 命令检查模块是否已编译进 Nginx。
  • 配置 set_real_ip_from 时,确保所有可信的代理服务器 IP 地址或范围都已包含在内,否则可能导致真实 IP 提取错误。
  • 如果 X-Forwarded-For 头字段中包含多个 IP 地址,且未启用 real_ip_recursive,Nginx 默认会使用最右边的 IP 地址作为真实客户端 IP。
纠错
反馈