fail2ban 保护 nginx 方案

13 小时 46 分钟前
 cowiejulewbfwo

Docker Nginx (Host Mode) + Fail2Ban 完整指南

本教程适用于使用 --network host 模式运行 Nginx 容器的场景。在此模式下,Fail2Ban 配置比 Bridge 模式更简单,因为不需要处理 Docker 的 NAT 转发链。


📌 环境信息


第一步:确认容器运行状态

请确保您已使用 Host 模式启动容器:

# 停止并删除旧容器
docker rm -f nginx01

# 启动新容器( Host 模式)
docker run -d \
  --name nginx01 \
  --restart always \
  --network host \
  -v "/root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf" \
  -v "/root/nginx/html:/usr/share/nginx/html" \
  -v "/root/nginx/cert:/etc/nginx/cert" \
  -v "/root/nginx/log:/var/log/nginx" \
  --add-host=host.docker.internal:host-gateway \
  nginx

第二步:配置 Fail2Ban 过滤器

我们需要创建规则来告诉 Fail2Ban 什么是恶意行为。

1. 防恶意扫描( Bad Request )

拦截扫描敏感文件(如 .env, wp-login.php)的攻击者。

sudo nano /etc/fail2ban/filter.d/nginx-bad-request.conf
[Definition]
failregex = ^<HOST> - - .* "(GET|POST|HEAD) .*\.(php|asp|aspx|jsp|cgi|env|git|yml|sql|bak|tar|gz|zip|rar|sh) HTTP.*" (400|401|403|404) .*$
            ^<HOST> - - .* "(GET|POST|HEAD) .*/(phpmyadmin|admin|setup|manager|dashboard|wp-login|xmlrpc).* HTTP.*" (400|401|403|404) .*$
ignoregex =

2. 防高频 CC 攻击( Anti-Flood )

拦截请求频率过高的 IP ,但排除静态资源(图片、CSS 等)以免误封。

sudo nano /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
failregex = ^<HOST> - - .* "(GET|POST|HEAD).*HTTP.*" .*$
# 忽略图片、CSS 、JS 等静态资源
ignoregex = \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|mp4|webm) HTTP

第三步:配置监狱(jail.local

这是 Host 模式与 Bridge 模式最大的区别点。**Host 模式下,我们不需要指定 chain = DOCKER-USER**。

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# 白名单 IP:即使这些 IP 触发规则也不会被封
# 建议加上 localhost
ignoreip = 127.0.0.1/8 192.168.0.0/16 10.0.0.0/8

# 默认封禁时间:1 小时
bantime  = 1h
# 查找时间窗口:10 分钟
findtime = 10m
# 最大尝试次数:5 次
maxretry = 5

# --- Host 模式动作配置 ---
# 直接使用标准 iptables-multiport 即可,无需指定 chain
banaction = iptables-multiport

# ==========================================
# 规则 1:防止恶意扫描
# ==========================================
[nginx-bad-request]
enabled  = true
logpath  = /root/nginx/log/access.log
filter   = nginx-bad-request
port     = 80,443
maxretry = 3
bantime  = 24h

# ==========================================
# 规则 2:防止 CC 攻击
# ==========================================
[nginx-cc]
enabled  = true
logpath  = /root/nginx/log/access.log
filter   = nginx-cc
port     = 80,443
findtime = 60
# 允许每分钟 120 次非静态资源请求
maxretry = 120
bantime  = 2h

第四步:重启与验证

1. 重启 Fail2Ban

sudo systemctl restart fail2ban

2. 验证状态

sudo fail2ban-client status

应看到以下两个监狱处于活动状态:

3. 验证防火墙规则

检查 INPUT 链( Host 模式走这里):

sudo iptables -L INPUT -n

确认规则中出现针对目标 IP 的 DROPREJECT 记录,表示封禁生效。


完成!
您的 Nginx 容器已在 Host 模式下成功集成 Fail2Ban ,具备抵御恶意扫描与 CC 攻击的能力。

556 次点击
所在节点    NGINX
2 条回复
ethusdt
13 小时 1 分钟前
虽然像 AI 写的,不过还算完整,刚好今天我也发了相关的帖子。

另外还要在 nginx 上配置下 `set_real_ip_from` 哦,否则恶意流量添加 X-Forwarded-For: 8.8.8.8 这种 header ,你的 nginx 日志会记录成 8.8.8.8 而忽略了源请求地址。
cowiejulewbfwo
12 小时 21 分钟前
@ethusdt 感谢补充。
现在其实都是 ai 写的,只要内容详实没问题就好。就怕用 ai 制造垃圾信息这就很恶心了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1175687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX