在项目中,注册页面上发送短信验证码没有判断图形验证码是否正确,就发送验证码了,结果被攻击了,nginx的access.log看到访问的ip,并将访问过多的ip选择出来,临时用nginx限制ip访问。后面修改代码,重新发版。
但是,对于套了一层 CDN 或代理的网站,通过 iptables 、 Nginx 的 deny 指令或者是程序来 控制掉这些恶意请求,这些方法可能就失效了。
1拿到用户真实 IP,只要在 Nginx 的 http 模块内加入如下配置:
1 2 3 4 5 | #获取用户真实IP,并赋值给变量$clientRealIP map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } |
2通过对 $clientRealIP 这个变量的判断,Nginx 就能实现隔山打牛的目的,而且规则简单易懂:
Shell
1 2 3 4 5 6 7 8 | #如果真实IP为 121.42.0.18、121.42.0.19,那么返回403 if ($clientRealIp ~* "121.42.0.18|121.42.0.19") { #如果你的nginx安装了echo模块,还能如下输出语言,狠狠的发泄你的不满(但不兼容返回403,试试200吧)! #add_header Content-Type text/plain; #echo "son of a bitch,you mother fucker,go fuck yourself!"; return 403; break; } |
把这个保存为 deny_ip.conf ,上传到 Nginx 的 conf 文件夹,然后在要生效的网站 server 模块中引入这个配置文件,并 Reload 重载 Nginx 即可生效:
1 2 | #禁止某些用户访问 include deny_ip.conf; |
如果再想添加其他要禁止的 IP,只需要编辑这个文件,插入要禁止的 IP,使用分隔符 | 隔开即可,记得每次修改都需要 reload 重载 Nginx 才能生效。