Fail2ban 抑制 SSH 攻击噪声
-- --
Loading...

前言

由于公网出口 IP 经常变化,所以将服务器 SSH 直接暴露在公网,而非添加白名单进行限制

但是在查看 SSH 日志时,发现仍然有频繁的访问SSH建立连接,因此通过fail2ban将该种情况进行控制,降低风险,抑制攻击噪声

Fail2ban 工作逻辑

1. 基本原理

Fail2ban 通过监控日志文件,使用正则规则匹配异常行为

流程:日志 → Filter 规则匹配 → 统计失败次数 → 达到阈值 → 执行 Action 封禁 IP

2. 三个核心配置

Jail(策略)

定义:

  • 监控什么服务

  • 使用什么规则

  • 失败几次封禁

  • 封禁多久

例如:

[sshd-kex]
enabled = true
filter = sshd-kex
maxretry = 3
findtime = 300
bantime = 86400

Filter(匹配规则)

定义:

什么日志算一次失败

例如:

Connection reset by IP
Connection closed [preauth]

匹配成功:

失败次数 +1

Action(封禁动作)

定义:

触发后如何封禁

例如:

banaction = iptables-multiport

表示:

fail2ban
 ↓
iptables 添加规则
 ↓
阻止该 IP 访问 SSH 端口

具体实现

此处以 Debian 系统为例,不同系统对应的 SSH 日志不一样,需要注意

1. 创建 Filter

编辑文件

vim /etc/fail2ban/filter.d/sshd-kex.conf

添加以下内容

[Definition]
​
failregex = ^.*sshd.*kex_exchange_identification: read: Connection reset by peer.*from <HOST>.*$
            ^.*sshd.*Connection reset by <HOST> port.*$
            ^.*sshd.*Connection closed by authenticating user .* <HOST> port.*\[preauth\].*$
​
ignoreregex =

2. 更新 Jail

编辑文件

vim /etc/fail2ban/jail.local

添加以下内容

[sshd-kex]
enabled = true
filter = sshd-kex
port = ssh
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 86400
banaction = iptables-multiport

3. 重启 Fail2ban

systemctl restart fail2ban

检查:

fail2ban-client status

预期结果

image-20260728213728271

4. 手工测试规则

fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd-kex.conf

5. 验证

fail2ban-client status sshd-kex

可以看到规则已经生效


END
Fail2ban 抑制 SSH 攻击噪声
/?p=019fa8f6-2dc8-7703-8052-50f608c313af
作者
张子
发布于
更新于
许可