debian12 fail2ban 配置说明及自定义规则
fail2ban 是用来做自动配置防火墙用的,最大的用处也就是防止别人的ssh的爆破,自动的把多次尝试登录的ip,放入防火墙中,小黑屋关几天。
他的原理是读取日志,然后根据日志里面的规则编写相应的正则表达式,在fail2ban中这个正则叫做过滤器(filter)。过滤器来确定哪些放行,哪些要识别出来属于异常。根据 fail2ban 里面的规则来,确定如何处理异常的 ip 访问。
但是他的功能又不止于 SSH 的保护,实际上内部还有者特别多的默认模块可以使用。
下面来介绍一下,在debian 12 上安装配置,以及自定义的一些设置。
1. 安装配置
debian 12 没有这个日志记录了,要提前装才行
sudo apt-get install rsyslog
如果没有日志记录,fail2ban不会其任何作用。
fail2ban 从github上装最新的
然后编辑,
bash cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑/etc/fail2ban/jail.local
[DEFAULT]
# 这是全局的
bantime = 2w
# 屏蔽2周
findtime = 9999
# 搜索时间 9999 秒
maxretry = 2
# 2次就干他
banaction = ufw
# 屏蔽的方式必须写,否则没用
banaction_allports = ufw
[sshd]
#mode = normal
enabled = true
# 开启这个模块
port = ssh
filter = sshd
# 过滤器
#logpath = %(sshd_log)s
logpath = /var/log/auth.log
# 日志的位置
backend = %(sshd_backend)s
2. fail2ban 配置说明
fail2ban 的配置文件是从 /etc/fail2ban/jail.local 开始识别的,
配置文件上,有模块、过滤器以及执行单元
模块是指如sshd这样的要过滤的规则
过滤器是指用什么样的正则表达式去判断正常还是异常
执行单元是指用什么防火墙去执行,如iptables,ufw,还是其他的
他的配置文件分两部分,一个是[DEFAULT]
的全局设置,另一部分是下面的个各个模块里面也可以单独设置。
默认情况下,各个模块是禁用的,需要手动去在每个模块下面edable = true
来启用模块。
另外一点需要注意的是需要手动去开启如何去处理也就是banaction = ufw
,也许你的系统就没装 ufw,如果要用 ufw 就要安装。
默认自带的过滤器在 /etc/fail2ban/filter.d/
文件夹下。
默认自带的执行单元在 /etc/fail2ban/action.d
文件夹下。
2.1. 默认sshd模块开启
[sshd]
#mode = normal
enabled = true
# 开启这个模块
port = ssh
filter = sshd
# 过滤器
#logpath = %(sshd_log)s
logpath = /var/log/auth.log
# 日志的位置
backend = %(sshd_backend)s
[sshd]
是模块
必有有enable = true
这个模块才开启。
2.2. 自定义模块开启
[ufw]
enabled=true
filter=ufw.aggressive
action=ufw
logpath=/var/log/ufw.log
maxretry=50
bantime=7d
ignoreip = 127.0.0.1/8
root@localhost:~# cat /etc/fail2ban/filter.d/ufw.aggressive.conf
[Definition]
failregex = [UFW BLOCK].+SRC=<HOST> DST
ignoreregex =
上面这事必须要做的一步
模块[ufw]
enable,过滤器也写好了,这样才能去打开。这里的防火墙用的ufw
2.3. backend = systemd
默认情况下
backend = auto
设置Fail2ban的后端要使用的文件系统监视器。有效的监视器有:pyinotify、gamin、polling、systemd和auto。
设置为"auto"则会轮询前面几个监视器,直到获取到有效的,一般情况下使用pyinotify。默认情况下安装时已经安
装了该监视器,所以该配置项无需设置。
当使用了systemd监视器时,则应该使用过滤器配置中的"journalmatch"配置项匹配日志。"logpath"选项则失效。
这部分请参考Fail2ban#Systemd_backend:_journald_filtering
当使用systemd后端来提高性能时,请使用journalmatch
配置过滤器。例如,仅解析内核级日志消息:
/etc/fail2ban/filter.d/fwdrop.local
[Definition]
failregex = ^.\*DROP\_.\*SRC=<ADDR> DST=.\*$
journalmatch = \_TRANSPORT=kernel
3. 使用 drop 来实现 ufw 关小黑屋
默认的ufw的规则使用的是reject,还可以使用deny
deny 用的是drop,这样对方就不能得到任何应答
具体方法是修改配置文件
/etc/fail2ban/action.d/ufw.conf
[Definition]
actionstart =
actionstop =
actioncheck =
# ufw does "quickly process packets for which we already have a connection" in before.rules,
# therefore all related sockets should be closed
# actionban is using `ss` to do so, this only handles IPv4 and IPv6.
actionban = if [ -n "<application>" ] && ufw app info "<application>"
then
ufw <add> <blocktype> from <ip> to <destination> app "<application>" comment "<comment>"
else
ufw <add> <blocktype> from <ip> to <destination> comment "<comment>"
fi
<kill>
actionunban = if [ -n "<application>" ] && ufw app info "<application>"
then
ufw delete <blocktype> from <ip> to <destination> app "<application>"
else
ufw delete <blocktype> from <ip> to <destination>
fi
# Option: kill-mode
# Notes.: can be set to ss or conntrack (may be extended later with other modes) to immediately drop all connections from banned IP, default empty (no kill)
# Example: banaction = ufw[kill-mode=ss]
kill-mode =
# intern conditional parameter used to provide killing mode after ban:
_kill_ =
_kill_ss = ss -K dst "[<ip>]"
_kill_conntrack = conntrack -D -s "<ip>"
# Option: kill
# Notes.: can be used to specify custom killing feature, by default depending on option kill-mode
# Examples: banaction = ufw[kill='ss -K "( sport = :http || sport = :https )" dst "[<ip>]"']
# banaction = ufw[kill='cutter "<ip>"']
kill = <_kill_<kill-mode>>
[Init]
# Option: add
# Notes.: can be set to "insert 1" to insert a rule at certain position (here 1):
add = prepend
# Option: blocktype
# Notes.: reject or deny
blocktype = deny # MODIFIED: DROP connections instead of REJECT.
# Option: destination
# Notes.: The destination address to block in the ufw rule
destination = any
# Option: application
# Notes.: application from sudo ufw app list
application =
# Option: comment
# Notes.: comment for rule added by fail2ban
comment = by Fail2Ban after <failures> attempts against <name>
# DEV NOTES:
#
# Author: Guilhem Lettron
# Enhancements: Daniel Black
root@C20240617226357:/etc/fail2ban/action.d#
有用的就是这一句
blocktype = deny # MODIFIED: DROP connections instead of REJECT.
4. 手动解除
总会有误伤友军的时候,
我们先查看状态,太多了,只展示一部分。
root@C20240617226357:~# fail2ban-client status
Status
|- Number of jail: 2
`- Jail list: sshd, ufw
root@C20240617226357:~# fail2ban-client status ufw
Status for the jail: ufw
|- Filter
| |- Currently failed: 558
| |- Total failed: 746
| `- Journal matches:
`- Actions
|- Currently banned: 1685
|- Total banned: 1706
`- Banned IP list: 1.15.172.243 1.161.52.238 1.200.128.158 1.70.12.222 1.70.126.164 1.70.141.13 1.70.9.182 100.42.187.124 101.126.21.63 101.133.153.24 101.133.233.145 101.34.210.148 101.36.108.133 101.37.205.32 101.37.225.65 101.37.85.27 ..... 47.76.86.139
4.1. 解除方法
fail2ban-client set ufw unbanip 125.36.101.127
fail2ban-client set 规则名称 unbanip xxx.xxx.xxx.xxx
操作后查看日志会有一条
cat /var/log/fail2ban.log
2024-08-07 08:38:07,792 fail2ban.actions [672]: NOTICE [ufw] Unban 125.36.101.127
4.2. 信任ip
可以在模块里面添加ignoreip = 127.0.0.1/8
来添加自己信任的ip
例如
[ufw]
enabled=true
filter=ufw.aggressive
action=ufw
logpath=/var/log/ufw.log
maxretry=50
bantime=7d
ignoreip = 127.0.0.1/8
5. 参考链接
https://github.com/fail2ban/fail2ban/wiki
https://blog.fernvenue.com/zh/archives/ufw-with-fail2ban/
https://wiki.archlinux.org/title/Fail2ban
https://www.cnblogs.com/RidingWind/p/13853770.html