Fail2Ban恶意ip封禁

Fail2Ban恶意ip封禁

Fail2Ban 是一个广泛使用的工具,用于检测恶意登录尝试和其他异常活动,并自动封锁攻击者的IP地址。您可以配置它来检测过多的连接请求,然后暂时封锁来自恶意IP地址的访问。

安装

apt update 
apt install fail2ban

启动

systemctl start fail2ban

开机自启

systemctl enable fail2ban

查看状态

systemctl status fail2ban

配置

主配置文件创建本地副本

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

编辑本地副本

vim /etc/fail2ban/jail.local

这就是总的配置文件了。

一般分开来写

先执行下面这个代码,删除不必要的东西

rm -rf /etc/fail2ban/jail.d/*

然后写一个,按自己需要写

vim /etc/fail2ban/jail.d/sshd.local

例如

[sshd]
enabled = true #启用对ssh服务的防护
port = ssh #指定要防护的ssh端口
maxretry = 3 #允许的最大密码重试失败次数
bantime = 600 #封时长,单位:秒;600秒 = 10分钟,封禁时间内该IP无法连接你的ssh
findtime = 600 #测窗口期,单位:秒;600秒 = 10分钟,含义:在【10分钟】内如果失败次数达到maxretry,立即触发封禁
[mysqld]
enabled = true # 启用 mysqld 服务的监控
port = mysql # 监控 MySQL 服务的默认端口,通常为 3306
maxretry = 5 # 最大失败次数,超过后封禁
bantime = 600 # 封禁时间为 10 分钟
findtime = 600 # 在 10 分钟内,如果失败次数超过 5 次则封禁

这个都是根据端口来的。还可以自定义行为,不过多阐述了,自行研究

查看封锁列表

fail2ban-client status

查看SSH封锁情况

fail2ban-client status sshd

查看总日志的

tail -f /var/log/fail2ban.log

自定义封ip

逻辑是Fail2Ban = 日志 → 正则匹配 → 失败次数 → 封 IP

创建一个vim /etc/fail2ban/jail.d/jail.local(文件名可以自定义)文件,写入对应的配置

1、日志存在(你的服务能写日志)

日志必须包含「客户端 IP」,这一行就是 Fail2Ban 与你服务之间唯一的“连接点”

[myservice]
logpath = /var/log/server.log #日志文件的位置

确保有权限读取该文件

ls -l /etc/fail2ban/jail.d/jail.local

2、filter(正则):告诉 Fail2Ban 哪一行算“攻击/失败”

3、jail(策略):失败几次、封多久、封到哪里

这是一个完整的示例

[server-log]
enabled = true
backend = auto
logpath = /var/log/server.log
filter = server-log

maxretry = 3
findtime = 60
bantime = 3600

banaction = nftables-multiport
[server-log]、定义一个 **jail 名字**,后面所有配置都属于这个规则名字可以随便,但要和 filter 对应

enabled = true、是否启用这个 jail,`false` = 完全不生效

backend = auto、Fail2Ban **用什么方式读日志**,auto = 自动判断(普通文件就用轮询)一般不要改

logpath = /var/log/server.log、**最关键的一行**指定 Fail2Ban 要读取的日志文件fail2Ban 会像 `tail -F` 一样读它

filter = server-log、指定使用哪个 **filter(正则规则)**,对应文件位置/etc/fail2ban/filter.d/server-log.conf

maxretry = 3、**同一个 IP**在 `findtime` 时间内失败达到 3 次→ 触发封禁

findtime = 60、统计失败次数的时间窗口。单位:秒60 秒内的失败才算数

bantime = 3600、封 IP 多久。单位:秒3600 = 1 小时

banaction = nftables-multiport、**真正执行“封 IP”的方式**,使用 nftablesFail2Ban 只是调用这个动作

在详细说以下filter,这就是匹配的正则规则

完整内容

[Definition]
failregex = .*LOGIN FAIL ip=<HOST>.*
ignoreregex =
[Definition]、固定写法

failregex = .*LOGIN FAIL ip=<HOST>.*、匹配任何一行只要包含 `LOGIN FAIL ip=`并且后面跟着一个 IP

ignoreregex =、用来排除某些行这里留空表示不排除

例如

日志为

登录失败,ip为123.231.23.12

改为

failregex = .*登录失败,ip为<HOST>.*