Nginx获取客户端真实IP(real_ip_header)的实现

 更新时间:2024年10月13日 16:06:06   作者:shy好好学习  
在使用Nginx作为反向代理时,确保获取客户端真实IP是关键,通过配置real_ip_header和set_real_ip_from,Nginx可以正确解析X-Forwarded-For头部信息,并更新$remote_addr为客户端真实IP,下面就来具体介绍一下

在使用 Nginx 作为反向代理或负载均衡器时,我们常常需要获取客户端的真实 IP 地址。然而,默认情况下,Nginx 的 $remote_addr 变量记录的 IP 地址可能是上游代理或负载均衡器的 IP,而非实际客户端的 IP。为了确保我们能够正确获取和记录客户端的真实 IP,本文将介绍如何配置 Nginx,并进行调试。

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

1、基本配置说明

首先,我们需要确保 Nginx 能够正确解析来自上游代理或负载均衡器的 X-Forwarded-For 头部信息。通过配置 real_ip_header 和 set_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

在 Nginx 中,set_real_ip_from 指令用于定义哪些 IP 地址或 IP 地址段是被信任的。根据请求来源 IP 地址是否在 set_real_ip_from 指定的范围内,Nginx 的行为会有所不同,具体区别如下:

2、set_real_ip_from详解

1. 请求来源 IP 在 set_real_ip_from 范围内

如果请求来源的 IP 地址在 set_real_ip_from 指定的范围内,Nginx 会信任该请求,并使用 real_ip_header 指定的头部(如 X-Forwarded-For)中的值作为客户端的真实 IP 地址。

行为:

  • Nginx 使用 X-Forwarded-For 头中的第一个(最左边的)IP 地址作为 $remote_addr(即客户端的真实 IP 地址)。
  • 这种情况通常出现在负载均衡器或反向代理服务器前端,它们会添加 X-Forwarded-For 头来指示真实的客户端 IP。

2. 请求来源 IP 不在 set_real_ip_from 范围内

如果请求来源的 IP 地址不在 set_real_ip_from 指定的范围内,Nginx 不会信任这个请求中的 X-Forwarded-For 头部中的 IP 地址。

行为:

  • Nginx 直接使用请求来源的 IP 地址(即 $remote_addr)作为客户端的 IP 地址。
  • 这意味着 Nginx 会将负载均衡器或代理服务器的 IP 地址视为客户端的 IP,而不会考虑 X-Forwarded-For 头中的值。

场景分析:

  • 在范围内: 如果你有一个负载均衡器,所有请求都会先经过它再到达 Nginx。负载均衡器会在请求头中加入 X-Forwarded-For 以记录客户端的真实 IP。如果你将负载均衡器的 IP 地址配置在 set_real_ip_from 中,Nginx 会读取并信任 X-Forwarded-For 中的客户端真实 IP。

  • 不在范围内: 如果请求不是通过你信任的负载均衡器发来的(可能是直接访问 Nginx,或者来自不可信的代理服务器),Nginx 会认为这个请求中的 X-Forwarded-For 不可信,于是使用实际请求来源 IP(负载均衡器或代理的 IP 地址)作为客户端 IP。

3、log_format 配置(参考)

配置日志格式时,可以直接使用 $remote_addr 变量。Nginx 在解析 real_ip_header 后,会自动将 $remote_addr 替换为解析后的真实 IP 地址。

日志格式配置

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 头部的内容。

添加调试日志

可以通过下面的配置,将 X-Forwarded-For 头部记录到一个专门的调试日志文件中。

调试日志配置

log_format debug '$http_x_forwarded_for';
access_log /path/to/log/debug.log debug;

通过这一配置,你可以在调试过程中直接查看 X-Forwarded-For 头部的内容,以确认它是否包含客户端的真实 IP 地址。

检查调试日志

配置完成后,重启 Nginx,并通过访问应用生成一些日志。然后,查看调试日志 /path/to/log/debug.log 以验证 X-Forwarded-For 头部的值。

tail -f /path/to/log/debug.log

如果 X-Forwarded-For 头部中包含了客户端的真实 IP 地址,那么说明配置正确,Nginx 能够正确获取并记录客户端的真实 IP。

三、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。这在用户跟踪或日志记录中非常有用。

四、总结

通过正确配置 real_ip_header 和 set_real_ip_from,我们可以确保 Nginx 能够通过 $remote_addr 获取并记录客户端的真实 IP 地址。在配置完成后,通过调试日志可以验证配置是否生效。如果你在 Lua 中需要获取真实 IP,可以直接使用 ngx.var.remote_addr

到此这篇关于Nginx获取客户端真实IP(real_ip_header)的实现的文章就介绍到这了,更多相关Nginx获取客户端真实IP内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx 服务器安装及配置文件详解介绍

    Nginx 服务器安装及配置文件详解介绍

    这篇文章主要介绍了Nginx 服务器安装及配置文件详解介绍,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • Nginx访问慢问题解决办法(慢1s)

    Nginx访问慢问题解决办法(慢1s)

    这篇文章主要给大家介绍了关于Nginx访问慢问题解决办法的相关资料,访问速度对网站是极为关键的因素,而服务器对其影响最为深远,需要的朋友可以参考下
    2023-08-08
  • Nginx与后台应用端口冲突的解决方案

    Nginx与后台应用端口冲突的解决方案

    在部署Web应用时,Nginx和后台应用(如Node.js、Python Flask、Java Spring Boot等)常常需要同时运行在一台服务器上,然而,当它们需要监听同一个端口(如8000)时,就会出现端口冲突的问题,本文将详细介绍几种解决Nginx与后台应用端口冲突的方法
    2025-02-02
  • Nginx跨域访问场景配置和防盗链详解

    Nginx跨域访问场景配置和防盗链详解

    这篇文章主要介绍了Nginx跨域访问场景配置和防盗链详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Nginx捕获并自定义proxy_pass返回的错误问题

    Nginx捕获并自定义proxy_pass返回的错误问题

    这篇文章主要介绍了Nginx捕获并自定义proxy_pass返回的错误问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Windows设置nginx启动端口的方法

    Windows设置nginx启动端口的方法

    在服务器配置与开发过程中,nginx 作为一款高效的 HTTP 和反向代理服务器,被广泛应用,而在 Windows 系统中,合理设置 nginx 的启动端口,是确保其正常运行与满足业务需求的关键步骤,本文将详细介绍 Windows 设置 nginx 启动端口的方法,需要的朋友可以参考下
    2025-02-02
  • Nginx Lua Waf 插件一键部署的操作示例

    Nginx Lua Waf 插件一键部署的操作示例

    这篇文章主要介绍了Nginx Lua Waf 插件一键部署的操作示例,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Nginx服务器配置性能优化方案

    Nginx服务器配置性能优化方案

    这篇文章主要为大家详细介绍了Nginx服务器配置性能优化方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Nginx动态IP黑名单的实现步骤

    Nginx动态IP黑名单的实现步骤

    为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单,本文主要介绍了Nginx动态IP黑名单的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Nginx服务器中HTTP 301跳转到带www的域名的方法

    Nginx服务器中HTTP 301跳转到带www的域名的方法

    这篇文章主要介绍了Nginx服务器中HTTP 301跳转到带www的域名的方法,包括从HTTPS 301提示跳转等rewrite相关的方法,需要的朋友可以参考下
    2015-07-07

最新评论