近来阿里云轻量服务器和飞牛nas上受到了入侵,虽然有惊无险,但还是要加强防范。本文记录了fail2ban的安装和使用。

fail2ban

  • 能做什么:自动封禁攻击者
    它就像一个24小时值班的保安,会实时盯着SSH登录日志(/var/log/secure)。一旦发现某个IP在短时间内(比如10分钟)连续失败登录超过设定的次数(比如5次),就会自动操作服务器防火墙(iptables或firewalld),把这个IP封禁一段时间。
    这样一来,那些暴力破解的尝试就会大大减少,攻击者在被封禁期间根本无法再尝试连接,起到了主动防御的作用。根源上减少被盯上的概率

  • 做不到什么:

  1. 无法阻止端口扫描:攻击者的脚本在试探连接时,fail2ban 还未触发,所以扫描行为本身是挡不住的。
  2. 存在误封风险:如果自己在外部网络多次输错密码,也可能会被 fail2ban 封掉,导致暂时无法登录。虽然可以手动解封,但终归麻烦。

安装

阿里云轻量服务器上使用dnf install fail2ban安装。
配置fail2ban监控SSH:
nano /etc/fail2ban/jail.local
内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[DEFAULT]
# 全局默认
bantime = 300 # 🔥 改为5分钟,动态IP福音
findtime = 600
maxretry = 3
banaction = iptables-multiport

[sshd]
enabled = true
port = 22
logpath = /var/log/secure
maxretry = 3
bantime = 300 # 5分钟
findtime = 600
# ignoreip 留空,因为IP不固定
action = iptables[name=SSH, port=22, protocol=tcp]

启动fail2ban:
systemctl start fail2ban
systemctl enable fail2ban

使用

  • 查看封禁状态
    fail2ban-client status sshd

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@aliyun ~]# fail2ban-client status sshd
    Status for the jail: sshd
    |- Filter
    | |- Currently failed:    0
    | |- Total failed:    0
    | `- Journal matches:    _SYSTEMD_UNIT=sshd.service + _COMM=sshd
    `- Actions
    |- Currently banned:    0
    |- Total banned:    0
    `- Banned IP list:   

    fail2ban-client status sshd | grep "Banned IP list"

  • 查看 fail2ban 日志(最后50行)
    tail -50 /var/log/fail2ban.log

  • 检查配置文件
    fail2ban-client -t

解除误封

进入阿里云控制台,找到轻量应用服务器,进入相应的服务器,找到命令助手,执行fail2ban-client unban --all
在上述设置中5分钟后自动解除,这一步不是必要的。如果封禁时间较久,比如一天86400秒,可以用此方法解禁。

飞牛os上使用

监听sshd和5666端口的访问。
apt install fail2ban
nano /etc/fail2ban/jail.local
内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[DEFAULT]
bantime = 300
findtime = 600
maxretry = 3
ignoreip = 127.0.0.1/8
banaction = iptables-multiport

[sshd]
enabled = true
port = 22
logpath = /var/log/syslog
maxretry = 3
bantime = 300
findtime = 600
action = iptables-multiport[name=SSH, port="22", protocol=tcp]

[trim_main]
enabled = true
filter = trim_main
logpath = /var/log/syslog
maxretry = 5
bantime = 3600
findtime = 600
action = iptables-multiport[name=trim_main, port="5666", protocol=tcp]

nano /etc/fail2ban/filter.d/trim_main.conf
内容:

1
2
3
[Definition]
failregex = MAINEVENT:.*"template":"LoginFail".*"IP":"<HOST>"
ignoreregex =

检查状态:

1
2
3
root@fn-j1900:~# fail2ban-client -t
2026-06-30 09:34:28,219 fail2ban.configreader [3234024]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
OK: configuration test is successful

警告无法消除,不知道原因。