Fail2Ban安装使用教程 因为作为一个 linux 入门级别的小白, 很多人都会把一些 web 面板(比如宝塔面板)作为自己管理 vps 的首选, 而当我一段时间登录宝塔面板之后, 有时就会看到提示发现自己的 SSH 登录竟然失败了上万次! 可这都不是我干的呀(我不是我没有!) 如果自己的 SSH 密码真的被暴力破解了怎么办呢? 那么…试试 fail2ban?
1、对于CentOS6以下, 以及Fedora
sudo yum install fail2ban
2、对于ubuntu, Debian或Linux Mint
sudo apt-get install fail2ban
/etc/fail2ban ## fail2ban 服务配置目录
/etc/fail2ban/action.d ## iptables 、mail 等动作文件目录
/etc/fail2ban/filter.d ## 条件匹配文件目录,过滤日志关键内容
/etc/fail2ban/jail.conf ## fail2ban 防护配置文件
/etc/fail2ban/fail2ban.conf ## fail2ban 配置文件,定义日志级别、日志、sock 文件位置等
cd /etc/fail2ban ## 进入配置文件所在的目录
cp jail.conf jail.local ## 备份配置文件
通过运行上面的命令, 我们已经完成了 fail2ban 的安装, 接下来就是 fail2ban 的配置
首先使用 vi 或者 vim 打开 fail2ban 的规则配置文件
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
你将会看到这样的配置文件(从红色划线记号 [Default] 开始向下翻阅需要更改的配置)
在 [Default] 中, 主要修改 bantime, findtime, 以及 maxretry 这三个选项
图片中三个选项的意思就是在 10 分钟内失败超过 3 次的用户将会被封禁 24 小时
接下来可以按需开启需要的规则, 前文我们说到的 ssh 暴力破解,可以通过设置 fail2ban 中的 [sshd] 规则来防止。
从 [Default] 继续向下翻阅很长的一段之后,我们就来到单个规则的配置啦, 以单个开启 [sshd] 规则为例
我们需要设置 enabled=true 来激活它; 如果你有更改过 ssh 的端口的话(比如改成 1123), 就在 port 需要添加 1123 这个端口(如图)
修改封禁方式为 firewall
banaction = firewallcmd-multiport
修改完配置之后,需要重载让配置生效:
fail2ban-client reload
Fail2ban 的默认 iptables 封禁策略为 REJECT –reject-with icmp-port-unreachable,需要变更 iptables 封禁策略为 DROP。
cp /etc/fail2ban/action.d/iptables-multiport.conf /etc/fail2ban/action.d/iptables-multiport.local
vi /etc/fail2ban/action.d/iptables-multiport.local
修改内容如下:
[Init]
blocktype = DROP
最后,别忘记重启fail2ban使其生效
sudo systemctl restart fail2ban
在配置完成后, 当然是选择激活它啦
1、对于 CentOS7/8,Fedora
sudo systemctl restart fail2ban
2、对于 Debian, Ubuntu 或 CentOS6:
sudo service fail2ban restart
如果是第一次启动的话建议把命令中的 restart 换成 start
CentOS 设置 fail2ban 自启
systemctl enable fail2ban.service
如果要检验 fail2ban 有没有正确启动, 可以使用这个命令
sudo fail2ban-client ping
如果正确启动的话 fail2ban 会以 pong 作为回应 (Server replied: pong), 其他情况就需要看看配置文件的格式正确以及是不是用 start 命令启动 fail2ban 什么的…
如果要查看 fail2ban 目前启用的规则的话
fail2ban-client status
查看某个规则下被封禁的次数以及 ip(以 [sshd] 规则为例)
fail2ban-client status sshd
查看当前被禁止登陆的ip:
[root@121]## fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure #日志文件路径
| |- Currently failed: 0 #当前失败次数
| `- Total failed: 3 #总失败次数
`- action
|- Currently banned: 1 #当前禁止的ip数量
| `- IP list: 192.168.1.112 #当前禁止的ip
`- Total banned: 1 #禁止的ip总数
fail2ban-client
命令 | 说明 |
---|---|
start | 启动fail2ban server和监狱 |
reload | 重新加载配置文件 |
stop | 暂停fail2ban和监狱 |
status | 查看运行的监控服务数量和列表 |
set loglevel | 设置日志等级,有 CRITICAL, ERROR, WARNING,NOTICE, INFO, DEBUG |
get loglevel | 获取当前日志的等级 |
set idle on\off | 设置某个监控(监狱)的状态。 |
set addignoreip | 设置某个监控(监狱)可以忽略的ip |
set delignoreip | 删除某个监控(监狱)可以忽略的ip |
set banip | 将ip加入 监控(监狱) |
set unbanip | 将ip从监控(监狱)移除 |
fail2ban 的日志默认在 /var/log/fail2ban.log
日志中记录着 Ban IP 的记录和 UnBan IP 的记录
也有修改配置文件重载后的记录
cat /var/log/fail2ban
追加配置
vi /etc/fail2ban/jail.d/jail.local
## 针对各服务的检查配置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置
[ssh-iptables]
## 忽略的IP列表,不受设置限制(白名单)
ignoreip = 127.0.0.1
## 日志修改检测机制(gamin、polling和auto这三种)
backend=auto
## 是否激活此项(true/false)
enabled=true
## 过滤规则filter的名字,对应filter.d目录下的sshd.conf
filter= sshd
## ssh端口
port=22
## 动作的相关参数
blocktype = DROP
action= %(banaction)s[blocktype=%(blocktype)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
## 触发报警的收件人
## sendmail-whois[name=SSH, dest=root, sender=邮箱地址, sendername="Fail2Ban"]
## 检测的系统的登陆日志文件
logpath=/var/log/secure
## 禁止30分钟
bantime=1800
## 这个时间段内超过规定次数会被ban掉
findtime=300
## 最大尝试次数
maxretry=3
重载配置:fail2ban-client reload
查看状态:fail2ban-client status ssh-iptables
vi /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = <HOST> -.*- .*HTTP/*.* (404|444|403|400) .* .*$
ignoreregex =
保存后测试配置文件相对于日志是否正确
fail2ban-regex /www/wwwlogs/access.log /etc/fail2ban/filter.d/nginx-404.conf
可以看出一共五条记录,规则过滤出了两条,三条正常的记录
然后将封禁规则加入配置文件
vi /etc/fail2ban/jail.d/jail.local ## 文件尾部写入
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
action = %(banaction)s[blocktype=%(blocktype)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
blocktype = DROP
logpath = /home/wwwlogs/access.log
bantime = 14400
findtime = 3
maxretry = 3
如果是多个日志文件注意一定要对齐,等号后面的一定要对齐
logpath = /www/wwwlogs/access.log /www/wwwlogs/wangtwothree.log /www/wwwlogs/blog.wangtwothree.com.log
重载配置:fail2ban-client reload
查看状态:fail2ban-client status nginx-404
以 Nginx 为例,使用 fail2ban 来监视 nginx 日志,匹配短时间内频繁请求的 IP,并使用 firewalld 将其 IP 屏蔽,达到 CC 防护的作用。
增加规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
failregex = <HOST> -.*- .*HTTP/*.* .* .*$
ignoreregex =
检测规则:
fail2ban-regex /www/wwwlogs/access.log "<HOST> -.*- .*HTTP/*.* .* .*$"
fail2ban-regex /www/wwwlogs/access.log /etc/fail2ban/filter.d/nginx-cc.conf
追加配置
vi /etc/fail2ban/jail.d/jail.local
[nginx-cc]
filter = nginx-cc
enabled = true
port = http,https
bantime = 2h
findtime = 30s
maxretry = 40
action = %(banaction)s[blocktype=%(blocktype)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
blocktype = DROP
logpath = /www/wwwlogs/access.log
意思是如果在 30 秒内,同一 IP 达到 40 次请求,则将其封禁 2 小时,具体根据实际情况修改。
重载配置:fail2ban-client reload
查看状态:fail2ban-client status nginx-cc
要验证 FirewallD 黑名单是否成功,请检查 drop 区和 blacklist ipset
sudo firewall-cmd --direct --get-all-rules
sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
sudo firewall-cmd --info-zone=drop
sudo firewall-cmd --info-ipset=blacklist | less
第二条命令将输出所有的子网,这些子网是基于被封杀的国家而添加的,可能会相当长。