您的当前位置:首页正文

使用Nginx获取客户端真实IP(real_ip_header)

2024-10-23 来源:个人技术集锦

使用 Nginx 获取客户端真实 IP

一、配置 Nginx 获取客户端真实 IP

1、基本配置说明

首先,我们需要确保 Nginx 能够正确解析来自上游代理或负载均衡器的 X-Forwarded-For 头部信息。通过配置 real_ip_headerset_real_ip_from,Nginx 可以将 $remote_addr 更新为客户端的真实 IP。

示例配置

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;

    # 设置真实 IP 的头部信息
    real_ip_header X-Forwarded-For;

    # 指定可信任的上游代理 IP 范围,这里以 172.0.0.0/8 为例(就是你负载均衡的ip网段)
    set_real_ip_from 172.0.0.0/8;

    # 其他配置
    ...
}
  • real_ip_header X-Forwarded-For;:指定从哪个头部获取客户端的真实 IP 地址。常见的头部包括 X-Forwarded-ForX-Real-IP 等。
  • set_real_ip_from 172.0.0.0/8;:指定哪些 IP 地址段的请求可以被信任。如果请求来自这些地址段,那么 Nginx 会根据 real_ip_header 的配置更新 $remote_addr

2、set_real_ip_from详解

1. 请求来源 IP 在 set_real_ip_from 范围内
行为:
  • Nginx 使用 X-Forwarded-For 头中的第一个(最左边的)IP 地址作为 $remote_addr(即客户端的真实 IP 地址)。
  • 这种情况通常出现在负载均衡器或反向代理服务器前端,它们会添加 X-Forwarded-For 头来指示真实的客户端 IP。
2. 请求来源 IP 不在 set_real_ip_from 范围内
行为:
  • Nginx 直接使用请求来源的 IP 地址(即 $remote_addr)作为客户端的 IP 地址。
  • 这意味着 Nginx 会将负载均衡器或代理服务器的 IP 地址视为客户端的 IP,而不会考虑 X-Forwarded-For 头中的值。
场景分析:

3、log_format 配置(参考)

日志格式配置

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
  • $remote_addr:在配置了 real_ip_header 之后,这个变量将代表客户端的真实 IP 地址。

二、调试与测试

为了确保配置正确,我们可以使用一个简单的调试日志来测试 X-Forwarded-For 头部的内容。

三、Lua 中使用客户端真实 IP(参考)

在实际应用中,如果你使用了 OpenResty 或 Nginx 的 Lua 模块,可以在 Lua 代码中使用 ngx.var.remote_addr 来获取解析后的真实 IP。

示例代码

access_by_lua "
local uid = ngx.var.cookie_bb_id
if not uid then
    uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
    ngx.header['Set-Cookie'] = 'bb_id=' .. uid .. '; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 3650*86400) .. '; Secure; SameSite=None'
end
";

在上面的 Lua 代码中,ngx.var.remote_addr 会获取到解析后的客户端真实 IP。这在用户跟踪或日志记录中非常有用。

四、总结

这篇博客介绍了如何配置、调试并验证 Nginx 的真实 IP 获取配置,希望能对你有所帮助。如果你在实际操作中遇到其他问题,欢迎进一步探讨!

显示全文