共计 1613 个字符,预计需要花费 5 分钟才能阅读完成。
本文所讲的是通过 Nginx 限流以达到防御 cc 攻击的目的,同时通过封禁 ip 可以对恶意请求禁止访问。
另外本文都是基于 Docker 搭建的 Nginx 和 fail2ban 所进行配置,如有路径问题还请自己注意。如果不懂搭建可以参考我的文章 Docker 搭建 Nginx 和 使用 fail2ban 防止 ssh 密码被暴力破解
一、配置 Nginx 限流
nginx.conf 配置
编辑 nginx.conf 文件,添加或修改代码,如下图所示:
日志格式:
log_format main '$remote_addr $status $request $body_bytes_sent [$time_local] $http_user_agent $http_referer $http_x_forwarded_for $upstream_addr $upstream_status $upstream_cache_status $upstream_response_time';
限流配置:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=150r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone
是限制每秒多少个请求。上面说我定义了一个 mylimit 规则,每秒中最多可以处理 150 个请求,接下来的请求根据 location 块中配置,决定是直接拒绝处理还是先放到队列中等处理完成 150 个请求以后在处理。
limit_conn_zone
是限制并发数量,具体的数量需要在 location 块中配置。
blog.conf 配置
blog.conf 这个是针对我博客的 nginx 配置文件的 server 块。
在 location 块中加入两行,如下所示:
location / {
limit_req zone=mylimit burst=5 nodelay;
limit_conn addr 10;
xxxx;
}
limit_req
指使用 nginx.conf 中配置 mylimit 规则。
limit_conn
指最大并发为 10,即单个IP同时并发连接数最多只能10个连接。
二、配置 fail2ban 封禁 ip
创建配置文件
mkdir -p /home/docker/fail2ban/data/jail.d && \
cat > /home/docker/fail2ban/data/jail.d/nginxcc.conf <<EOF
[nginxcc]
enabled = true
chain = INPUT
port = 80,443
filter = nginx-limit-req
logpath = /home/docker/nginx/logs/blog.error.log
maxretry = 120
findtime = 60
bantime = 10800
EOF
其他的不多说了,主要是 logpath 需要需要说明一下,这个是 nginx 的日志文件的位置,fail2ban 需要从日志里拿到攻击者的ip,然后进行封禁。
而我是 docker 搭建的 nginx,所以在宿主机外的文件位置是/home/docker/nginx/logs/blog.error.log
。
启动 fail2ban
docker run -d \
--name fail2ban \
--network host \
--cap-add NET_ADMIN \
--cap-add NET_RAW \
-v /home/docker/fail2ban/data:/data \
-v /var/log:/var/log:ro \
-v /home/docker/nginx/logs/:/home/docker/nginx/logs/:ro \
-e TZ=Asia/Shanghai \
--restart always \
crazymax/fail2ban:latest
这里把宿主机的 logs 文件夹映射到 fail2ban 容器内了。
三、测试
经过模拟 cc 攻击,发现 ip 被封禁。
提醒:本文发布于646天前,文中所关联的信息可能已发生改变,请知悉!