Fail2Ban 可以说是保护 Linux 服务器并保护其免受自动攻击的最佳软件。

启用后,它会提供许多可自定义的规则来禁止可能试图访问您的计算机的源地址。

Fail2Ban 与防火墙协同工作,因此我们建议您将它们作为单独的安全层进行安装和启用。

科普文:软件架构Nginx系列之【详解Nginx防CC和DDos攻击】-CSDN博客

前面文章中分析Nginx日志,找出风险IP,用的就是Fail2Ban 。

Fail2Ban 是日志解析软件,有助于保护基于 Linux 的 Web 服务器免受网络攻击。

在本文中,我们将解释什么是 Fail2Ban 及其用例,我们还将向您展示如何安装和设置 Fail2Ban。

什么是 Fail2Ban 及其用途?

Fail2Ban 是一个日志解析应用程序,可保护基于 Linux 的 Web 服务器免受许多安全威胁,例如字典、DoS、DDoS 和暴力攻击,它通过监视系统日志中的任何恶意活动并扫描文件以查找与已识别模式匹配的任何条目来工作。

如果 Fail2Ban 检测到登录尝试失败的高峰,它会自动将新的防火墙规则添加到您的 iptables 并在指定时间或无限期阻止源地址。

安装 Fail2Ban 可帮助服务器所有者自动减少任何非法活动。每当发生攻击时,它还会通过电子邮件向他们发出警报。

如何安装 Fail2Ban

要安装 Fail2Ban 服务,请使用终端(macOS 和 Linux)或 PuTTY(Windows)等 SSH 客户端以 root 访问权限连接到您的服务器。

Ubuntu下安装Fail2Ban

apt-get update && apt-get upgrade
apt-get install fail2ban

如果要为 Fail2Ban 服务添加电子邮件支持,请插入以下命令并按Enter:
apt-get install sendmail

使用以下命令验证 Fail2Ban 状态:
sudo systemctl status fail2ban

CentOS7下安装Fail2Ban

CentOS7 的 Fail2Ban 包含在 Extra Packages for Enterprise Linux (EPEL) 存储库中。通过运行以下命令下载它:

安装依赖包
sudo yum install epel-release
安装
sudo yum install fail2ban

命令启用和启动服务:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Debian下安装Fail2Ban

apt-get update && apt-get upgrade -y
apt-get install fail2ban


如果要添加电子邮件支持,请运行以下命令安装 Sendmail:
apt-get install sendmail-bin sendmail

systemctl status fail2ban

Fedora下安装Fail2Ban

dnf update

dnf install fail2ban

如果要安装 Sendmail,请输入以下命令并按Enter:
dnf install sendmail
systemctl start sendmail
systemctl enable sendmail


systemctl start fail2ban
systemctl enable fail2ban

如何设置 Fail2Ban

安装 Fail2Ban 后,考虑配置它。在本节中,我们将探讨如何使用fail2ban.local和jail.local文件来实现。

使用 fail2ban.local 编辑默认设置(可选)

fail2ban.conf文件包含 Fail2Ban 的基本配置。它包含不应修改的全局设置。

如果您想进行任何更改,我们建议您创建一个本地文件。

复制fail2ban.conf并将其重命名为fail2ban.local以覆盖默认配置文件。

以下是如何更改副本的名称并在 fail2ban.local 文件上设置设置:

  1. 通过运行以下命令将文件重命名为fail2ban.local 。请记住,它不会产生任何输出:
    cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
  2. 键入以下命令并按Enter 键打开文件:
    sudo nano /etc/fail2ban/fail2ban.local
  3. 现在您可以编辑文件中的定义。
    loglevel = INFO

将日志输出级别定义为:

  • CRITICAL - 应立即调查的紧急情况。
  • ERROR ——出现问题但并不严重。
  • WARNING——一种潜在的有害状况。
  • NOTICE– 正常但重要的情况。
  • INFO – 可以忽略的信息性消息。
  • DEBUG——调试级消息。

日志输出行式设置

logtarget = STDERR

在特定目标套接字中记录操作,可以是:

  • FILE – 输出到文件套接字。
  • SYSLOG – 输出到基于消息的日志文件。
  • STDERR——作为标准错误输出。
  • STDOUT——标准输出。

syslogsocket = auto

将 syslog 套接字文件设置为auto或file(如果您已将logtarget设置为SYSLOG)。

socket = /var/run/fail2ban/fail2ban.sock

设置套接字文件以与守护程序通信。默认位置是/var/run/fail2ban/fail2ban.sock。

设置 jail.local 配置文件

Fail2Ban 有另一个名为jail.conf的配置文件,其中包括监狱——带有动作的过滤器。但是,用户不应直接修改此文件,因为它包含软件的基本规则集。

相反,制作原始文件的副本并将其命名为jail.local。使用它,您将能够自定义和设置过滤器和操作,例如ignoreip、bantime、findtime、maxretry和backend。

ignoreip

此功能要求您指定 Fail2Ban 应忽略的可信 IP 地址、DNS 主机或 CIDR 掩码。此参数允许来自指定来源的所有流量。您可以添加多个地址并用空格分隔它们。

bantime

此参数设置客户端在身份验证失败后将被禁止的时间长度。禁止期限以秒为单位,默认数字为 600 或 10 分钟。

findtime

此设置确定登录尝试失败的时间段。如果一个主机在设定的时间段内认证失败一定次数(基于maxretry设置),它的 IP 地址将被禁止。

maxretry

maxretry与findtime一起工作——它设置在定义的时间窗口内不成功的登录尝试的最大次数。默认值为 5。

backend

此功能允许您指定文件修改的后端配置。默认值为auto,但如果你使用 CentOS 或 Fedora,则需要systemd。

以下是您可以选择的可用值:

  • pynotify – 实时监控文件系统的变化,需要安装一个文件修改监控器。
  • gamin – 与pynotify相同,但需要一个 Gamin 工具。
  • polling – 使用不需要外部库的轮询算法。
  • systemd – 使用systemd python 库来访问systemd日志。
  • auto - 将按此顺序使用先前的值 - pyinotify、gamin和polling。

您还可以在jail.local文件中设置其他配置,包括SSH和iptables设置。可用选项包括:

  • banaction – 定义达到maxretry阈值时要使用的默认操作。如果您使用firewalld,请将值设置为firewallcmd-ipset。但是,如果您已将 UFW 设置为防火墙,请将其更改为ufw。
  • banaction_allports – 允许您标记和阻止每个端口上的 IP 地址。如果您使用firewalld,请将值设置为firewallcmd-ipset。
  • port – 该值应与设置的服务相对应。如果您使用默认端口,请将值更改为服务名称。如果您使用非传统端口,请在此处输入其编号。
  • filter – 位于/etc/fail2ban/filter.d的文件名包含用于解析日志文件的failregex信息。

完整 jail.local 配置文件

[DEFAULT]
# 忽略 IP,IP 白名单,这些 IP 永远不会被禁
ignoreip = 127.0.0.1/8
#IP 被封禁的时间,单位秒
bantime  = 600
#日志文件中,在 findtime 时间段内,ip 出现超过 maxretry 次数,就会封禁该 IP
findtime = 600
maxretry = 3
# "backend" 指获取日志文件的方法,分为"pyinotify", "gamin", "polling", "auto"四种
# auto 值得是哪种可用就用哪种,默认 polling 可用
backend = auto
# "usedns" specifies if jails should trust hostnames in logs,
usedns = warn
#接受邮件地址
destemail = xxxxxx@gmail.com
# Name of the sender for mta actions
sendername = Fail2Ban
#默认的动作执行行为,在 action.d 目录下有各种行为策略,默认是 iptables-multiport
banaction = iptables-multiport
# email action. Since 0.8.1 upstream fail2ban uses sendmail
mta = sendmail
# Default protocol
protocol = tcp
# Specify chain where jumps would need to be added in iptables-* actions
chain = INPUT
#定义各种行为参数
#只禁 IP
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
#禁 IP+邮件通知
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]
# 禁 IP+邮件通知+报告相关日志
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
# 选择行为
action = %(action_)s
#以下是各种应用监控日志的配置,以 ssh 日志和 apache 日志为例说明一下配置原理
[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6
[php-url-fopen]
enabled = true
port    = http,https
filter  = php-url-fopen
action = %(action_mwl)s
logpath = /var/log/apache2/access.log
findtime = 180
maxretry = 200

Fail2ban 管理&常用命令

#fail2ban 服务重启、停止、开启
service fail2ban restart|stop|start
#查看 fail2ban 状态
fail2ban-client status
#查看日志监控状态
fail2ban-client status php-url-fopen
#查看 iptables 禁 ip 情况
iptables -nvL

使用三方 smtp 服务器发送通知邮件

由于腾讯云的 25 端口有限制不能使用系统自带的 sendmail,需要调用三方的 stmp 服务器,如 163 服务器,并使用端口为 465 的 ssl 协议发送邮件。配置如下

安装 mail ,apt-get install heirloom-mailx

修改/etc/nail.rc(ubuntu16.04 为/etc/s-nail.rc、centos 为/etc/mail.rc)

添加

set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb
set from=邮件地址@163.com
set smtp=smtps://smtp.163.com:465
set smtp-auth-user=邮件地址@163.com
set smtp-auth-password=e8456ds78c23
set smtp-auth=login

发邮件测试

echo “邮件内容”.|mail -v -s “邮件标题” xxxx@qq.com

jail.conf 中 mta 改为 mail,即可

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐