1、缘起
有些系统用户访问nginx之前会有CDN或WAF代理,此时nginx使用deny命令拒绝ip是行不通的。
deny 218.17.124.213
以waf为例,直接访问nginx的ip是waf的地址,通过nginx获取到的$remote_addr是waf的ip,
所以我们无法获取到客户端的一个真实ip来使用deny命令。
2、解决方案
1)如何获取客户端真实ip?
一般客户端发起请求,经过代理后,它在访问nginx时会以格式(客户端ip,代理ip1,代理ip2)被封装为一个$proxy_add_x_forwarded_for变量中
这个格式的第一个永远是客户端的真实ip,后面的分别是第一级代理的ip,第二级代理的ip。。。
2)使用nginx if命令加正则表达式和响应状态码方式实现拒绝访问
比如客户端的真实ip为 219.137.75.122,waf代理ip为 113.67.16.111 ,要限制这个客户端的访问,在经过waf代理后
# nginx中$proxy_add_x_forwarded_for的值为
219.137.75.122,113.67.16.111
最终在server块中加拦截配置
server {
# 注意if后面和右小括号的空格,不然nginx配置文件会报错
# 多个ip使用 | 隔开
if ($proxy_add_x_forwarded_for ~ ^(219.137.75.122)) {
return 403;
}
}
刷新nginx配置
./sbin/nginx -t # 测试配置文件是否正确
./sbin/nginx -s reload # 刷新配置文件