惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
C
Check Point Blog
Last Week in AI
Last Week in AI
F
Fortinet All Blogs
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 新电脑 brew install node 之后,一个小设置可以提升对供应链投毒的防御 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用? 做了个 AI + 真人专家监督的广告投放平台 Auxora, 7 个品牌跑出 6x ROAS
fail2ban 保护 nginx 方案
cowiejulewbfwo · 2025-11-28 · via V2EX

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

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


📌 环境信息

  • 运行模式:Docker (Host Network)
  • 日志路径/root/nginx/log/access.log
  • 监听端口:宿主机直接监听 80/443

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

请确保您已使用 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

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

  • nginx-bad-request
  • nginx-cc

3. 验证防火墙规则

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

sudo iptables -L INPUT -n

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


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