# CentOS
yum install -y fail2ban
# ubuntu使用apt的系统
sudo apt-get install -y fail2ban
设置开机启动,并启动fail2ban
systemctl enable fail2ban
systemctl start fail2ban
fail2ban的配置文件位于 /etc/fail2ban
目录内,有以下重要配置文件(夹),分别对应三个核心概念:
jail.conf:
对应核心概念“jail”(牢笼/监狱),一个jail由action和filter组成,代表监控目标。jail.conf配置软件监控目标及发现恶意IP后的操作;action.d:
对应核心概念action(动作),表示发现恶意IP后采取的操作。action.d目录中预定义了许多常用操作,例如调用iptables/firewalld封禁、sendmail发送通知邮件;filter.d:
对应核心概念filter(过滤规则),过滤规则是用来匹配恶意行为的规则文件/正则表达式。filter.d目录内预定于了许多软件监控规则,例如SSH、Nginx、Apache。过滤规则配置文件位于在 /etc/fail2ban/filter.d
目录下,我们新建 frps.conf 文件
vim /etc/fail2ban/filter.d/frps.conf
写入如下内容:
[Definition]
failregex = ^.*get a user connection \[<HOST>:[0-9]*\]
^.*get a new work connection: \[<HOST>:[0-9]*\]
ignoreregex =
配置文件总共三行,分表表示过滤规则的定义、恶意请求的正则表达式、以及应该忽略的正则。failregex中的<HOST>
代表主机IP
系统内置的监控目标在 /etc/fail2ban/jail.conf
文件中,官方建议自定义的监控目标放在 /etc/fail2ban/jail.local
或者在 /etc/fail2ban/jail.d
目录中新建配置文件。本文将监控目标定义在 /etc/fail2ban/jail.local
文件里,写入下面内容:
[frp]
enabled = true
findtime = 600
maxretry = 10
bantime = 7200
filter = frps
logpath = /data/frp/log/frps.log
protocol = all
chain = all
port = all
action = iptables-allports[name=frp,protocol=tcp]
注: logpath需要根据实际的frps日志文件定义
配置说明
- frp:监控目标名称
- port:封禁全部端口
- filter:过滤规则,我们使用自定义的frps
- action:捕捉到恶意IP后执行的操作,本文使用iptables对IP封禁所有端口
- logpath:需要监控的日志文件
- bantime:封禁时间,单位为秒
- findtime:查找时间段,单位为秒
- maxretry:允许的最大失败次数,这里我们配置10分钟内触发10次规则,那么就封禁掉
修改配置文件后:
fail2ban-client reload
fail2ban-client status frp
# 语法:fail2ban-regex 日志文件 规则文件
fail2ban-regex /frps.log /etc/fail2ban/filter.d/frps.conf
输出内容如下
Running tests
=============
Use failregex filter file : frps, basedir: /etc/fail2ban
Use log file : /frps.log
Use encoding : UTF-8
Results
=======
Failregex: 2419 total
|- #) [# of hits] regular expression
| 1) [2419] ^.*get a user connection \[<HOST>:[0-9]*\]
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [2444] {^LN-BEG}ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T| ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
`-
Lines: 2444 lines, 0 ignored, 2419 matched, 25 missed
[processed in 0.13 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 25 lines
输出显示匹配到的行数、忽略的行数已经未匹配上的行数。
如果输出与预期相符,说明过滤规则书写正确,否则应该编辑规则文件,修改正则表达式后再次测试。
fail2ban提供了 fail2ban-client
查看监控状态。
# 查看fail2ban的运行状态
fail2ban-client status
# 输出内容如下:
# Status
# |- Number of jail: 2
# `- Jail list: frp, ssh-iptables
# 查看指定监控的状态
fail2ban-client status frp
# 输出内容如下
# Status for the jail: frp
# |- Filter
# | |- Currently failed: 0
# | |- Total failed: 10
# | `- File list: /data/frp/log/frps.log
# `- Actions
# |- Currently banned: 0
# |- Total banned: 1
# `- Banned IP list:
Banned IP list
列出了当前被封禁的IP。如果发现有误杀IP,可以用unbanip
解封:
fail2ban-client set nginxcc unbanip IP地址