做过面向公网WEB的运维人员经常会遇见恶意扫描、拉取、注入等图谋不轨的行为,对于直接对外的WEB服务器,我们可以直接通过 iptables 、Nginx 的deny指令或是程序来ban掉这些恶意请求。
而对于套了一层 CDN 或代理的网站,这些方法可能就失效了。
在nginx.conf里边添加
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
那么,$clientRealIP就是用户真实IP了,其实就是匹配了 $http_x_forwarded_for 的第一个值,
其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录
X-Forwarded-For : 用户IP, 代理服务器IP
如果中间经历了不止一个代理服务器,这个记录会是这样
X-Forwarded-For : 用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….
可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。
而且代码中还配合使用了 $remote_addr,因此$clientRealIP 还能兼容上文中第1种直接访问模式,不像 $http_x_forwarded_for 在直接访问模式中将会是空值!
##注意在server标签里边添加
#如果真实IP为 123.123.123.123、148.11.66.11,那么返回403
location / 中添加
if ($clientRealIp ~* "123.123.123.123|148.11.66.11") {
#如果你的nginx安装了echo模块,还能如下输出语言,狠狠的发泄你的不满(但不兼容返回403,试试200吧)!
#add_header Content-Type text/plain;
#echo "不允许访问!";
return 403;
break;
}
##还可以添加403错误页面。即加了IP黑名单的IP访问则返回403界面
error_page 403/403.html;
location = /403.html {
}
403页面里可以写:此页面禁止此IP访问。脑洞大开
location / 中添加
if ($clientRealIp ~* "123.123.123.123|114.242.31.175") {
break;
}
return 411;
}
##还可以添加411错误页面。即不是IP白名单的IP访问则返回411界面
error_page 411 /411.html;
location = /411.html {
}