工作是越来越忙了,已经好久没有管这个博客了,也好久没看服务器了。
今天进服务器,lastb的输出得好几十页,有时候甚至每分钟都有。虽然已经改了端口,也仅允许密钥登录,但是看着这么多日志,索性用Fail2Ban把这些猜密码的统统拉黑吧。

安装

Debian已经可以直接使用apt安装了

1
2
3
4
5
6
# 安装
apt install fail2ban -y
# 检查fail2ban版本
fail2ban-client version
# 开机启动
systemctl enable fail2ban.service

修改配置

官方建议在本地建立.local文件去修改配置,而不是直接修改.conf文件。
1.先建两个用于修改配置的文件

1
2
touch /etc/fail2ban/fail2ban.local
touch/etc/fail2ban/jail.local

2.修改上面的两个文件
对于fail2ban.local,使用下面的配置以降低内存占用:maxmatches: memory saving options(我还没有研究,为什么这样会降低内存占用)

1
2
3
[DEFAULT]
dbmaxmatches = 0
dbpurgeage = 20d

对于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
25
26
27
28
29
[DEFAULT]
# 节省内存
maxmatches = 0
# 白名单IP,也可以放入自己信任的IP
ignoreip = 127.0.0.1
# 判断是否封禁的区间长度
findtime = 1d
# 在findtime没的最大试误次数,超过后将被封禁
maxretry = 1
# 封禁时间
bantime = 1h
# 是否打开递增封禁时间
bantime.increment = true
# 在指定封禁时间基础上增加一个随机时间,防止机器预测到可以尝试的时间
bantime.rndtime = 30m
# 控制封禁时间的因数
bantime.factor = 12
# 递增封禁的最长时间
bantime.maxtime = 30d
# 日志
logpath = /var/log/auth.log
# 封禁方法,这里使用TCP Wrapper,也可以试试iptables-allports
banaction = hostsdeny
[sshd]
backend = auto
enabled = true
# 这里直接写ssh就可以自动识别修改后的ssh端口
port = ssh
filter = sshd

关于bantime.factor参数:Using fail2ban over longer time spans?
默认的计算公式是ban.Time * banFactor * (1<<(ban.Count if ban.Count<20 else 20)),即封禁时间×因数×(2^封禁次数)

bantime = 1dbantime.factor = 7,则起始封禁时间为1d,第二次封禁时间为1d×7×2^1=14d,第三次为1d×7×2^2=28d
bantime = 1hbantime.factor = 84,则起始封禁时间为1h,第二次封禁时间为1h×84×2^1=168h=7d,第三次为1h×84×2^2=336h=14d
bantime = 1hbantime.factor = 12,则起始封禁时间为1h,第二次封禁时间为1h×12×2^1=24h=1d,第三次为1h×12×2^2=48h=2d,第四次为1h×12×2^3=96h=4d

后续

banaction我本来是用的默认的iptables-multiport,但是不知道为什么并没有生效,明明iptables -L | grep REJECT里也有规则了。先用着hostsdeny吧,或者试试iptables-allports

但是我也弄完了,猜密码的也不猜了,就让fail2ban开着吧。

fail2ban需要读取/var/log/auth.log,这需要安装rsyslog