检查Firewalld防火墙是否启用
# 关闭iptables(如果已安装):
service iptables stop
# 检查Firewalld状态:
firewall-cmd --state
# 启动Firewalld:
systemctl start firewalld
# 设置开机启动:
systemctl enable firewalld
开放SSH端口(22)事例:
# 放行22端口 如果改了ssh端口自行修改
firewall-cmd --zone=public --add-port=22/tcp --permanent
# 重载配置
firewall-cmd --reload
#查看已放行端口
firewall-cmd --list-all
1. 安装EPEL源:
yum install -y epel-release
2. 安装Fail2Ban:
yum install -y fail2ban-all
编辑jail.local
文件用来覆盖fail2ban的一些默认规则:
vi /etc/fail2ban/jail.local
配置以下内容:
[DEFAULT]
# IP白名单 白名单中的IP不会屏蔽,可填写多个以(,)分隔
ignoreip = 127.0.0.1/8 ::1
# 封禁时间 单位为秒(s)24小时可以设置成24h
bantime = 24h
# 在这个时间段内,超过最大重试次数就封禁该操作的IP
findtime = 3600
# 最大重试次数
maxretry = 6
# 屏蔽IP所使用的方法,这里使用firewalld屏蔽端口,使用的防火墙规则
banaction = firewallcmd-ipset
# 触发规则后的选择行为
action = %(action_)s
# 名称,可以随便填写
[sshd]
# 需要监听的项,规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
filter = sshd
enabled = true
# 需要监听的项
port = 22
action = %(action_)s
# 监听的日志路径
logpath = /var/log/secure
防止ssh爆破的方法之一就是修改22默认端口,之前龙哥有写过怎么修改了,大家可以回去查阅一下
上面的配置意思是如果同一个IP,在一小时内,如果连续超过6次错误,则使用Firewalld将他IP ban了。
我们输入查看被ban的IP
fail2ban-client status sshd
# 启动
systemctl start fail2ban
# 开机自启
systemctl enable fail2ban
tail -f /var/log/fail2ban.log
执行命令:
fail2ban-client status sshd
显示内容如下:
Status for the jail: sshd
|- Filter
| |- Currently failed: 4
| |- Total failed: 18
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 2
`- Banned IP list: 121.4.236.90 45.164.128.3
解释:
|- 暂时封禁的IP数:2
|- 总共封禁的IP数:2
`- 黑名单列表:121.4.236.90 45.164.128.3
#添加黑名单:
fail2ban-client set sshd banip IP_ADDRESS
#删除黑名单:
fail2ban-client set sshd unbanip IP_ADDRESS
yum install -y mailx
编辑/etc/mail.rc
文件(Debian系为/etc/s-nail.rc
):
vim /etc/mail.rc
在文件末尾增加以下配置:
# 发件人邮箱
set [email protected]
# 发件人邮箱的SMTP地址
set smtp=smtps://smtp.qq.com:465
# 发件人邮箱登陆账号
set [email protected]
# 发件人邮箱的授权码
set smtp-auth-password=e8765ds78c23
# 认证方式
set smtp-auth=login
# 忽略证书警告
set ssl-verify=ignore
# 证书所在目录
set nss-config-dir=/etc/pki/nssdb
测试:
echo '邮件内容' | mail -v -s '邮件标题' 收件人邮箱@qq.com
多个收件人请用逗号分隔。刚刚发送的邮件将会出现在收件箱或垃圾箱中。
编辑jail.local
文件:
vi /etc/fail2ban/jail.local
配置以下内容:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 24h
findtime = 1h
maxretry = 3
banaction = firewallcmd-ipset
# 邮件发送软件
mta = mail
# 发件人地址
sender = [email protected]
# 收件人地址
destemail = [email protected]
# 封禁IP+邮件通知
action = %(action_mw)s
[sshd]
filter = sshd
enabled = true
port = 22
logpath = /var/log/secure
编辑/etc/fail2ban/action.d/mail-whois.conf
文件:
vim /etc/fail2ban/action.d/mail-whois.conf
配置以下内容:
[INCLUDES]
before = mail-whois-common.conf
[Definition]
actionban = printf "警告!!!\n
被攻击机器名:`uname -n` \n
被攻击机器IP:`/bin/curl ifconfig.co` \n
攻击服务: \n
时间范围: 内 \n
攻击次数: 次 \n
攻击者IP: \n
攻击方式:暴力破解,尝试弱口令。\n
处理方式:已将加入防火墙黑名单,封禁时间为 秒。\n\n\t
——来自fail2ban邮箱\n
" | /bin/mailx -s "[]服务器遭到暴力攻击"
[Init]
name = default
dest = root
fail2ban-client reload
以Nginx为例,使用Fail2Ban监视Nginx日志,匹配短时间内频繁请求的IP,并使用Firewalld屏蔽这些IP,以达到CC防护的作用。
编辑/etc/fail2ban/filter.d/nginx-cc.conf
文件:
vi /etc/fail2ban/filter.d/nginx-cc.conf
# 2. 配置以下内容:
[Definition]
failregex = -.*- .*HTTP/1.* .* .*$failregex = ^.*".*HTTP.*" 444
ignoreregex =
继续修改和编辑/etc/fail2ban/jail.local
文件:
vi /etc/fail2ban/jail.local
配置以下内容:
[nginx-cc]
enabled = true
filter = nginx-cc
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
action = firewallcmd-ipset
上面的配置意思是如果在60s内,同一IP达到100次请求,则将其IP ban 1小时
以上只是龙哥测试用,具体你们按自己的实际情况修改。
logpath为nginx日志路径。
fail2ban-client reload
以上是在CentOS 7上安装和配置Fail2Ban以防止SSH暴力破解的步骤。完成这些配置后,系统会自动监视SSH登录情况,并在检测到异常活动时封禁相应的IP地址。还可以根据需要添加自定义的拦截规则,如防止CC攻击。
要查看Fail2Ban的当前状态和活动的监视规则,可以使用以下命令:
fail2ban-client status
该命令将显示当前封禁的IP地址、活动的Jail(监狱)以及每个Jail中的封禁次数和封禁时间。
要验证Fail2Ban是否能够正确匹配和封禁违规行为,可以使用以下命令进行模拟测试:
fail2ban-client set JAILNAME banip IP_ADDRESS
将JAILNAME
替换为目标Jail的名称,IP_ADDRESS
替换为要模拟封禁的IP地址。这将模拟一个违规行为,并将该IP地址加入封禁列表。
为了解除对模拟IP地址的封禁,可以使用以下命令:
fail2ban-client set JAILNAME unbanip IP_ADDRESS
同样,将JAILNAME
替换为目标Jail的名称,IP_ADDRESS
替换为要解除封禁的IP地址。
请注意,进行模拟测试时应小心,以避免意外封禁真实的合法用户。
如果您经常分析日志,您可能会发现有大量机器人在扫描WordPress登录页面wp-login.php。尽管他们可能没有成功,但为了避免潜在风险,将这些IP地址封禁可能是明智的。
首先,您需要创建一个新的Nginx日志匹配规则。请打开/etc/fail2ban/filter.d/wordpress.conf
文件,并将以下内容填写进去:
[Definition]
failregex = ^ -.* /wp-login.php.* HTTP/1\.."
ignoreregex =
接下来,在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
完成以上配置后,请记得执行systemctl restart fail2ban
命令以重启Fail2Ban使其生效。
以下是一些常用的命令:
systemctl start fail2ban
systemctl stop fail2ban
systemctl enable fail2ban
fail2ban-client status sshd
fail2ban-client set sshd delignoreip 192.168.111.111
tail /var/log/fail2ban.log
总结:Fail2Ban已经预设了许多匹配规则,这些规则位于filter.d
目录下,并包含了常见的SSH、FTP、Nginx和Apache等日志匹配。
如果这些规则都无法满足您的需求,您还可以自行创建规则来匹配异常的IP地址。
更多规则详情可以查看我另外一篇文章接上一篇Centos下fail2ban 的各种配置规则详解 包含apache/nginx/mysql防御规则
使用Fail2Ban结合Firewalld来阻止恶意IP地址是提高服务器安全性的有效方法。
喜欢龙哥的作品记得三连哦,你的支持是我更新的动力