0x01 前言

最近在为nginx调试与配置fail2ban,在检查日志的时候发现naxsi(安装naxsi为nginx提供WAF服务)的日志中来自上游反代服务器的请求都是同一个IP:都是反代服务器自身的公网IP。

在这种情况下启用fail2ban肯定会导致反代服务器的IP被ban。经过检查,我发现网站的访问日志和nginx自身的错误日志都可以正确地获取访客IP(为处于后端的WordPress传递正确的用户IP),我分别为nginx和apache定义了XForwardedFor的相关参数:

#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 其他