一、准备工作

  1. 检查Firewalld防火墙是否启用

    # 关闭iptables(如果已安装):
      service iptables stop
    # 检查Firewalld状态:
      firewall-cmd --state
    # 启动Firewalld:
      systemctl start firewalld
    # 设置开机启动:
      systemctl enable firewalld
    
  2. 开放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

三、配置

1、只封禁IP

1.1、增加配置

  1. 编辑jail.local文件用来覆盖fail2ban的一些默认规则:

    vi /etc/fail2ban/jail.local
    
  2. 配置以下内容:

    [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

1.2、启动程序

# 启动
systemctl start fail2ban
# 开机自启
systemctl enable fail2ban

1.3、查看日志

tail -f /var/log/fail2ban.log

1.4、查看黑名单

  1. 执行命令:

    fail2ban-client status sshd
    
  2. 显示内容如下:

    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

2、设置黑名单

#添加黑名单:
fail2ban-client set sshd banip IP_ADDRESS
#删除黑名单:
fail2ban-client set sshd unbanip IP_ADDRESS

3、封禁IP+发送邮箱

3.1、安装邮箱

yum install -y mailx

3.2、配置Mailx

  1. 编辑/etc/mail.rc文件(Debian系为/etc/s-nail.rc):

    vim /etc/mail.rc
    
  2. 在文件末尾增加以下配置:

    # 发件人邮箱
    set from=xxxxx@qq.com
    # 发件人邮箱的SMTP地址
    set smtp=smtps://smtp.qq.com:465
    # 发件人邮箱登陆账号
    set smtp-auth-user=xxxxx@qq.com
    # 发件人邮箱的授权码
    set smtp-auth-password=e8765ds78c23
    # 认证方式
    set smtp-auth=login
    # 忽略证书警告
    set ssl-verify=ignore
    # 证书所在目录
    set nss-config-dir=/etc/pki/nssdb
    
  3. 测试:

    echo '邮件内容' | mail -v -s '邮件标题' 收件人邮箱@qq.com
    

    多个收件人请用逗号分隔。刚刚发送的邮件将会出现在收件箱或垃圾箱中。

3.3、配置Fail2Ban

  1. 编辑jail.local文件:

    vi /etc/fail2ban/jail.local
    
  2. 配置以下内容:

    [DEFAULT]
    ignoreip = 127.0.0.1/8 ::1
    bantime = 24h
    findtime = 1h
    maxretry = 3
    banaction = firewallcmd-ipset
    
    # 邮件发送软件
    mta = mail
    # 发件人地址
    sender = xxxxx@qq.com
    # 收件人地址
    destemail = yyyyy@qq.com
    # 封禁IP+邮件通知
    action = %(action_mw)s
    
    [sshd]
    filter = sshd
    enabled = true
    port = 22
    logpath = /var/log/secure
    

3.4、配置警告内容

  1. 编辑/etc/fail2ban/action.d/mail-whois.conf文件:

    vim /etc/fail2ban/action.d/mail-whois.conf
    
  2. 配置以下内容:

    [INCLUDES]
    before = mail-whois-common.conf
    
    [Definition]
    actionban = printf "警告!!!\n
     			  被攻击机器名:`uname -n` \n
     			  被攻击机器IP:`/bin/curl ifconfig.co` \n
     			  攻击服务:<name> \n
     			  时间范围:<findtime> 内 \n
     			  攻击次数:<failures> 次 \n
     			  攻击者IP:<ip> \n
     			  攻击方式:暴力破解,尝试弱口令。\n
     			  处理方式:已将<ip>加入防火墙黑名单,封禁时间为 <bantime> 秒。\n\n\t           
     			       ——来自fail2ban邮箱\n
     			       " | /bin/mailx -s "[<name>]服务器遭到<ip>暴力攻击" <dest>
    
    [Init]
    name = default
    dest = root
    

3.5、重载配置

fail2ban-client reload

4、自定义拦截规则

4.1、防止CC攻击

以Nginx为例,使用Fail2Ban监视Nginx日志,匹配短时间内频繁请求的IP,并使用Firewalld屏蔽这些IP,以达到CC防护的作用。

4.2、增加一个nginx日志匹配规则

  1. 编辑/etc/fail2ban/filter.d/nginx-cc.conf文件:

    vi /etc/fail2ban/filter.d/nginx-cc.conf
      # 2. 配置以下内容: 
    [Definition]
    failregex =  -.*- .*HTTP/1.* .* .*$failregex = ^<HOST>.*".*HTTP.*" 444
    ignoreregex =
    
  2. 继续修改和编辑/etc/fail2ban/jail.local文件:

    vi /etc/fail2ban/jail.local
    
  3. 配置以下内容:

    [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日志路径。

4.3、重载配置

fail2ban-client reload

以上是在CentOS 7上安装和配置Fail2Ban以防止SSH暴力破解的步骤。完成这些配置后,系统会自动监视SSH登录情况,并在检测到异常活动时封禁相应的IP地址。还可以根据需要添加自定义的拦截规则,如防止CC攻击。

4.4、查看Fail2Ban状态

要查看Fail2Ban的当前状态和活动的监视规则,可以使用以下命令:

fail2ban-client status

该命令将显示当前封禁的IP地址、活动的Jail(监狱)以及每个Jail中的封禁次数和封禁时间。

4.5、检测和测试规则

要验证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爆破(毕竟目前个人小站主要用这个)

如果您经常分析日志,您可能会发现有大量机器人在扫描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使其生效。

以下是一些常用的命令:

  • 启动Fail2Ban:systemctl start fail2ban
  • 停止Fail2Ban:systemctl stop fail2ban
  • 设置Fail2Ban开机启动:systemctl enable fail2ban
  • 检查被封禁的IP地址(例如,对于上面的[wordpress] Jail):fail2ban-client status sshd
  • 解除封禁的IP地址:fail2ban-client set sshd delignoreip 192.168.111.111
  • 查看Fail2Ban日志:tail /var/log/fail2ban.log

总结:Fail2Ban已经预设了许多匹配规则,这些规则位于filter.d目录下,并包含了常见的SSH、FTP、Nginx和Apache等日志匹配。
如果这些规则都无法满足您的需求,您还可以自行创建规则来匹配异常的IP地址。
更多规则详情可以查看我另外一篇文章接上一篇Centos下fail2ban 的各种配置规则详解 包含apache/nginx/mysql防御规则
使用Fail2Ban结合Firewalld来阻止恶意IP地址是提高服务器安全性的有效方法。
喜欢龙哥的作品记得三连哦,你的支持是我更新的动力

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐