背景

服务器配置好 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 漏洞攻击
  • ❌ L4 层攻击(如 TCP Flood)
  • ❌ 无日志的流量(如 nginx stream / Reality)

四、核心配置参数

这是 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

推荐配置

[DEFAULT]
bantime = 24h
findtime = 10m
maxretry = 3
backend = systemd
ignoreip = 127.0.0.1/8 ::1 你的IP

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s

六、递进封禁

bantime.increment = true
bantime.factor = 2
bantime.max = 86400

含义:

次数 行为 封禁时间
第1次 触发 1小时
第2次 再犯 2小时
第3次 再犯 4小时
持续攻击 最长 1天

七、查看状态

🔹 查看整体

fail2ban-client status

🔹 查看 SSH 防护状态

fail2ban-client status sshd

输出示例:

Currently banned: 3
Banned IP list: 1.2.3.4 5.6.7.8

🔹 查看封禁 IP(推荐方式)

fail2ban-client status sshd

比 iptables 更直观


🔹 查看底层防火墙规则

iptables -L -n

八、查看攻击日志

🔹 查看 SSH 失败登录

grep "Failed password" /var/log/auth.log

🔹 统计攻击 IP 排行

grep "Failed password" /var/log/auth.log \
| awk '{print $11}' \
| sort | uniq -c | sort -nr | head

输出示例:

120 185.xxx.xxx.xxx
80 103.xxx.xxx.xxx

🔹 查看成功登录(重点!)

grep "Accepted" /var/log/auth.log

如果出现陌生 IP ,说明可能已被入侵


九、手动封禁 IP

🔹 临时封禁(Fail2ban)

fail2ban-client set sshd banip 1.2.3.4

🔹 解封 IP

fail2ban-client set sshd unbanip 1.2.3.4

🔹 永久封禁(iptables)

iptables -A INPUT -s 1.2.3.4 -j DROP

Fail2ban 是临时策略,iptables 才是长期黑名单


十、日志监控(实时)

tail -f /var/log/fail2ban.log

可看到:

Ban 1.2.3.4

十一、实战判断逻辑(非常重要)

公网服务器:

👉 一定会被攻击(这是常态)

关键判断:

现象 是否正常
Failed password 很多 正常
各国 IP 扫描 正常
有 IP 被封 正常
有陌生 IP 成功登录 被入侵

十二、总结

Fail2ban 本质:

基于日志的自动防火墙系统

它的价值:

  • 自动识别攻击行为
  • 自动封禁恶意 IP
  • 大幅减少 SSH 暴露风险