ToB企服应用市场:ToB评测及商务社交产业平台

标题: 使用Nginx获取客户端真实IP(real_ip_header) [打印本页]

作者: 郭卫东    时间: 2024-11-26 06:23
标题: 使用Nginx获取客户端真实IP(real_ip_header)
使用 Nginx 获取客户端真实 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。
示例配置
  1. http {
  2.     include       mime.types;
  3.     default_type  application/octet-stream;
  4.     server_tokens off;
  5.     # 设置真实 IP 的头部信息
  6.     real_ip_header X-Forwarded-For;
  7.     # 指定可信任的上游代理 IP 范围,这里以 172.0.0.0/8 为例(就是你负载均衡的ip网段)
  8.     set_real_ip_from 172.0.0.0/8;
  9.     # 其他配置
  10.     ...
  11. }
复制代码

在 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 地址。
举动:


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

假如哀求来源的 IP 地址不在 set_real_ip_from 指定的范围内,Nginx 不会信托这个哀求中的 X-Forwarded-For 头部中的 IP 地址。
举动:


场景分析:


3、log_format 配置(参考)

配置日志格式时,可以直接使用 $remote_addr 变量。Nginx 在剖析 real_ip_header 后,会自动将 $remote_addr 替换为剖析后的真实 IP 地址。
日志格式配置
  1. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  2.                 '$status $body_bytes_sent "$http_referer" '
  3.                 '"$http_user_agent" "$http_x_forwarded_for"';
复制代码

二、调试与测试

为了确保配置精确,我们可以使用一个简单的调试日志来测试 X-Forwarded-For 头部的内容。
三、Lua 中使用客户端真实 IP(参考)

在实际应用中,假如你使用了 OpenResty 或 Nginx 的 Lua 模块,可以在 Lua 代码中使用 ngx.var.remote_addr 来获取剖析后的真实 IP。
示例代码
  1. access_by_lua "
  2. local uid = ngx.var.cookie_bb_id
  3. if not uid then
  4.     uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
  5.     ngx.header['Set-Cookie'] = 'bb_id=' .. uid .. '; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 3650*86400) .. '; Secure; SameSite=None'
  6. end
  7. ";
复制代码
在上面的 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 获取配置,渴望能对你有所帮助。假如你在实际操作中遇到其他问题,欢迎进一步探讨!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4