你是否在担心你的服务器被暴力破解?你是否还在担心恶意频繁请求导致你的服务不可用?今天带给大家一款开源防护工具 “Fail2ban” ,从此让你睡个安稳觉,起因是因为自己家里开了公网IP,对外映射了一个内网都Linux机器,方便自己从外面访问到家里,今天一看日志,好家伙,ssh登录失败上千次,作为注重安全的哦,必须想办法阻止这一切。
很多人第一时间想到最好的办法就是使用白名单,只允许指定的IP地址访问到家里,确实是一个不错的办法,但是人在外面网络环境随时都在变化,可能是流量访问又可能是家庭网络,所以不是一个好的办法,为了让自己能访问,又要能把一些“非法”用户阻断,那么就用到了这款 “Fail2ban” ,今天就带大家一起来试试,学会了之后举一反三,它内置了很多规则,简单修改启用就可以达到意想不到的效果。
《来自ChatGPT生成》Fail2ban 是一款开源的安全工具,可用于自动阻止恶意 IP 地址的攻击、暴力破解等行为。它可以监视各种日志文件,例如 SSH、HTTP、FTP 等服务的日志文件,并根据用户定义的规则对恶意行为进行检测和响应。
Fail2ban 的工作方式如下:
Fail2ban 的优点包括:
但 Fail2ban 也有一些缺点,例如:
总体来说,Fail2ban 是一款非常有用的安全工具,可以帮助管理员自动阻止恶意行为,提高系统的安全性和稳定性。
Fail2ban官网:http://www.fail2ban.org/
Github开源地址:https://github.com/fail2ban/fail2ban
# Ubuntu、 本次演示使用Ubuntu 22.04.1 LTS,Fail2Ban v0.11.2版本下演示整个过程
sudo apt install fail2ban
# CentOS
sudo yum install fail2ban
Fail2ban安装完后就自带了很多缺省的配置,简单点说就是无需配置直接启用也能达到一定的效果,Fail2ban默认安装在/etc/fail2ban目录下,文件树形如下:
/etc/fail2ban/
├── action.d # 各种动作,默认自带很多常用的
│ ├── dummy.conf
│ ├── hostsdeny.conf
│ ├── iptables.conf
│ ├── mail-whois.conf
│ ├── mail.conf
│ ├── shorewall.conf
│ └── xxxxx.conf
│ .......
├── fail2ban.conf # 默认缺省配置
├── fail2ban.d # 启动目录
├── filter.d # 各种过滤器,默认自带很多常用的
│ ├── apache-auth.conf
│ ├── apache-noscript.conf
│ ├── couriersmtp.conf
│ ├── postfix.conf
│ ├── proftpd.conf
│ ├── qmail.conf
│ ├── sasl.conf
│ ├── sshd.conf
│ └── xxxxx.conf
│ .......
├── jail.conf # 默认监视配置
└─ jail.d
└── defaults-debian.conf ## SSH 相关配置
安装完成之后默认的缺省配置建议不要去动,我们直接拷贝默认的配置然后修改个性化的东西,这样是方便我们后续官方升级也不用担心不兼容,因为最终程序会将我们自定义的配置去覆盖缺省配置,没有修改的地方就会使用缺省配置。
# 切换到fail2ban目录
cd /etc/fail2ban
# 拷贝默认缺省配置
sudo cp fail2ban.conf fail2ban.local
# 拷贝默认监视配置,如果不想要全量的配置,可以不拷贝直接新增一个空文件自己编辑
sudo cp jail.conf jail.local
自定义SSH防护规则,编辑jail.local文件,可参考如下:
#DEFAULT配置开始 类似于全局配置,单个服务不配就使用默认的配置
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 1h
findtime = 1m
maxretry = 3
banaction = firewallcmd-ipset
action = %(action_mwl)s
#DEFAULT配置结束
#sshd服务配置开始
[sshd]
enabled = true
filter = sshd
port = 22
maxretry = 3
findtime = 60
bantime = -1
action = %(action_mwl)s
#sshd服务配置结束
各参数介绍:
上面的配置表示ssh服务在60s的周期内最大尝试3次失败,违反这个规则然后封禁IP永久。
# 启用fail2ban
sudo systemctl start fail2ban
# 查看状态 ,状态是running就对了,没对就检查配置
sudo fail2ban-client status
# 查看sshd服务具体状态
sudo fail2ban-client status sshd
默认输出一下内容:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
接下来我们通过自己的机器连续登录错误再看看状态:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 6
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 3
`- Banned IP list: 192.168.1.12
可以看到我连续ssh登录错误之后 Banned IP 出现了我的机器IP,然后从此再也连接不上ssh了,只有通过可视化工具接管服务器删除被Ban的IP,命令为:
fail2ban-client set sshd unbanip 192.168.1.12
我们继续查看fail2ban的日志,可以发现登录的IP都能看到,何时被Ban的也有。
root@ubuntu-dev:~# tail -f /var/log/fail2ban.log
2023-08-02 22:31:26,770 fail2ban.filter [2906926]: INFO [sshd] Found 192.168.1.12 - 2023-08-02 22:31:26
2023-08-02 22:31:29,616 fail2ban.filter [2906926]: INFO [sshd] Found 192.168.1.12 - 2023-08-02 22:31:29
2023-08-02 22:31:33,925 fail2ban.filter [2906926]: INFO [sshd] Found 192.168.1.12 - 2023-08-02 22:31:33
2023-08-02 22:31:34,271 fail2ban.actions [2906926]: NOTICE [sshd] Ban 192.168.1.12
2023-08-02 22:33:13,076 fail2ban.actions [2906926]: NOTICE [sshd] Unban 192.168.1.12
以上就完整的演示了如果使用Fail2ban保护自己的SSH服务,你可以举一反三保护你的nginx、mysql、redis、以及自建的一些服务,一些开源项目很多文档里面也写了如何配置fail2ban,比如gitea、vaultwarden,在找到Fail2ban也发现有人通过python脚本去解析对应的日志文件,抓取并统计然后进行执行防火墙阻断操作,其实Fail2ban也是同样的原理,定义要监控的日志文件,然后通过filter过滤出需要监视的内容,最终去执行action操作添加防火墙规则。
网络安全不容小觑,数据无价,除了日常做到定时备份,也要做到尽量把威胁阻挡在门外,以上就是Fail2ban全部内容了,觉得不错赶快去动手尝试吧。
fail2ban-client ping
:测试fail2ban服务是否启动成功,成功会输出pongfail2ban-server -V
:查看fail2ban版本号fail2ban-client status sshd
: 查看某个服务(这里是sshd,对应jail.local配置文件中[sshd])规则下被封禁的IP情况fail2ban-client set sshd unbanip 192.168.1.12
:解除某个服务的IP封禁,这里是解除sshd服务192.168.1.12的封禁fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
:测试filter规则是否正确tail /var/log/fail2ban.log
:查看Fail2ban日志信息fail2ban-client unban --all
:慎用,清理所有被ban的IP