引言
在网站运营过程中,我们经常会遇到一些恶意的IP频繁访问,甚至进行攻击。为了保护网站的安全和稳定,我们可以使用Nginx来封禁这些恶意的IP。本文将介绍如何通过编写shell脚本,结合Nginx和crontab,实现自动封禁每分钟访问超过60次的IP。
一、Nginx封禁指定IP的实现
-
创建blockip.conf文件
在Nginx的
conf
目录下创建一个blockip.conf
文件,用于存放需要封禁的IP。格式如下:deny 192.168.1.1; deny 192.168.1.2;
-
修改Nginx配置
在Nginx的HTTP配置中添加如下内容,以包含
blockip.conf
文件:http { ... include /usr/local/nginx/conf/blockip.conf; ... }
-
重启Nginx
修改完配置后,重启Nginx以使配置生效:
/usr/local/nginx/sbin/nginx -s reload
-
验证封禁效果
尝试从被封禁的IP访问网站,应该会看到403禁止访问的提示。
二、使用AWK统计access.log,记录每分钟访问超过60次的IP
操作一:统计访问次数
我们可以使用AWK来统计access.log
中每分钟访问超过60次的IP。以下是具体的命令:
awk '{print $1}' access.log | sort | uniq -cd | awk '{if($1>60)print $0}'
awk '{print $1}' access.log
:取出access.log
的第一列,即IP地址。sort | uniq -cd
:对IP地址进行排序、去重,并统计每个IP的出现次数。awk '{if($1>60)print $0}'
:判断每个IP的出现次数是否超过60次,如果超过则输出。
示例运行结果
假设access.log
中有以下内容:
192.168.1.1 - - [12/Mar/2023:12:00:01] "GET / HTTP/1.1" 200 123
192.168.1.1 - - [12/Mar/2023:12:00:02] "GET / HTTP/1.1" 200 123
...(省略多行)
192.168.1.1 - - [12/Mar/2023:12:01:00] "GET / HTTP/1.1" 200 123
192.168.1.2 - - [12/Mar/2023:12:01:01] "GET / HTTP/1.1" 200 123
运行上述AWK命令后,可能得到以下输出:
123 192.168.1.1
表示192.168.1.1
这个IP在日志中出现了123次,超过了60次。
三、编写shell脚本,实现自动封禁功能
以下是一个完整的shell脚本,用于自动封禁每分钟访问超过60次的IP:
#!/bin/bash
# 清除blockip.conf文件内容,以免误封IP
echo "" > /usr/local/nginx/conf/blockip.conf
# 统计每分钟访问超过60次的IP
ip_list=$(awk '{print $1}' /usr/local/nginx/logs/access.log | sort | uniq -cd | awk '{if($1>60)print $2}')
# 判断变量是否为空
if test -z "$ip_list"
then
# 为空则记录日志,并重新加载Nginx
echo "没有超过访问限制的IP" >> /usr/local/nginx/logs/11.log
/usr/local/nginx/sbin/nginx -s reload
else
# 如果不为空,则将IP以deny格式写入blockip.conf
for ip in $ip_list; do
echo "deny $ip;" >> /usr/local/nginx/conf/blockip.conf
done
# 重新加载Nginx
/usr/local/nginx/sbin/nginx -s reload
# 清空access.log,以便从最新日志开始统计(根据实际情况决定是否清空)
# echo "" > /usr/local/nginx/logs/access.log
fi
注意事项:
- 脚本中使用了
for
循环来处理多个超过访问限制的IP。 - 清空
access.log
的操作是可选的,根据实际情况决定是否执行。 - 确保脚本具有执行权限,可以使用
chmod +x ip_test.sh
来赋予权限。
示例运行结果
假设access.log
中有多个IP超过了访问限制,运行脚本后,blockip.conf
文件可能包含以下内容:
deny 192.168.1.1;
deny 192.168.1.2;
四、使用crontab定时执行脚本
为了定时检查并封禁恶意IP,我们可以使用crontab来定时执行上述脚本。
-
编辑crontab
crontab -e
-
添加定时任务
在crontab文件中添加以下行,以每分钟执行一次脚本:
* * * * * /usr/local/nginx/logs/ip_test.sh
确保脚本路径正确,且脚本具有执行权限。
-
重启crond服务
修改完crontab后,重启crond服务以使配置生效:
systemctl restart crond.service
结语
通过以上步骤,我们可以实现Nginx自动封禁每分钟访问超过60次的IP。这有助于保护网站的安全和稳定,防止恶意IP的频繁访问和攻击。希望本文对你有所帮助,如果有任何问题或建议,欢迎留言交流!