0.初始准备,检查Firewalld
宝塔面板默认的防火墙是Firewalld,而且宝塔面板自带的安全设置也是基于Firewalld,如果没有另行安装iptables的话,直接跳到第一步【1.安装Fail2Ban】即可。如果有安装使用iptables请参考以下命令。
#如果您已经安装iptables建议先关闭
service iptables stop
#查看Firewalld状态
firewall-cmd --state
#启动firewalld
systemctl start firewalld
#设置开机启动
systemctl enable firewalld.service
启用Firewalld后会禁止所有端口连接,因此请务必放行常用的端口,以免被阻挡在外,以下是放行SSH端口(22)示例,供参考:
#放行22端口
firewall-cmd --zone=public --add-port=22/tcp --permanent
#重载配置
firewall-cmd --reload
#查看已放行端口
firewall-cmd --zone=public --list-ports
1.安装Fail2Ban
1.1 从源安装
由于CentOS没有内置Fail2Ban的源,因此我们要先安装EPEL存储库。
注意要root身份下运行
yum install epel-release
备注:宝塔面板默认安装好了EPEL源,可以不用安装这个。直接按下述命令安装Fail2Ban即可。
随后安装Fail2Ban,【centos源的fail2ban版本会偏低一点,vo.9.7】
yum install fail2ban fail2ban-systemd
1.2 从github安装/更新
项目下载地址:
https://github.com/fail2ban/fail2ban/releases
安装命令
#从github下载相应版本
wget https://github.com/fail2ban/fail2ban/archive/0.10.4.tar.gz
#解压
tar -xf 0.10.4.tar.gz
#进入解压目录
cd fail2ban-0.10.4
#安装
python setup.py install
2.运行Fail2Ban服务并设置开机自启
systemctl enable fail2ban
systemctl start fail2ban
3.配置Fail2Ban
安装成功后Fail2ban配置文件位于
/etc/fail2ban
其中jail.conf
为主配置文件,相关的匹配规则位于filter.d目录
开始配置文件
- 下述的操作用web管理面板操作其实更简单,如宝塔面板等,直接用面板的文件管理器手动编辑文件就行了,就像是平常在Windows下用记事本软件编辑文档,我超喜欢用面板操作的,vi命令又不会,只能用面板操作度日这样子。
默认的Fail2Ban配置文件位于
/etc/fail2ban/jail.conf
里面有一些默认的配规则,但是Fail2Ban升级之后会将其覆盖掉,所以我们要新建一个配置文件来保证配置不会被因为Fail2Ban升级而丢失【该文件可覆盖主配置文件的设置】。
我们需要新建一个名为jail.local
的文件,以便Fail2Ban找到它。
操作如下:
#新建配置文件,面板操作则直接在指定位置新建指定文件
vi /etc/fail2ban/jail.local
#默认配置,面板操作则直接复制粘贴后按需修改
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s
上面配置规则的说明,按需修改
- ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
- bantime:屏蔽时间,单位为秒(s)
- findtime:时间范围
- maxretry:最大次数
- banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口
-
注意:使用Fail2Ban时,要把自己的IP加入白名单,动态IP的可以绑定一个白名单域名,防止自己由于某些测试操作达成成就“我Ban我自己”,而连不上服务器。
防止SSH爆破
继续修改
jail.local
这个配置文件,在后面继续加入如下内容:
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
上面规则的说明,按需修改
- [sshd]:名称,可以随便填写
- filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
- port:对应的端口
- action:采取的行动
- logpath:需要监视的日志路径
Nginx防止CC攻击
下述操作换成用面板进行还是照样新建文件>>复制粘贴即可。
#需要先新建一个nginx日志匹配规则,面板操作直接在文件夹下,新建指定文件
vi /etc/fail2ban/filter.d/nginx-cc.conf
#填写如下内容,面板操作则直接复制粘贴
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =
然后再打开jail.local
文件
换成命令行操作就是
vi /etc/fail2ban/jail.local
在文件里添加如下内容【面板操作照样复制粘贴】:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log
上述规则说明,按需修改
- 上面的配置意思是如果在60s内,同一IP达到20次请求,则将这个IP Ban 1小时。
logpath
为nginx
日志路径。
防止WordPress爆破
如果分析日志发现有大量机器人在扫描wordpress登录页面wp-login.php,虽然对方可能没成功,但是为了避免万一还是将他IP干掉为好。
下述操作换成用面板进行还是照样新建文件>>复制粘贴即可
#需要先新建一个nginx日志匹配规则,面板操作直接在文件夹下,新建指定文件
vi /etc/fail2ban/filter.d/wordpress.conf
#填写如下内容,面板操作则直接复制粘贴
[Definition]
failregex = ^<HOST> -.* /wp-login.php.* HTTP/1\.."
ignoreregex =
然后再打开jail.local
文件
换成命令行操作就是
vi /etc/fail2ban/jail.local
在文件里添加如下内容【面板操作照样复制粘贴】:
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log
4.输入命令使配置生效
#重启Fail2Ban使其生效
systemctl restart fail2ban
Fail2Ban的常用命令
#查看当前版本
fail2ban-server -V
#启动fail2ban服务
systemctl start fail2ban
#停止
systemctl stop fail2ban
#开机启动
systemctl enable fail2ban
#查看被ban IP,其中sshd为名称
fail2ban-client status sshd
#删除被ban IP
fail2ban-client set sshd delignoreip 192.168.111.111
#查看日志
tail /var/log/fail2ban.log
#启动后验证fail2ban是否正常运行正常响应内容为Server replied: pong
fail2ban-client ping
文章参考来源: