Nginx(八)日志和获取客户端真实的ip

您所在的位置:网站首页 美团访客增加真实 Nginx(八)日志和获取客户端真实的ip

Nginx(八)日志和获取客户端真实的ip

2023-08-28 09:04| 来源: 网络整理| 查看: 265

一  nginx关于日志的配置

备注: main'不是日志级别',而是采用的'日志格式'

日志官方参考

(1)错误日志配置

针对虚拟主机设置

server { access_log /data/log/www; '核心' listen 80; server_name www.wzj.com; location / { root /data/www/www; index index.html index.htm; } error_log logs/error_www.wzj.com.log error; '核心' } access_log off; --> 关闭access_log,即'不记录访问日志'

(2)日志格式

注意:log_format配置'必须放在http内',否则会出现'警告'信息

$request_time:'整个请求'的总时间 $upstream_response_time:请求过程中,'upstream的响应时间' -->'502和504报错'

二  Nginx日志分隔

三  Nginx日志了解业务状态

四   通过代理获取客户端真实的ip

具体的业务场景: 通过'WAF和CDN'去获取客户端的'真实ip'

CDN获取客户端真实的ip

默认 'ngx_http_realip_module' 这个模块是安装的 --> Nginx作为负载均衡'获取真实IP'依赖该http_realip_module模块 环境说明: A nginx'配置了反向代理','后端服务器'B也是nginx,'后端服务器B'去'获取客户端真实的ip',而'不是'代理服务器的ip ++++++++++'各组件的说明'++++++++++ 'proxy':172.25.2.100 'backend':172.25.2.200、172.25.2.201 'client': 172.25.2.202

 1)代理服务器的配置

'错误的'方式

备注:'正确'方式

2)backend的首页面的修改

3)客户端测试

备注: 172.25.2.202没有做本地解析'/etc/hosts',curl通过'--resolve'来进行本地解析

查看proxy的日志

查看两个backend的日志

结论: 很明显'默认的配置',backend并不能'获取客户端真实的ip'

4)获取客户端的ip

各种场景获取客户端真实的ip

CDN下nginx获取用户真实IP地址

备注: 从上面的日志中我们可以看出'proxy'已经获取客户端的ip,我们只需要让'proxy'在转发请求的时候'透传'出去即可 ++++++++++++++'分割线' 备注: 我们需要知道整个流量的走向,换句话说'经过了多少个代理'-->'proxy'

与代理相关的变量

场景1: '不修改'backend的日志格式 +++++++++++++'分割线'+++++++++++++ 上面我们已经知道:默认情况下,'remote_addr'是跟其直连的ip,可能为'proxy'或者'client' 思路1: proxy在透传的时候直接修改'backend'要获取的'remote_addr'的数值 log_format默认的 '$http_x_forwarded_for'就是'proxy_set_header X-Forwarded-For $remote_addr;'这个'代理转发请求头'的值 ++++++++++'分割线'++++++++++ 从'默认的日志'可以看出: 该变量的值为'-'表示置空,即表示设置该请求头 172.25.2.200 - - [26/Dec/2020:22:18:53 -0500] "GET / HTTP/1.0" 200 7 "-" "curl/7.29.0" "-"

修改proxy的配置文件

测试

两个'backend'都'获取客户端的真实ip'

'场景2': 修改proxy的配置文件-->修改'backend'的日志格式

5)二层代理

场景说明: 172.25.2.202('client') --> 172.25.2.100(proxy) --> 172.25.2.200(proxy) --> 172.25.2.201('backend')

核心两个请求头

proxy_set_header X-Real-IP $remote_addr; 获取的是'直接TCP连接'的客户端IP这个是'无法伪造'的 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; --> 特点: 将上一层的'X-Forwarded-For' 进行叠加传给'proxy_add_x_forwarded_for'作为心得XFF头 拿到用户从请求源头到应用'所经过的各个代理IP呢'

一级代理

这个理解不错

只有'客户端直接请求到'的那个'proxy nginx'能够拿到'客户端的真实IP',所以第一级'proxy nginx'配置了 proxy_set_header X-Real-IP $remote_addr; 备注: 这个请求头在'日志中没有体现' --> '$http_x_real_ip'加入日志的格式中 原因: 'http_x_real_ip' 记录的是和自己直接相连接的'上游服务器的ip',也即自己接受的请求是从哪里'发送或转发'过来的 +++++++++++++++'分割线'+++++++++++++++ 说明:下面的日志中都没有'进行改动'

说明: 实际上'X-Real-IP'这个请求头在这里'没有意义',日志中'没有体现'的到

二级代理

客户端测试

说明: 显然每级'proxy'中XFF为-->'client ip proxy1 proxy(n-1)' -->'以空格隔开' 备注:n>2 为上面的格式 说明:n=1为'-',n=2为'client ip'

说明: 'remote_addr' 从二级代理一直到第最后一级的代理,包括backend,都是'第一级'代理的IP +++++++++++++'思考' 为什么backend的'remote_addr'不是上一级的'proxy'的IP?

备注: '后台服务器'获取真实的客户端ip地址,headers中的X-Forwarded-For选项中'逗号前第一个'ip就是真实客户端ip

比较有研究价值的博客

从限流谈到伪造 IP

获取客户端的ip



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3