背景

服务器配置好 TCP 22 在公网中持续暴露,后疯狂被爆 SSH,在 G 老师帮助下学到 Fail2ban 一些知识,便记录之。


一、工作机制

日志 → 识别攻击行为 → 动态封禁 IP(iptables / nftables)


二、工作原理

1️⃣ 监听日志

例如:

/var/log/auth.log
journalctl -u ssh

2️⃣ 用规则识别攻击

比如:

Failed password for root from x.x.x.x

👉 Fail2ban 会匹配连续失败登录


3️⃣ 触发封禁

如果达到阈值,执行:

iptables -A INPUT -s 1.2.3.4 -j DROP

Fail2ban 做防火墙规则自动判断。


三、Fail2ban 能做什么(能力边界)

✅ 能做的

1️⃣ 防 SSH 爆破(最重要)

2️⃣ 防 Web 攻击(Nginx)

比如:

  • 扫描 /wp-admin
  • SQL 注入尝试
  • 恶意 UA

3️⃣ 防扫描

4️⃣ 防 DDoS(轻量级)

👉 不是专业防护,但能挡低级攻击


❌ 不能做的

  • ❌ 高级 DDoS(需要云防护 / CDN)
  • ❌ 0day 漏洞攻击
  • ❌ 应用层复杂攻击

四、核心配置参数

这是 Fail2ban 的控制逻辑:

🔹 1️⃣ maxretry(触发次数)

maxretry = 3

👉 3 次失败就封


🔹 2️⃣ findtime(时间窗口)

findtime = 600

👉 在 600 秒内


🔹 3️⃣ bantime

bantime = 3600

👉 封 1 小时


🔹 组合逻辑

10分钟内失败3次 → 封1小时

五、SSH 防护配置(仅作参考)

1️⃣ 安装

apt update
apt install fail2ban -y

2️⃣ 创建配置

nano /etc/fail2ban/jail.local

✍️ 写入(仅作参考)

[sshd]
enabled = true
port = 22,30222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
bantime.increment = true
bantime.factor = 2
bantime.max = 86400

六、这段配置意味着什么?

攻击者行为:

次数 行为 封禁时长
1 首次爆破 1 小时
2 再次尝试 2 小时
3 持续尝试 4 小时
持续攻击 最长 1 天

七、如何查看状态

查看整体

fail2ban-client status

查看 SSH 防护

fail2ban-client status sshd

查看封禁 IP

iptables -L -n

八、如何解封 IP

fail2ban-client set sshd unbanip xx.xx.xx.xx