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

推荐订阅源

GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
WordPress大学
WordPress大学
博客园_首页
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
The GitHub Blog
The GitHub Blog
Schneier on Security
Schneier on Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
Jina AI
Jina AI
雷峰网
雷峰网
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
N
News and Events Feed by Topic
V2EX - 技术
V2EX - 技术
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
O
OpenAI News
P
Proofpoint News Feed
H
Help Net Security
S
Securelist
Vercel News
Vercel News
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - 三生石上(FineUI控件)

atpX

自建 S3 兼容对象存储服务 Garage 听风的歌 偶尔是深夜就好了 新玩具 AirPods Pro 3 公交车上的时间 从 WHOIS 到 RDAP 通过 WireGuard 访问 NFS 共享文件 自建音乐串流服务探索 我停止了探索 Fediverse 互联网背景噪音 我的数字生活降级 小城与确定性的墙 一只特立独行的猪 Fediverse 与社交 承认的勇气 mediaX - 轻量书影音记录管理工具 我的博客写作流程 网站新增 Misc 页面 擅长对线的鲍勃 在 Chroot 环境下使用 Rsync 同步 再见 JavaScript 当我玩博客时我在玩什么 为什么我的博客没有友链页面 小熊猫与大熊猫 (HDR 照片测试) 是时候为网站开启 HTTP/3 支持了吗 使用 AdGuard Home 搭建自用 DoH 服务 谈谈读书与消遣 2023 年终总结 西安两日游 从 AirPods「升级」到 EarPods Docker 搭建去中心化的微博客平台 Mastodon 聊聊 iPhone 15 Pro 使用感受 能否将 TOTP 二次验证存放在密码管理器里 认识史蒂夫·乔布斯 与“锤哥”克里斯·海姆斯沃斯一起养生 逃离爆炸的信息 你想活出怎样的人生 重温《龙珠》动画 为什么关闭评论 从域名注册商到 DNS 服务,找到自己的组合 如何提高用户网页阅读体验 从 Typecho 迁移到 Hugo 个人博客的最终归宿是静态网站吗 我选择了放弃 jQuery 关于我的小破站折腾速度优化这件事 记一次家庭网络折腾 贴一些 SmokePing 记录 我的域名邮箱选择 不存在的语录 Typecho 评论验证插件 CaptchaPlus 谈谈写字这件事 新的网站 Logo 探索 曲线解决 Typecho 图片占位抖动问题 自建 vaultwarden / bitwarden_rs 密码管理器 使用 Plausible 自建网站流量统计分析工具 如何优雅地徒手剥开火腿肠 简单的集中隔离生活记录 新玩具 M2 MacBook Air 使用 acme.sh 申请 Google 公共证书 Docker 搭建去中心化的微博客平台 Misskey 搭建 Lsky Pro 兰空图床 折腾树莓派系统的一天 我的吉卜力之旅 使用 Uptime Kuma 自建服务器/网站在线率监控 Spartan Host Review - Best Hosting & Service Support 升级 Typecho 到最新开发版本 v1.2.0 Linux rm 命令详解 Debian 系统安装 Docker 教程 BandwagonHost - Reliable Blog and Business VPS Hosting 使用 Isso 为 Hugo/Hexo 等静态网站添加评论功能 推荐 5 款免费开源的网站流量分析统计工具 搭建 Shynet 网站流量统计分析工具 聊聊 DDoS 攻击那些事 Hugo 使用 Fancybox 实现图片灯箱/放大功能 从 Debian 10 升级到 Debian 11 教程 使用 Umami 自建网站流量统计分析工具 Linux 一次执行多个命令的 3 种方式 Typecho 修改永久链接后旧链接 301 跳转到新链接 从不同需求推荐几家稳定可靠的 VPS 服务商 Build EchoIP service with Docker 浅谈一下这些年折腾过的 VPS 单线复用解决一根网线同时 IPTV 和宽带问题 不完全吃灰的树莓派 开发一个自己的 Telegram Bot 使用 Nginx 实现 TCP 四层反向代理 画画真难 我读村上春树 使用 acme.sh 自动签发和更新证书 卡拉马佐夫式悲剧 安装 File Browser 轻量网盘工具 新玩具树莓派到手 Linux 定时自动备份数据到 OneDrive/Google Drive 记一次服务器崩溃 使用 rsync 同步文件 短信的消失 幻灭的艺术家 新玩具戴尔 S2721DGF 开箱 蝴蝶 用 Docker 整合 SeafilePro 搭建私人云盘 搭建自己的 kms 服务器
Debian 下 Nginx 配合 Fail2Ban 减少恶意扫描和攻击
ATP · 2021-10-19 · via atpX

最近查看 Nginx 的访问日志,发现有不少恶意扫描漏洞的记录,同时也有不少的伪造蜘蛛的爬虫导致消耗了不少服务器资源,由此准备做一些缓解措施。其实 Nginx 自带的 limit_req_zonelimit_conn_zone 参数已经可以限制连接频率和并发数量,但对于一些“聪明”的恶意爬虫来说,显然是不够的。

fail2ban-nginx

下面介绍一下如何用 Fail2Ban 工具匹配分析 Nginx 的日志文件,禁止特定 IP,以达到减缓恶意扫描或者是应用层 DDoS 攻击的目的。

关于 DDoS 攻击的一些知识,可以看看我先前写的这篇文章:聊聊 DDoS 攻击那些事

这里先简单说说 fail2ban 这款工具,其实 Linux 用户可能都不会陌生,fail2ban 是一款入侵检测系统框架工具,通过扫描日志文件并用正则匹配分析,然后通过更新防火墙规则来禁止某些有恶意迹象的 IP(密码失败过多,寻求漏洞利用等)来提高服务器安全性。开箱即用的 fail2Ban 自带了用于各种服务(Apache、Courier、SSH 等)的过滤器,最常用的场景是扫描 SSH 连接日志,禁止失败次数过多的 IP,防止 SSH 暴力破解。

安装 Fail2Ban

演示环境为 Debian 11,使用 root 用户,大多数 Linux 发行版软件包仓库中都有 Fail2ban,直接执行安装命令即可:

apt install -y fail2ban

安装成功后配置文件都位于 /etc/fail2ban/ 目录中,其中需要关注的有以下三个文件或文件夹:

  • /etc/fail2ban/filter.d/:恶意行为的过滤规则,其中预设于了 SSH、Nginx、Apache 的监控规则
  • /etc/fail2ban/action.d/:发现恶意 IP 后采取的操作,其中预设了许多常用操作,其中预设了 iptables、firewalld、sendmail 等操作
  • /etc/fail2ban/jail.conf:即小黑屋,Jail 由 Filter 和 Action 组成,作用是通过组合前面的配置来设置 fail2ban 的工作行为

常用命令:

  1. 查看指定 Jail 规则下被封禁的ip情况:
fail2ban-client status <JAIL>
  1. 添加/解除指定 IP 的封禁:
fail2ban-client set <JAIL> banip/unbanip <IP>
  1. 添加/解除指定 IP 的忽略:
fail2ban-client set <JAIL> addignoreip/delignoreip <IP>
  1. 测试匹配规则是否正确:
fail2ban-regex <日志文件> <过滤规则>
  1. 查看所有命令:
fail2ban-client -h
  1. 查看日志:
tail /var/log/fail2ban.log

配置 Fail2Ban

添加过滤规则

首先设置过滤规则,在 /etc/fail2ban/filter.d/ 目前下新建一个 .conf 文件,名字自取,比如我新建的是 nginx-atpx-com.conf,然后进行设置:

[Definition]
failregex = 
ignoreregex =

其中:

failregex:表示过滤规则的正则表达式; ignoreregex:表示忽略规则的正则表达式,可以设置为 .*(webp|svg|jpg|png) 忽略对图片文件的请求,防止图片文件过多误伤;

而这里要实现我们想要的效果,也有两个选择,配合开篇提到的 Nginx 流控产生的日志文件(error.log)进行匹配过滤或者直接对 Nginx 的访问日志文件(access.log)进行匹配过滤。原理都一样,fail2ban 预置了很多常见服务的日志文件匹配模板,在 /etc/fail2ban/filter.d/ 目录下可以找到。如果你修改了日志格式,那么需要根据你的日志文件格式改写相应的表达式

这里我用 Nginx 的 limit_req_zone 流控模块做一个示例,下面是一条超过限制产生的错误信息:

2021/10/13 01:02:39 [error] 14174#0: *41792 limiting requests, excess: 5.920 by zone "request", client: x.x.x.x, server: www.atpx.com, request: "HEAD /?feed=rss HTTP/2.0", host: "www.atpx.com"

参考自带的 /etc/fail2ban/filter.d/nginx-limit-req.conf 模板,可以写成下面的表达式:

[Definition]
failregex = ^\s*\[[a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone ".*", client: <HOST>,
ignoreregex = 

failregex 也可以直接简写为:

failregex = limiting requests, excess:.* by zone.*client: <HOST>

其中 <HOST> 是必须包含的,fail2ban 通过这个来获取 IP 地址,测试自定义的规则是否生效:

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-atpx-com.conf

如果成功匹配会返回匹配到的信息:

Results
=======

Failregex: 4 total
|-  #) [# of hits] regular expression
|   1) [4] ^\s*\[[a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone ".*", client: <HOST>,
`-

Ignoreregex: 0 total

关于一些正则表达式的基本语法,网上有很多不错的教程,有兴趣可以去了解一下。

配置 Jail 规则

Fail2ban 读取配置文件的顺序如下,.local 会覆盖 .conf

  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/*.conf
  • /etc/fail2ban/jail.local
  • /etc/fail2ban/jail.d/*.local

对于大多数用户来收,最简单的方式是直接在 /etc/fail2ban/ 目录下将 jail.conf 复制为 jail.local 文件:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

然后在 jail.local 中修改即可,其中可配置项非常丰富,并且都有详细的介绍,你可以根据自己的需要进行修改。

个人推荐设置一下白名单,方便你自己的本地 IP 测试使用,直接在 jail.local 中找到 ignoreip 参数,取消注释,然后添加你希望设置白名单的 IP:

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 1.1.1.1

可以直接在 jail.local 的末尾添加你自定义的规则,我这里选择了新建一个 /etc/fail2ban/jail.d/custom.conf 文件,便于后期的查看和维护:

[nginx-atpx-com]
enabled = true
port = http,https
filter = nginx-atpx-com
logpath = /var/log/nginx/access.log
bantime = 12h
findtime = 60
maxretry = 5

简单说明一下参数:

  • port:封禁的端口,这里设置的是一般做站的 80 和 443 端口
  • filter:过滤规则,使用前面自定义的 nginx-atpx-com
  • logpath:监控的日志文件路径
  • bantime:封禁时间,单位为秒,-1 表示永久
  • findtime:查找时间段,单位为秒
  • maxretry:允许的最大失败次数,结合前面的 findtime,比如这里配置的是每 60 秒内触发 5 次规则,那么就封禁掉该 IP 12 小时

然后重启 fail2ban 即可生效:

service fail2ban restart
fail2ban-client status nginx-atpx-com

此时你可以在另外一台服务器上创建一个 shell 脚本,执行 curl 请求循环来检测是否生效:

#!/bin/bash
for ((i=1;i<=50;i++)); do
curl -H "Fail2ban test" https://your-domian/test > /dev/null 2>&1
done
echo "done"

注意:如果服务器上启用了 ufw 防火墙,会出现 Fail2ban 无法阻止 IP 的情况。这是由于 iptables 的顺序问题,关于 ufw 的具体使用可以参考我前面写的文章:修改SSH端口使用密钥登录并配置防火墙

要解决这个问题,你可以将 fail2ban 默认的 iptables 替换为 ufw,首先确认 /etc/fail2ban/action.d/ 目录下有 ufw.conf 这个文件。然后修改 /etc/fail2ban/jail.local 中的 banaction 参数:

banaction = ufw
banaction_allports = ufw

最后,你也可以添加一个 cron 任务定期清理 Nginx 和 fail2ban 的日志文件,减少硬盘空间占用,这里就不再介绍了。