宝塔面板6.X安装fail2ban+ Firewalld防止CC攻击

宝塔面板7字数 5620阅读模式

CC(Challenge Collapsar)攻击者会利用一个或多个 IP (通过代理服务器或肉鸡)向您的网站频繁发起请求,直到服务器资源耗尽,甚至宕机崩溃。

fail2ban是由Python语言开发监控软件,通过监控系统日志的登录信息来调用iptables屏蔽相应登录IP,以阻止某个IP恶意访问。因为CentOS 7已经自带Firewalld,并且使用Firewalld作为网络防火墙更加简单方便,而且宝塔面板可以在文件管理中编辑jail.conf,无形中也降低了使用难度。今天我们就来谈谈巧用fail2ban+ Firewalld防止爆破与CC攻击。

一:安装fail2ban

宝塔面板默认的是Firewalld已经是在运行了,而且宝塔面板自带的安全设置也是基于Firewalld,所以和fail2ban搭配起来使用也是更简单。fail2ban对应日志文件,Debian/Ubuntu:/var/log/auth.log、CentOS/Redhat:/var/log/secure。命令如下:

apt-get install fail2ban

#CentOS内置源并未包含fail2ban,需要先安装epel源,宝塔面板默认安装好了epel源,可以不用安装这个。直接安装fail2ban即可。
yum -y install epel-release
#安装fail2ban
yum -y install fail2ban

fail2ban安装好之后,如下显示,如图:

宝塔面板6.X安装fail2ban+ Firewalld防止CC攻击

这样就安装好了fail2ban。安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到,如果需要详细了解可自行搜索。宝塔面板使用fail2ban相对来说会很方便,我们可以在文件管理中找到并且编辑,路径是:/etc/fail2ban,图示:

宝塔面板6.X安装fail2ban+ Firewalld防止CC攻击

二:配置规则

安装完成后主要的配置文件在/etc/fail2ban目录下,简单介绍如下:

fail2ban.conf :配置文件里面定义了fail2ban记录的日志等级、日志文件的位置以及socket。

jail.conf 里面定义了对那些服务进行监控,以及使用的一些策略。

jail.conf 里面开头是默认全局配置块[DEFAULT],默认配置规则说明如下:(宝塔面板用户编辑jail.conf,我们从47行开始)!

[DEFAULT]
#忽略哪些IP,可以是具体IP、CIDR类型的地址,多个IP用空格或都好分开,这里相当于ip地址白名单,还需要注意把自己的IP加入白名单,动态IP的可以绑定一个白名单域名,这样防止防止自己不小心测试或者什么的,被BAN了,自己的服务器都连接不上
ignoreip = 127.0.0.1/8

#设置IP被锁住的时间,单位为秒
bantime  = 600

#检测时间,在此时间内超过规定的次数会激活fail2ban
findtime  = 600

#尝试的次数
maxretry = 3

#日志检测机器,有"gamin", "polling" and "auto"三种模式。
backend = polling

#发送报警邮件的地址
destemail = root@localhost #默认的动作执行行为,在action.d目录下有各种行为策略
banaction = iptables-multiport

#0.8.1版本后fail2ban默认用sendmail MTA
mta = sendmail

#默认使用tcp协议
protocol = tcp

#定义了各种行动的参数
#banaction参数在action.d目录下具体定义,name port protocol 也可以自己定义
#只禁止IP
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
#即禁止IP又发送email
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
#禁止IP、发送email、报告有关日志			  
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]

#如果没有定义行为,则默认的行为为action,可选择action_,action_mw, action_mwl 等		
action = %(action_)s

默认配置文件含有此模块
#定义子模块名
[ssh]
#是否激活
enabled = true
#定义port,可以是数字端口号表示,也可以是字符串表示
port= ssh
#过滤规则,在filter.d目录下定义
filter	= sshd
#检测日志的路径
logpath  = /var/log/auth.log
#尝试的次数,覆盖了全局配置的
maxretry = 6
#banaction 在action.d目录下定义,此参数值会替换action中选用的默认行为中定义的banaction参数
banaction = iptables-allports
#注意 port protocol banaction 可以不用分开定义,直接使用action定义也可以,例如:
#action   = iptables[name=SSH, port=ssh, protocol=tcp]
#在子模块中定义的port protocol banaction 都会在action_ action_mw, action_mwl中替换成具体的设置值。

三:CC攻击示例和ssh爆破

Fail2ban服务的配置文件在/etc/fail2ban目录。在其中可以找到jail.conf配置文件,我不会直接编辑这个文件,因为在升级软件包时,会覆盖这个文件,使配置失效。我们应该创建一个新文件jail.local,在jail.local定义的值会覆盖jail.conf中的值。

3.1.我们来创建一个jail.local文件:

vi  /etc/fail2ban/jail.local

宝塔面板直接在文件管理中新建文件即可,文件名为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了,自己的服务器都连接不上(大鸟本地测试就这样连不上服务器了。)

3.2 防止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:需要监视的日志路径

到这一步,我们jail.local的规则看起来可能像下面这样子:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

上面的配置意思是如果同一个IP,在10分钟内,如果连续输入5次错误,则使用Firewalld将他IP ban了。输入systemctl start fail2ban启动fail2ban来试试效果。当然了,你修改一个奇葩点的ssh端口,也不用这个规则了,这里只是为了大家能理解的深刻一点,故意多讲这么几句。

3.3 创建一个nginx-cc.conf

filter.d 目录里面定义的是根据日志文件进行过滤的规则,主要是利用正则匹配出现错误的关键字。所以我们新建的规则都是放在filter.d 目录。

vi /etc/fail2ban/filter.d/nginx-cc.conf

宝塔面板直接在这个路径下面新建文件,命名为nginx-cc.conf即可。

3.4 Fail2ban防CC攻击示例规则:

我们在新建好的nginx-cc.conf中填写如下内容:

#填写如下内容
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

3.5 继续修改jail.local追加如下内容:

[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /www/wwwlogs/www.daniao..org.log;

上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,记得修改你的网站日志路径。上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径。使用以下命令查看fail2ban状态,大鸟自己小测试了下,果然打不开网页了,说明IP被ban了,可以输入:fail2ban-client status sshd查看被ban的IP,如下截图。

宝塔面板6.X安装fail2ban+ Firewalld防止CC攻击

都到了这一步,我们可以看看这份jail.local中总的规则如下:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /www/wwwlogs/www.daniao.org.log

sshd那个规则一般是不需要的,大鸟也是承接了上面的规则统一下来,希望了解。当然,每改动一次,别忘记输入systemctl restart fail2ban重启fail2ban使其生效。

3.6 常用命令

#查看当前版本
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

五:总结

使用Fail2ban应用一般的CC攻击基本上没有什么问题,当然这也不是最好的选择,大鸟之前讲过:宝塔面板6.X开启隐藏的 waf 防火墙的方法。对于简单的cc防护也有效果,当然,我们还可以编译安装云锁来防止cc,启用Cloudflare防攻击模式:主要作用是访问任何页面的时候强制在 CF 的认证页面停留 5 秒,效果非常好用。对应文章大鸟也讲过了【CloudFlare使用方法-DNS解析,SSL证书,防DDoS(5秒盾)攻击和免费CDN加速】里面提到了5秒盾的用法。

当然,我们使用fail2ban + Firewalld来阻止恶意IP是行之有效的办法,可极大提高服务器安全。但是大鸟在安装宝塔面板的服务器上使用fail2ban并非易事,宝塔面板强行修改的东西太多了。到不如lnmp的纯环境来的流畅。

参考:

https://www.cnblogs.com/carbon3/p/5607704.html

https://www.xiaoz.me/archives/9831

https://blog.whsir.com/post-3063.html

https://my.oschina.net/guol/blog/52219

 

weinxin
我的微信
微信公众号
关注大鸟博客公众号
 最后更新:2019-2-28
大鸟
评论  7  访客  5  作者  2
    • 大致
      大致 1

      感谢分享。安装成功。
      有个小问题。jail.local最后一行,指定log文件路径的后面不能带分号。

        • 大鸟
          大鸟

          @ 大致 嗯,感谢指正,说实话还挺好用的。挡一般的cc也还行!!

            • 倡萌
              倡萌 0

              @ 大鸟 3.5 小结代码的日志文件还是包含了分号哦

                • 大鸟
                  大鸟

                  @ 倡萌 惊现大神,大神你好! :cool:

            • kedyao
              kedyao 0

              有宝塔专业版还需要这个吗?这个和专业版的有什么优势

                • 大鸟
                  大鸟

                  @ kedyao 额,如果你觉得那些效果不理想的时候,可以用这个。

                • grimmster
                  grimmster 3

                  action = %(action_mwl)s是什么意思,是禁止ip+写日志吗,如果不想写入日志该怎么写这里?还有就是jail.conf里有个
                  [xinetd-fail]
                  banaction = iptables-multiport-log 需要把这个改成banaction=firewall-ipset-log吗?

                匿名

                发表评论

                匿名网友

                :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

                确定