本文转载自互联网,已在文末注明来源。
防护CC攻击的主要手段是限制并发请求数量和请求速率. 并发请求数量指的是单ip
可以与服务器建立多少个连接,请求速率指的是单位时间内的请求数。两者有共同部分但意义不同,例如建立十个连接每个连接请求一次,也可以建立一个连接请求十次。前者是并发连接多,后者是请求速率高。
Nginx
既支持并发请求的限制,也支持按限制请求速率。防御CC攻击主要是限制速率,理论上速率限制得好就够了。实践中建议两者结合,既防止太多连接消耗服务器资源,也防止请求速率过快。
nginx
的有关操作
重启nginx
/usr/sbin/nginx -s reload
nginx
日志填坑
命令统计nginx
日志中访问最多的100个ip
及访问次数
awk '{print $1}' 日志地址 | sort | uniq -c | sort -n -k 1 -r | head -n 100
Nginx
防CC设置步骤
- 编辑
Nginx
配置文件,例如/etc/nginx/nginx.conf
, 在http
段分配计数内存:
limit_conn_zone $binary_remote_addr zone=limit_conn:10m;
limit_req_zone $binary_remote_addr zone=limit_req:10m rate=10r/s;
上述配置分配了 limit_conn
和 limit_req
两个10M
大小的内存块(1M
内存可记录16000
个会话),并设置每秒最大请求速率是10
次。
- 打开网站配置文件,例如
/etc/nginx/conf.d/ryzezr.com.conf
,在server
或者location
段中开启限制:
limit_conn limit_conn 5; # 并发连接数不超过5
limit_req zone=limit_req burst=10 nodelay;
其他设置
http
中设置每秒允许10个请求,即100毫秒一个,如果突然来10个连接,后面9个直接返回503错误,这是我们不愿意看到的。limit_req
中的 burst
参数用来处理突发请求,此时10个请求都会被接受以应对突发流量。如果再来10个,那就超出了允许的突发限制,Nginx
直接返回503错误。
nodelay
表示在允许突发请求的情况下,直接处理所有请求,而不是每100毫秒处理一个。
实践中请根据具体情况设置并发连接数和请求速率。数值过大会影响防御效果,太小则会影响正常用户使用。此外,建议总是启用 burst
和 nodelay
以应对突发流量。
在docker-compose.yml
中新增相关配置,如下
- ./log/nginx/:/var/log/nginx/:rw //将宿主机的目录映射到nginx所在的容器中
- ./conf/nginx/blacklist.conf:/etc/nginx/blacklist.conf:ro // 将需要ban 的ip 配置文件射到nginx宿主机中
services:
nginx:
image: anguiao/nginx-brotli
container_name: blog_nginx
ports:
- 80:80
- 443:443
volumes:
- ./www/:/var/www/html/:rw
- ./ssl/:/var/www/ssl/:ro
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf/nginx/ryzezr.com.conf:/etc/nginx/conf.d/ryzezr.com.conf:ro
- ./conf/nginx/blacklist.conf:/etc/nginx/blacklist.conf:ro
- ./log/nginx/:/var/log/nginx/:rw
restart: always
depends_on:
- fpm
- mysql
修改nginx
配置文件
nginx
配置文件结构请移步
使用 docker容器搭建typecho个人博客(docker-compose版)
在ryzezr.com.conf
末尾处添加代码
include /etc/nginx/blacklist.conf;
检测nginx
配置是否正确的操作
nginx -t -c xxx.conf
- -t 测试配置文件是否正确
- -c 指定文件路径
进入nginx
所在的容器重启nginx
docker exec -it blog_nginx /usr/sbin/nginx -s reload
deny ip
tail -n5000 /root/docker_typecho/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if($1>100)print "deny "$2";"}' > /root/docker_typecho/conf/nginx/blacklist.conf
形成自动脚本
#! /bin/sh
tail -n5000 /root/docker_typecho/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if($1>100)print "deny "$2";"}' > /root/docker_typecho/conf/nginx/blacklist.conf
echo > /root/docker_typecho/log/nginx/access.log
echo > /root/docker_typecho/log/nginx/error.log
docker exec -i blog_nginx /usr/sbin/nginx -s reload
添加可执行权限
chmod +x /root/docker_typecho/auto/nginx_ipblack_auto.sh
每十分钟执行一次
crontab -e
编辑内容如下:
*/10 * * * * /root/docker_typecho/auto/nginx_ipblack_auto.sh
参考引用
原文地址:
blog.ryzezr.com/archives/nginx_auto_ban_ip.html
版权属于:soarli
本文链接:https://blog.soarli.top/archives/576.html
转载时须注明出处及本声明。