上期回顾:你的门锁升级了,但还不够

还记得上期我们做了什么吗?

  • 用SSH密钥替代密码登录(换了把"指纹锁")
  • 修改了SSH默认端口(换了个"门牌号")

这两招已经能挡住99%的自动化扫描机器人。但问题是,还有那1%怎么办?

小王按照上期教程配置好服务器后,过了一周又看了看日志,发现虽然攻击尝试少多了,但还是有:

Failed password from 45.x.x.x port 23456
Failed password from 103.x.x.x port 23456
Failed password from 185.x.x.x port 23456

有些"聪明"的攻击者会扫描全端口,有些针对性的攻击会直接找到你的新端口号。

你需要的,是一个24小时不睡觉的"自动门卫"。

什么是fail2ban?

一个永不休息的智能保安

想象一下:

传统方式:你每天盯着监控录像,发现有人鬼鬼祟祟试了5次密码,你赶紧手动报警把他拉黑。

fail2ban:雇了个AI保安,自动监控、自动识别、自动拉黑,24小时不眨眼。

工作原理很简单

fail2ban就像一个尽职的门卫,它的工作流程是:

  1. 实时监控日志 - 盯着SSH、Web等服务的登录记录
  2. 识别异常行为 - 发现有人短时间内多次失败登录
  3. 自动采取行动 - 立即把攻击者的IP加入防火墙黑名单
  4. 定时解除封禁 - 过一段时间自动解封(或者永久拉黑)

用一张流程图说明:

攻击者连续失败5次 → fail2ban检测到 → 自动添加防火墙规则 
→ IP被封禁 → 攻击者彻底连不上服务器

为什么你需要fail2ban?

场景1:防止万一

即使你用了SSH密钥,可能还有其他账户用密码登录,或者哪天你临时开启了密码认证调试问题。多一层防护,多一份安心。

场景2:减少资源消耗

大量的登录尝试会消耗服务器CPU和内存。有了fail2ban,攻击者的请求直接被防火墙挡在门外,根本到不了SSH服务。

场景3:日志清爽

不用再看密密麻麻的失败登录记录,出问题时更容易找到真正的异常。

场景4:抵御分布式攻击

攻击者可能用多个IP轮流尝试。fail2ban能持续识别和封禁新出现的攻击IP,让他们无处遁形。

5分钟安装配置fail2ban

第一步:安装fail2ban

Ubuntu/Debian系统:

sudo apt update
sudo apt install fail2ban -y

CentOS/RHEL系统:

sudo yum install epel-release -y
sudo yum install fail2ban -y

启动并设置开机自启:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

看到 Created symlink... 之类的提示就说明成功了。

第二步:配置fail2ban(重点)

理解配置文件

fail2ban有两个配置文件:

  • /etc/fail2ban/jail.conf - 默认配置(不要动它)
  • /etc/fail2ban/jail.local - 你的自定义配置(在这里改)

为什么要分两个文件?因为软件升级时会覆盖 jail.conf,但不会动 jail.local

创建自定义配置

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

核心配置项(用人话解释)

找到 [DEFAULT] 部分,修改这几个参数:

[DEFAULT]
# 封禁时长(秒):这里设10分钟
bantime = 600

# 检测时间窗口:10分钟内的失败尝试会被统计
findtime = 600

# 失败次数阈值:10分钟内失败5次就封
maxretry = 5

# 白名单IP:这些IP永远不会被封
ignoreip = 127.0.0.1/8 ::1

小贴士:把你自己的家庭IP或办公室IP加到 ignoreip 里,避免误伤自己。

配置SSH保护

找到 [sshd] 部分,修改成:

[sshd]
enabled = true
port = 23456  # 改成你实际的SSH端口
filter = sshd
logpath = /var/log/auth.log  # Debian/Ubuntu用这个
# logpath = /var/log/secure   # CentOS/RHEL用这个
maxretry = 3  # 改成3次,更严格
bantime = 3600  # 封禁1小时

解释一下

  • enabled = true - 启用SSH保护
  • port - 你的SSH端口(如果改过默认端口,这里要写对)
  • maxretry = 3 - 3次机会,比默认的5次更严格
  • bantime = 3600 - 封禁1小时(3600秒)

第三步:重启fail2ban

sudo systemctl restart fail2ban

第四步:验证是否生效

# 查看fail2ban运行状态
sudo systemctl status fail2ban

# 查看SSH监狱状态
sudo fail2ban-client status sshd

如果看到类似这样的输出,就说明成功了:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

进阶配置:让fail2ban更强大

配置1:永久封禁重复犯罪者

有些攻击者被封后会换个IP继续攻击。我们可以设置"累犯"规则:被抓3次,直接永久拉黑。

jail.local 里找到或添加:

[recidive]
enabled = true
bantime = -1  # -1表示永久封禁
findtime = 86400  # 24小时内
maxretry = 3  # 被封3次就永久拉黑

解释:如果一个IP在24小时内被封禁3次,第三次就是永久封禁,再也别想连上你的服务器。

配置2:保护其他服务

fail2ban不仅能保护SSH,还能保护Web服务器、数据库等。

比如保护Nginx:

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600

配置3:白名单设置

如果你有固定的办公室IP或家庭IP,强烈建议加到白名单:

ignoreip = 127.0.0.1/8 ::1 你的家庭IP 你公司的IP段

比如:

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

查看fail2ban的工作成果

查看当前封禁了多少IP

sudo fail2ban-client status sshd

输出示例:

|- Number of banned IPs: 15
`- Banned IP list: 103.x.x.x 185.x.x.x 45.x.x.x ...

看到这个数字,你就知道fail2ban帮你挡住了多少攻击。

查看详细日志

sudo tail -f /var/log/fail2ban.log

你会实时看到fail2ban的工作记录:

2024-12-23 10:15:23 [sshd] BAN 103.x.x.x
2024-12-23 11:15:23 [sshd] UNBAN 185.x.x.x

每一条BAN记录,都是一个被拦在门外的攻击者。

手动操作

有时候你可能需要手动封禁或解封某个IP:

# 手动封禁某个IP
sudo fail2ban-client set sshd banip 1.2.3.4

# 手动解封某个IP
sudo fail2ban-client set sshd unbanip 1.2.3.4

常见问题Q&A

Q:我会不会把自己封了?
A:只要把你的IP加到 ignoreip 白名单里就不会。另外,云服务商通常提供VNC控制台,可以绕过网络直接登录。

Q:封禁时间设多久合适?
A:建议先设10分钟到1小时,观察效果后再调整。太短了攻击者会继续尝试,太长了可能误伤正常用户。

Q:如何判断是攻击还是用户忘记密码?
A:看IP来源和频率。正常用户偶尔输错1-2次,攻击者是短时间内大量连续尝试。

Q:fail2ban会影响服务器性能吗?
A:几乎没有影响。它只是读日志和操作防火墙,反而因为拦截了攻击,减轻了SSH服务的压力。

Q:万一fail2ban出问题怎么办?
A:云服务商都有VNC/控制台可以直接登录。或者临时停止fail2ban:sudo systemctl stop fail2ban

安装前后对比

安装前:

  • 每天上千次攻击尝试
  • 日志被刷屏,看不清真实问题
  • 服务器资源被消耗

安装后:

  • 攻击者尝试几次就被拦在门外
  • 日志清爽,只看到被封禁的记录
  • 服务器更稳定,资源占用更低

一个真实案例:某用户配置fail2ban前,每天有1000+次失败登录。配置后,第一天就封禁了50多个IP,现在每天只有零星几次尝试,而且都是新IP,试几次就被封了。

三道防线:你的服务器已经很安全了

回顾一下,现在你有了:

  1. 第一道防线:SSH密钥认证 - 黑客进不来
  2. 第二道防线:修改默认端口 - 黑客找不到
  3. 第三道防线:fail2ban自动封禁 - 黑客试几次就被拉黑

就像给家里装了:

  • 指纹锁(密钥)
  • 隐蔽的门(改端口)
  • 24小时智能保安(fail2ban)

小偷想进你家?难度系数:地狱级。

总结:5分钟,让服务器更安全

fail2ban的核心价值,就是把"被动防御"变成"主动防御":

  • 不用你盯着日志手动拉黑
  • 不用担心忘记封禁某个IP
  • 24小时自动工作,永不疲倦

今天就去配置fail2ban,让那些攻击者撞个头破血流!


下期预告:我们将继续讲解Linux服务器安全的其他重要措施:防火墙精细化配置、禁用root直接登录、定期更新系统等。

你的fail2ban封禁了多少IP?评论区晒晒战果!遇到问题也欢迎留言,我来帮你解决。