Debian安装fail2ban保姆级教程,自动拉黑恶意IP

Debian安装fail2ban保姆级教程,自动拉黑恶意IP
服务器被暴力破解过吗?也许你只是没注意到

上个月帮一个朋友看服务器,顺手查了一下 SSH 日志,好家伙——三天时间,他的服务器被尝试登录了 14000 多次。root、admin、oracle、mysql……各种常见用户名轮着来,密码从 123456 到 qwerty 到 password 全套走了一遍。

他说他密码设得很复杂啊,应该没事吧?

问题是:暴力破解本质上是撞库攻击,只要你的密码在某个泄露库出现过,或者稍微简单一点,迟早会被攻破。更何况,万一你用的某个服务有漏洞呢?

光靠密码不够。你需要的是:让那些频繁尝试的 IP 自动闭嘴。

这就是 fail2ban 干的事。它监控日志,发现异常登录行为,直接把来源 IP 封掉。不用你手动操作,自动化搞定。

一、fail2ban是什么?工作原理详解

在说安装之前,先搞明白 fail2ban 为什么管用。

你可以把它理解成一个自动保安。传统防火墙(ufw/iptables)是按规则办事,只认端口和 IP,不会主动判断某个 IP 是不是坏人。但 fail2ban 是按行为判断——它盯着日志看,发现某个 IP 在短时间内疯狂尝试登录,直接调用防火墙把这个 IP 拉黑。

整个流程是这样的:

  1. 监控日志
    :fail2ban 持续读取 SSH、FTP、Web 等服务的认证日志
  2. 设置规则
    :定义"多少次失败算异常"(比如 5 分钟内失败 5 次)
  3. 触发封禁
    :达到阈值后,自动在 iptables/ufw 里添加规则,屏蔽该 IP
  4. 自动解封
    :封禁一段时间后自动放出来(可配置时长)

这个机制的好处是:防御自动化,零人工干预。你睡觉的时候它也在工作。

常见的应用场景包括:

  • SSH 暴力破解防护
    :这是 fail2ban 最经典的使用场景
  • Web 登录保护
    :保护 WordPress、Django 等后台登录页面
  • FTP 攻击防护
    :防止 vsftpd、proftpd 被暴力破解
  • 邮件服务保护
    :Postfix、Dovecot 的认证防护

二、fail2ban安装:5分钟搞定基础部署

Debian 安装 fail2ban 非常简单,基本上一条命令搞定。

2.1 安装前检查

# 检查系统版本(fail2ban支持Debian 10及以上)
cat /etc/debian_version

# 检查是否已安装
which fail2ban
fail2ban --version

2.2 安装fail2ban

# 更新软件源
sudo apt update

# 安装fail2ban
sudo apt install fail2ban -y

安装完成后,服务会自动启动。检查一下状态:

# 查看服务状态
sudo systemctl status fail2ban

正常情况下会看到:

● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled)
   Active: active (running) since Sun 2026-05-03 04:30:00 CST; 5s ago

如果看到 active (running),说明安装成功了。

2.3 启用开机自启

sudo systemctl enable fail2ban

三、基础配置:SSH防护规则设置

fail2ban 的配置分为两个层级:

  • 默认配置
    /etc/fail2ban/jail.conf:软件包更新时可能被覆盖
  • 自定义配置
    /etc/fail2ban/jail.local:用户配置优先,不会被覆盖

最佳实践 : 在 jail.local 里覆盖需要自定义的参数,保留 jail.conf 作为参考。

3.1 创建自定义配置文件

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

3.2 配置SSH防护规则

找到 [sshd] 部分,修改为以下配置:

[sshd]
enabled   = true
port      = ssh
filter    = sshd-auth
logpath   = /var/log/auth.log
maxretry  = 5
findtime  = 10m
bantime   = 1h
ignoreip  = 127.0.0.1/8 ::1

参数说明:

  • enabled
    :是否启用这个规则,true 表示启用
  • port
    :SSH 端口,默认是 ssh(22),如果你改了端口写新的数字
  • filter
    :使用哪个过滤规则,sshd-auth 是自带的
  • logpath
    :日志文件路径,Debian 的 SSH 认证日志在 /var/log/auth.log
  • maxretry
    :最大失败次数,达到这个次数就封禁
  • findtime
    :时间窗口,上面是 10 分钟
  • bantime
    :封禁时长,上面是 1 小时
  • ignoreip
    :白名单 IP,这些 IP 永远不会被封(比如你的固定出口 IP)

关键参数建议:

  • SSH 的 maxretry 不要设太低,否则你自己也可能被封。建议 5 次
  • findtime 设 10-30 分钟比较合理
  • bantime 建议至少 1 小时,多次违规可以更长

3.3 重启服务使配置生效

sudo systemctl restart fail2ban

3.4 验证配置是否生效

# 查看当前启用的规则
sudo fail2ban-client status

# 查看SSH规则的详细状态
sudo fail2ban-client status sshd

正常输出:

Status for the jail: sshd
|- filter
|  |-Currently failed: 0
|  |-Total failed: 12
|  `-File list: /var/log/auth.log
`- action
   |-Currently banned: 2
   |-Total banned: 5
   `-Banned IP list: 203.0.113.45 198.51.100.67

这里可以看到:

  • 当前有多少个 IP 被封(Currently banned)
  • 总共封过多少(Total banned)
  • 被封的 IP 列表

四、自定义规则进阶配置

除了 SSH,fail2ban 还能保护很多服务。以下是几个常用场景。

4.1 保护Web管理后台

如果你用 Nginx 跑了 WordPress 或其他后台,可以用 fail2ban 保护登录页面:

[nginx-http-auth]
enabled   = true
port      = http,https
filter    = nginx-http-auth
logpath   = /var/log/nginx/error.log
maxretry  = 3
findtime  = 10m
bantime   = 1h

[wordpress]
enabled   = true
port      = http,https
filter    = wordpress
logpath   = /var/log/auth.log
maxretry  = 5
findtime  = 5m
bantime   = 2h

WordPress 规则需要自定义 filter,稍后会说。

4.2 保护vsftpd(FTP服务)

[vsftpd]
enabled   = true
port      = ftp,ftp-data
filter    = vsftpd
logpath   = /var/log/vsftpd.log
maxretry  = 3
findtime  = 10m
bantime   = 1h

4.3 保护Postfix(邮件服务)

[postfix]
enabled   = true
port      = smtp,submission
filter    = postfix
logpath   = /var/log/mail.log
maxretry  = 3
findtime  = 10m
bantime   = 1h

4.4 渐进式封禁策略

如果你想对屡教不改的 IP 加重处罚,可以用渐进式封禁:

[sshd]
enabled   = true
port      = ssh
filter    = sshd-auth
logpath   = /var/log/auth.log
maxretry  = 5
findtime  = 10m
bantime   = 1h
maxmatches = 3

# 多次违规后永久封禁(需要配合 action.d 配置)

五、邮件告警配置:被攻击时及时知道

fail2ban 支持在封禁 IP 时发送邮件通知,这样你能及时知道服务器正在被攻击。

5.1 安装邮件工具

sudo apt install sendmail-bin mailutils -y

5.2 配置邮件发送

在 jail.local 里修改 action 配置:

[DEFAULT]
# 收件邮箱,改成你的
destemail = your-email@example.com
# 发件人名称
sender = fail2ban@your-server-name

# 告警动作:封禁+发送邮件
action = %(action_mwl)s

action_mwl 的含义:

  • action_m
    :封禁 IP(ban)
  • action_w
    :发送邮件警告(warning)
  • action_l
    :写入日志(log)

如果你只想要邮件通知,不需要写日志:

action = %(action_mw)s

5.3 测试邮件配置

# 手动测试发送邮件
echo "Test email from fail2ban"| mail -s "Fail2ban Test" your-email@example.com

六、自定义Filter:保护任意服务

fail2ban 自带了很多服务的 filter,但有时候你需要保护一些非标准服务,或者想更精确地匹配日志。

6.1 创建自定义Filter

假设你要保护一个自定义的 API 服务,日志格式是:

[2026-05-03 10:30:00] Failed login from 203.0.113.45 for user admin

创建一个 filter 文件:

sudo vim /etc/fail2ban/filter.d/myapi.conf

写入内容:

[Definition]
# 日志格式,fail2ban会自动匹配
failregex = ^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] Failed login from <HOST> for user .*$
# 忽略的正则(可选)
ignoreregex =

6.2 测试Filter是否工作

# 用 fail2ban-regex 测试
sudo fail2ban-regex /var/log/myapi.log /etc/fail2ban/filter.d/myapi.conf

如果看到 Success, the regex is matched 这样的输出,说明 filter 正常工作。

6.3 在Jail里启用自定义Filter

[myapi]
enabled   = true
port      = 8080
filter    = myapi
logpath   = /var/log/myapi.log
maxretry  = 3
findtime  = 5m
bantime   = 30m

七、常见问题与避坑指南

  • Q1:fail2ban启动失败,日志报错 Permission denied

这是最常见的问题,通常是日志文件权限不对。

# 检查日志文件权限
ls -la /var/log/auth.log

# 如果权限不对,修复
sudo chown root:adm /var/log/auth.log
sudo chmod 640 /var/log/auth.log
  • Q2:自己被封了怎么办?

先别慌,wait for unban(等待自动解封)。或者从白名单 IP 登录:

# 查看当前被封的IP
sudo fail2ban-client status sshd

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

# 添加自己到白名单
# 在 jail.local 的 ignoreip 行添加你的IP
sudo vim /etc/fail2ban/jail.local
# 找到 ignoreip 行,添加你的IP
ignoreip =127.0.0.1/8 ::1 203.0.113.45
sudo systemctl restart fail2ban
  • Q3:fail2ban 没有生效,IP 没被封

排查步骤:

# 1. 检查服务是否运行
sudo systemctl status fail2ban

# 2. 检查规则是否启用
sudo fail2ban-client status

# 3. 检查filter是否正常工作
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

# 4. 检查fail2ban日志
sudotail-f /var/log/fail2ban.log
  • Q4:封禁时间太短,攻击者换一个IP又来了
    可以调整 bantime,或者用 iptables 的长时间封禁:
[sshd]
enabled   = true
port      = ssh
filter    = sshd-auth
logpath   = /var/log/auth.log
maxretry  = 5
findtime  = 10m
bantime   = 24h    # 改成1天

多次违规的用户可以单独处理,在 jail.local 末尾添加:

[recidive]
enabled   = true
filter    = recidive
logpath   = /var/log/fail2ban.log
banaction = iptables-allports
maxretry  = 5
findtime  = 1d
bantime   = 1w

这个规则会封禁那些被封禁后又来攻击的"惯犯"长达一周。

  • Q5:服务器重启后 fail2ban 没启动
# 检查是否开机自启
sudo systemctl is-enabled fail2ban

# 如果没启用,手动开启
sudo systemctl enable fail2ban

Q6:fail2ban 和 ufw 一起用会有冲突吗?

不会。fail2ban 是调用 iptables 规则,ufw 底层也是 iptables,两者可以共存。fail2ban 添加的规则会插入到 ufw 规则的后面,不影响 ufw 的默认策略。

总结
fail2ban 是 Linux 服务器安全的必备工具,它的价值在于自动化——你不用盯着日志看,它帮你盯;你不用手动封 IP,它帮你封。

核心配置就三步:

  • 安装:apt install fail2ban
  • 覆盖配置:在 jail.local 里设置 SSH 规则
  • 重启生效:systemctl restart fail2ban

建议配合 ufw 一起用:ufw 负责基础的端口管理,fail2ban 负责行为分析,两层防护更稳妥。

posted @ 2026-05-06 09:41  汉学  阅读(56)  评论(0)    收藏  举报