Nginx 禁止通过IP直接访问网站

释放双眼,带上耳机,听听看~!
Nginx可以部署在网络上使用FastCGI脚本、SCGI处理程序、WSGI应用服务器或Phusion Passenger模块的动态HTTP内容,并可作为软件负载均衡器。

问题起源

近日,在网站后台发现有部分非法请求,企图通过网站IP+常用网站路径的方式非法获取网站后台实施攻击,以PHP的各种框架最为严重(例如wordpress的后台IP/wp-login.php)

问题研究

既然知道了问题,我们不妨来想想解决方案,我发现其大部分非法请求IP都是国外的(显然为躲避监管使用了代理),最简单粗暴的办法就是对于国外IP一律禁止访问,但是咱们博客也得面向全球不是,因噎废食的事情咱不能干,所以此方案显然不是最优。

第二个方案是在程序中根据请求路径控制IP访问,对于非法访问的IP全部关进小黑屋,但是手动去辨别这些非法请求太过于麻烦,所以再考虑升级一下,咱们针对请求路径进行正则匹配,一旦包含非法路径,IP就关进小黑屋,但是这个正则无法去包含全部路径特征,我们必须不断去增加,修改,完善,也很麻烦。

我们再考虑一下,这些访问请求都有明显特征,它们都是通过IP直接访问网站,而不是通过域名(它不知道我们域名),而我们在生产环境中访问网站一般只会通过域名来访问,所以IP直接访问我们可以考虑禁止,我的网站基于Nginx,要实现这个功能,只需要更改相关配置即可,比较简单。

对比这些方案,显然最后一个更为合适。

问题解决

打开nginx配置

vim nginx.conf

在http中新增修改server,http转向https,https中加判断,如果指向IP,返回444(No Response 没有响应)

server {
          listen       80;
          server_name  localhost;
          rewrite ^(.*) https://$host$1 permanent;
     }
 
server {
         listen 443 ssl;
         server_name www.server.com
         if ($host = 'IP') {
            return 444;
         }
     }

测试配置文件:

../sbin/nginx -t

成功后重载配置文件

../sbin/nginx -s reload

测试

返回444,已经不可以访问啦!

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新消息 消息中心
有新私信 私信列表
搜索