必要资料
- 官方代码库 https://github.com/fail2ban/fail2ban
- 过滤规则文档 https://fail2ban.readthedocs.io/en/latest/filters.html#filter-test-cases
以为这些就够了吗?不够的,还有一些要注意的地方花了我较多的时间。安装
快速安装
由于在Ubuntu和CentOS的源里本身就带了这个软件的库,所以我们只要简单调用对应系统的安装命令就可以了。在ubuntu里安装的版本是0.97
CentOS
1
sudo yum install fail2ban
Ubuntu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15sudo apt-get install fail2ban
````
## 手动安装较新的稳定版
1. 由于源里的版本太低,不支持mongodb,是几年前的版本,因此如果有mongodb要保护,去他的github上下载较新的版本,这里选择0.10.6
(具体选择哪种方式,可以根据源的版本来决定)
手动安装非常简单,不需要编译,因为使用python写的。
````shell
wget https://github.com/fail2ban/fail2ban/archive/0.10.6.zip
unzip fail2ban-0.10.6.zip
cd fail2ban-0.10.6
sudo python setup.py install- 手动安装的需要自己增加服务
在解压好的文件夹 fail2ban-0.10.6,执行下面命令。
1
2
3sudo cp files/debian-initd /etc/init.d/fail2ban
sudo update-rc.d fail2ban defaults
sudo service fail2ban start #或sudo systemctl start fail2ban- 开机后自动启动
1
sudo systemctl enable fail2ban
- 检查设置自动启动是否成功
1
sudo systemctl is-enabled fail2ban #查询是否已设置为自启动
- 删除老的fail2ban数据库
如果是曾经安装过,现在安装的是不同的版本,需要检查对应版本的changelog,看是否需要对已经持久化的fail2ban数据库进行删除或更新。因为版本不同,数据库格式可能不同。
- 手动安装的需要自己增加服务
配置
配置文件在/etc/fail2ban里,主要编辑jail.conf文件就可以了。(具体哪个文件,可能不同系统后缀名不同,请自行辨别)
也可以把所有自定义的配置写在自己新建的jail.local文件里(推荐)
解释下几个关键要设置的地方
不会被禁止的IP列表
1
ignoreip = 127.0.0.1/8 #这个是默认值
这里在测试Fail2ban生效之前,可以再加上云服务(如果是云服务器)内网地址,方便你如果本机被禁止访问,可以通过另外一台服务器或内网登录目标服务器,对自己解除屏蔽。
这是腾讯云的地址1
ignoreip = 127.0.0.1 192.168.0.0/24 #这里屏蔽了敏感内网地址,请根据自己需要配置。
客户端主机被禁止的时长(秒)
1
bantime = 600 默认是10分钟,建议改大一点。
ssh服务的最大尝试次数 超过这个次数的就会被拒绝掉。
1
maxretry = 5 #默认是5 请自行设置
自定义配置
- 在/etc/fail2ban添加配置文件:jail.local,在这里可以做自己需要的修改。
开启vsftpd的jail
编辑/etc/failban/jail.local
注意了!!如果自定义了端口号,一定要把自定义的几个端口号全部加上,不然可能挡不住。
这个问题困扰了我2天,因为觉得只要把认证的端口屏蔽就可以了,其实这样不行。。。
1 | [vsftpd] |
这个问题困扰了我一天, 最后fail2ban的贡献者给了我正确的正则,详细见:https://github.com/fail2ban/fail2ban/issues/2884#issuecomment-736571316
完整的jail.local
1 | [DEFAULT] |
上面的端口需要改成实际服务器上的。
针对CentOS特别的sshd配置:
因为最近有一台CentOS的系统需要装fail2ban,则在实际操作过程中,发现ssh防护不起作用。研究发现需要按照下面的写法才可以,centos 没有默认把登录日志写在/var/log/auth.log 而是写在/var/log/secure
另外,不知道为啥,全局的action不管用,所以只好加入自定义的banction。
能够正常使用的代码如下 (port 端口根据自己的自定义)
1 | [sshd] |
要移除某个ip,要根据上面设定的banaction的名字来写。
上面例子写的name=ssh,移除时要移除的类型就是 f2b-ssh
1 | sudo iptables -D f2b-ssh -s 223.166.112.66 -j REJECT |
重新启动服务,使配置生效
1 | sudo systemctl restart fail2ban |
禁止或允许某个IP访问服务器某个端口
禁止访问某端口
1
sudo iptables -I INPUT -p tcp --dport 30032 -s 180.173.18.28 -j DROP
允许访问某端口
1
sudo iptables -I INPUT -p tcp --dport 30032 -s 180.173.18.28 -j ACCEPT
删除增加的IP
1
sudo iptables -D INPUT -s 180.173.18.28 -p tcp -j DROP --dport 10062
将被禁止IP从屏蔽IP列表中移除
被禁止的IP地址存放在iptables里。
查看被禁止IP列表
1
sudo iptables --list -n
列表如下:
1
2
3
4
5
6Chain f2b-sshd (1 references)
target prot opt source destination
REJECT all -- 141.98.9.31 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 141.98.9.36 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 141.98.9.35 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 141.98.9.34 0.0.0.0/0 reject-with icmp-port-unreachable1.从列表中删除要被移除的IP
命令说明:
1 | sudo iptables -D [填Chain的名字] -s [IP地址] -j [填target的参数] |
举例:
1 | sudo iptables -D f2b-sshd -s 114.92.35.21 -j REJECT #这里几个参数都是要从上面的列表中查到,不是只改IP就可以。 |
1.另外一种移除IP的方法(请使用这个方法)
1 | sudo fail2ban-client set sshd unbanip 116.232.143.41 |
发送警报邮件
安装mailx邮件发送程序
安装
1
sudo apt-get install bsd-mailx
安装完毕后,会出现一个粉红色的界面,然后根据提示,选择Internet SMTP发送邮件。
配置发送邮件的账户
编辑/etc/mail.rc1
sudo vim mail.rc
根据选用的邮箱服务进行设置,基本如下:
1
2
3
4
5set from=发邮件的邮箱地址
set smtp=smtps://smtp.exmail.qq.com:465
set smtp-auth-user=发邮件的邮箱地址(同上)
set smtp-auth-password=发邮件的邮箱密码
set smtp-auth=login
测试
1
cat /opt/tesh |mailx -v -s '来自你的服务器' '你能接收邮箱的地址'
登录你接收邮箱,点击收邮件,如果在收件箱或垃圾箱找到,就证明配置成功了。
发送邮件
1
mailx -s '邮件标题' '接收的邮箱地址'
然后按ctrl+D发送,如果你不动,是不会发送的。不要以为是程序出错了哦!
发送邮件到QQ企业邮箱
可能是因为dsb-mailx版本问题,无法使用TSL功能,发送邮件都不成功。
所以以下配置在dsb-mailx的 8.1.2-0.20160123cvs-2版本没有达成效果。最后采用的方法是:
邮件发送到普通的QQ邮箱,然后在QQ邮箱里设置转发规则,将邮件发送到指定企业邮箱。如果发送到的邮箱是qq邮箱,那么大概率就成功了。可是发到QQ企业邮箱的话,绝对会失败。
所以需要额外的设置一些参考文章
https://blog.csdn.net/Aibiabcheng/article/details/109202831在QQ企业邮箱,绑定微信安全登录,生成授权码。
在/etc/mail.rc里使用授权码,而不是邮箱密码。安装腾讯的邮箱证书(网易等其他邮箱都是一样,只是smtp地址不同)
服务端需要安装libnss3-tools来完成证书的生成- 安装必要的程序
1
sudo apt install libnss3-tools #下面生成证书要使用 certutil包含在这个包里。
- 生成证书
1
2
3
4
5echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -L -d ~/.certs
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt #认证会在~/.certs下发现生成了几个文件
更新/etc/mail.rc文件,加入证书路径好
1
2
3
4
5
6
7set from=发邮件的邮箱地址
set smtp=smtps://smtp.exmail.qq.com:465
set smtp-auth-user=发邮件的邮箱地址(同上)
set smtp-auth-password=发邮件的邮箱的授权码(不是密码哦)
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/home/ubuntu/.certs
配置Fail2ban警报发送邮箱
修改jail.conf配置文件
我们使用mail来发送邮件,所有要修改mta = mail1
2
3
4
5
6
7
8
9
10
11
12# Some options used for actions
# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
destemail = username@email.com #请改成自己的
# Sender email address used solely for some actions
sender = username@email.com #请改成自己的
# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
mta = mail #这里默认为sendmail,我们修改为mail,不使用sendmail。