1243  
查询码:00000157
nginx网站使用CDN之后禁止用户真实IP访问或者加IP白名单的方法
作者: wyasw 于 2020年03月29日 发布在分类 / Linux / web服务 下,并于 2020年03月29日 编辑
nginx

nginx网站使用CDN之后禁止用户真实IP访问或者加IP白名单的方法

做过面向公网WEB的运维人员经常会遇见恶意扫描、拉取、注入等图谋不轨的行为,对于直接对外的WEB服务器,我们可以直接通过 iptables Nginx deny指令或是程序来ban掉这些恶意请求。

而对于套了一层 CDN 或代理的网站,这些方法可能就失效了。

1.1  nginx获取真实ip

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 在直接访问模式中将会是空值!

1.2 添加IP黑名单,即添加的ip不能够访问

##注意在server标签里边添加

#如果真实IP 123.123.123.123148.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访问。脑洞大开

1.3 添加IP白名单,即除了添加的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 {

    }



 推荐知识

 历史版本

修改日期 修改人 备注
2020-03-29 20:28:24[当前版本] wyasw 创建版本

  目录
    文艺知识分享平台 -V 4.9.5 -wcp
    京公网安备100012199188号 京ICP备2021030911号