近期运维排查服务器,发现某个应用的服务器在某个时间端内发现一些IP地址或是一些IP段请求量巨大,持续一段时间后停止,类似情况持续半个月时间了,经过对IP端定位发现为外省IP,考虑小程序的使用用户群体,初步确定为非法请求,需要尽快处理。
网站服务器运营环境由NGINX搭建集群使用,方案考虑通过nginx中禁止IP的方法禁止,并思考增加自动化屏蔽的方案,避免人工维护的问题。
NGINX禁止IP访问的方法
1.在 nginx 的安装目录中,查到 conf 文件夹,并在其文件夹中 创建 blocksip.conf 文件。
2.编辑 blocksip.conf 文件,并加入以下代码 :127.0.0.1 为要封禁的 IP 地址
3.编辑 conf 文件夹下的 nginx.conf 文件,并加入以下代码
4.重启nginx 服务
经过测试完成对IP的封禁。
学习 关于deny的使用
1.nginx封锁禁止单个IP
2.nginx 封锁禁止多个IP
nginx封锁多个IP地址,多个IP地址由空格分开
3.nginx 封IP段即从127.255.0.1到127.255.255.254的命令
blocksip.conf:的格式还有许多种,可以配置只允许的IP访问或者IP段访问:
其中网段的写法是这样的:192.168.1.0/24这样的形式。
deny 192.168.1.11;
deny 192.168.1.123;
deny 10.0.1.0/24;
如果你想实现这样的应用,除了几个IP外,其他全部拒绝,在ip.balcklist中这样写
allow 192.168.1.1;
allow 192.168.1.2;
deny all;
也可以对单独网站屏蔽IP的方法
在server"{}",在这个大括号内加入deny IP地址是限制某IP地址访问;allow IP地址是只允许某IP地址访问;
思考:
根据固定IP端的封禁已经实现,那么如何实现nginx的自动禁封IP的功能?
分析现有步骤:
1.封禁IP的blocksip.conf 文件已增加,并已生效。
2.获取需要封禁IP的内容:
通过查看NGINX的access.log,获取IP内容。
NGINX的access.log的日志格式为:
相关说明解释:
1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200,
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;
其实nginx access日志的格式不是一成不变的,是可以自定义的。在nginx的nginx.conf配置文件找到:log_format 这里就是日志的格式。
以某个日志案例说明:
查看日志可以获取到该IP再不断的请求路径,访问数据。
查看日志中该IP的出现次数:
某天居然出现了2000+次,
查看该IP地址中检索到的访问者的地址信息为外地某省份,需要封禁该IP。
将IP地址增加到blocksip.conf 文件中,并重启nginx服务生效。
如何实现自动禁封?考虑使用shell 和定时任务来实现
实现思路:
1.通过shell 脚本抓取nginx 的错误日志中统计超过100次某请求的IP
2.将新获取的IP增加到nginx的配置文件blocksip.conf中,如果有新增的IP,则重启nginx服务,如没有新增IP则不需要重启。
3.将脚本加入定时任务重执行。
因Nginx 的错误日志进行根据时间切割,读取日志文件时需要注意时间格式对齐。增加对统计频率的判断为 10分钟一次,根据指定的频率执行脚本,获取攻击的IP,将攻击的IP追加到黑名单。判断是否有增加IP信息,如有增加重启 reload Nginx 服务 。若没有新增的IP则什么都不做。
自动执行脚本执行一段时间后,可人工介入进行检查,并适当调整脚本。
思考:
攻击IP较多的情况可直接加入防火墙禁止IP端的请求。
vi /etc/rc.d/init.d/iptables 保存规则
service iptables restart 重启iptables服务以便生效。