坏人还是有的(Nginx 拒绝指定IP访问)

  • A+
所属分类:Nginx

闲来无事,登陆服务器,发现有个IP不断的猜测路径、试图往服务器上传文件(木马)。于是查看了之前的日志,无奈鄙站被攻击者盯上了,不断的有不同的IP试图上传木马。看来坏人还是有的。由于不想让鄙站沦为肉鸡,所以就想写个简单的脚本,来阻止攻击者的IP访问。

攻击者:

法国的哥们竟然试了180多次!辛苦了。

shell 和定时任务来实现吧。>_<

网站跑在 Nginx 上,所以可以使用 Nginx 的 Deny 来拒绝攻击者的IP访问。

那么思路就出来了,定期(五分钟或十分钟)获取攻击者的IP,将IP放入到黑名单(Nginx 配置文件),并 reload 使其生效。

由于前期规划的比较好,网站的访问日志放在了一个指定的目录,Nginx 的错误日志也放在了一个指定的目录。网站的访问日志每日进行切割。Nginx 的错误日志没有进行切割。

下面就是我的思路和操作步骤:

通过 Nginx 的错误日志(为什么不使用访问日志)来获取攻击者的IP。之前没有对 Nginx 的错误日志进行定时切割,为了方便统计攻击者的IP所以,编写脚本并加入定时任务,使错误日志每小时切割一次,并且每小时对黑名单文件进行清空。

错误日志切割、清空黑名单脚本:

获取攻击者IP脚本:

该脚本从 Nginx 的错误日志中统计出超过20次试图猜测路径或上传文件的IP,并将这些IP加入到 Nginx 的配置文件。若有新增加的IP则 reload Nginx 使配置文件生效,若没有新增IP则不进行reload。

将拒绝指定IP访问的配置文件(黑名单)单独存放,并在 nginx 主配置文件中 include 进去。

blockip.conf 文件格式如下:

将脚本放入定时任务执行:

每小时对 Nginx 的错误日志进行切割并且清空一次被拒绝访问IP的配置文件,若不清空的话,此IP将终生不能访问,若它再次攻击则会再次进入黑名单,>_<。 清空命令放在了切割脚本的尾部。

可以自己决定统计频率,根据指定的频率执行脚本,获取攻击者的IP,若此IP已经在黑名单中,则会忽略掉(由于错误日志一小时切割一次,所以在一小时内会出现重复的IP)。然后把剩下的新攻击者的IP追加到黑名单。并 reload Nginx 。若没有新增的攻击者IP则什么都不做。

以下是脚本运行一段时间的攻击者IP

过段时间,再列出一份黑名单IP,看是否有变化。

看来多少还是管点用的。一共 access forbidden by rule 了 102-24=78 次。

适当的改改脚本,保存黑名单的历史数据,定期将大于1000的IP直接放入iptables!

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~

评论已关闭!

目前评论:21   其中:访客  21   博主  0

    • ' 渐行渐远 9

      厉害了老哥,晚辈佩服佩服。脚本玩得66的,我目前在用iptables来做非法ip的屏蔽,看到了此文,学习了! :mrgreen:

      • 匿名 9

        百度云观测啊 https://ticket-baidu.kf5.com/posts/view/4536/

        • 匿名 9

          博主,你的IP有的是百度云观测的,最新的发现https://ticket-baidu.kf5.com/posts/view/4536/

          • KeithYu 0

            今天我的博客也被人猜测路径了,竟然用的评论方式,评论了54次,那个人的ip事180.97.106.162。搜这个ip,搜到这的。

              • 匿名 9

                @KeithYu 同样搜这个IP 搜到这里了。最后发现里面有的IP 是百度云观测的
                https://ticket-baidu.kf5.com/posts/view/4536/

              • 蚊子 9

                这个怎样防止误杀正常的搜索引擎?

                • 匿名 9

                  这个有风险,现在很多运营商做劫持,正常用户都是代理服务器出来的,你会屏蔽掉正常用户

                  • Fancy 0

                    学习了

                    • 消失的853 0

                      表示我的网站一直有人在猜密码。。。
                      错误限制在2次之内,锁定2次将延长锁定时间到10天。。。。
                      可是猜密码ip不是固定的,不知道怎么ban

                      • 天启 9

                        if ($request_method = POST) {
                        return 405;
                        }

                        • 叮里个咚 9

                          CDN在前端这个无效吧

                          • 默北 默北 6

                            nginx + lua +redis 来搞

                            • 异类深呼吸 1

                              cool 我们也使用了这种方式限制IP,思路一样,但是这种实现比我们简练,学习了

                                • www.z-dig.com 9

                                  @异类深呼吸 www.z-dig.com
                                  互相学习

                                  • www.z-dig.com 1

                                    @异类深呼吸 你们怎样实现的?

                                  • 香港虚拟主机 0

                                    Nginx 拒绝指定IP访问,Nginx 还可以实现这个功能?非常的牛逼额

                                      • 蚊子 9

                                        @香港虚拟主机 这是最基本的功能咯,apache也是一样有这个功能的;
                                        也可放在.htaccess文件里禁止,不用重启服务;