0x01 前言
最近在为nginx调试与配置fail2ban,在检查日志的时候发现naxsi(安装naxsi为nginx提供WAF服务)的日志中来自上游反代服务器的请求都是同一个IP:都是反代服务器自身的公网IP。
在这种情况下启用fail2ban肯定会导致反代服务器的IP被ban。经过检查,我发现网站的访问日志和nginx自身的错误日志都可以正确地获取访客IP(为处于后端的WordPress传递正确的用户IP),我分别为nginx和apache定义了X–Forwarded–For的相关参数:
#nginx proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #apache RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 127.0.0.1
0x02 问题
源站naxsi所生成的日志如下:
2017/01/10 08:45:46 [error] 11612#0: *500641 NAXSI_FMT: ip=118.89.52.242&server=ngx.hk&uri=/execute%20master..xp_getfiledetails%20'C:1.txt'&learning=0&vers=0.55&total_processed=113&total_blocked=1&block=1&cscore0=$SQL&score0=8&cscore1=$XSS&score1=16&zone0=URL&id0=1013&var_name0=, client: 118.89.52.242, server: ngx.hk, request: "GET /execute%20master..xp_getfiledetails%20'C:1.txt' HTTP/1.0", host: "ngx.hk"
上面是naxsi拦截到的疑似SQL注入攻击,日志中ip与client的值都是118.89.52.242,这个IP是我的反代服务器地址。
很明显,反代服务器并不会主动访问源站,那么问题肯定出在源站服务器上。
0x03 解决
经过翻查nginx的文档,我发现对于反向代理的服务器结构还有两条相关的配置:
- set_real_ip_from:指定上游服务器
- real_ip_header:指定获取访客IP的位置
比如我的上游服务器IP是:118.89.52.242,同时需要从X-Forwarded-For字段中获取访客IP,那么设置如下:
set_real_ip_from 118.89.52.242; real_ip_header X-Forwarded-For;
以上两个语句可以放置在http、server和location区块中,结合我的实际情况,我放置在http区块中。这将对所有的虚拟空间生效。
还需要注意的是,在使用以上两个语句之前,请确定你的nginx已经包含以下模块:
ngx_http_realip_module
该模块在默认情况下并不包含在内,编译的时候需要手动启用:
--with-http_realip_module
如果有需要,请参考以下文章:
重新加载nginx配置后再检查naxsi日志:
2017/05/07 13:33:05 [error] 43239#0: *1155167 NAXSI_FMT: ip=119.139.59.40&server=ngx.hk&uri=/&learning=0&vers=0.55&total_processed=23&total_blocked=1&block=1&cscore0=$TRAVERSAL&score0=8&zone0=ARGS&id0=1200&var_name0=, client: 119.139.59.40, server: ngx.hk, request: "GET /?../../ HTTP/1.0", host: "ngx.hk"
上面是我使用以下地址测试后的naxsi,可以看到,当访问反代服务器时,已经可以将正确的访客IP记录在案。
0x04 结语
有了正确的访客IP,结合日志和fail2ban,可以将恶意的访客阻挡在外。
0x05 其他
- nginx文档: