fail2ban使用教程

563 阅读4分钟

安装防火墙

本案例所需要使用的防火墙为:firewall

firewall 一般系统里就安装好了,但是不一定启动运行了,我们可以通过以下命令启动:

systemctl start firewalld.service    # 服务启动
systemctl enable firewalld.service    # 设置开机自启
systemctl status firewalld    # 查看FirewallD防火墙状态

此处需要注意,一旦开启firewalld之后,80端口以及443端口就会被保护起来,我们需要执行以下命令:

firewall-cmd --permanent --zone=public --add-port=5522/tcp
sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

firewall的命令有很多,在本案例中使用以上命令即可,下面列出来的命令仅用于参考:

  • firewall-cmd —state 查看防火墙状态,是否是running
  • systemctl status firewalld.service 查看防火墙状态
  • systemctl start firewalld.service 启动防火墙
  • systemctl stop firewalld.service 临时关闭防火墙
  • systemctl enable firewalld.service 设置开机启动防火墙
  • systemctl disable firewalld.service 设置禁止开机启动防火墙
  • firewall-cmd —permanent —query-port=80/tcp 查看80端口有没开放
  • firewall-cmd —reload 重新载入配置,比如添加规则之后,需要执行此命令
  • firewall-cmd —get-zones 列出支持的zone
  • firewall-cmd —get-services 列出预定义的服务
  • firewall-cmd —query-service ftp 查看ftp服务是否放行,返回yes或者no
  • firewall-cmd —add-service=ftp 临时开放ftp服务
  • firewall-cmd —add-service=ftp —permanent 永久开放ftp服务
  • firewall-cmd —remove-service=ftp —permanent 永久移除ftp服务
  • firewall-cmd —add-port=80/tcp —permanent 永久添加80端口
  • firewall-cmd —zone=public —remove-port=80/tcp —permanent 移除80端口

安装配置 Fail2ban

使用工具如fail2ban或Logwatch来分析Nginx访问日志,并识别在短时间内访问频率异常高的IP地址。您可以在CentOS上使用以下命令来安装fail2ban:

sudo yum install epel-release
sudo yum install fail2ban

安装完成后,可以在/etc/fail2ban/jail.conf中进行配置,在配置文件中添加以下代码:

[nginx]
enabled = true
port = 80, 443
filter = nginx-access
logpath = /var/log/nginx/access.log
findtime = 60
maxretry = 600
bantime = 300

参数解释:

  • enabled:启用监禁项;
  • port:监禁端口;
  • filter:关联过滤器,需要在 filter.d 目录下有对应的过滤器配置文件;
  • logpath:设置提供给过滤器所使用的日志文件路径;
  • findtime:设置匹配时间间隔,单位为秒,即从日志中匹配条目,若指定时间内匹配到 maxretry 项设置的条目数量时,将会执行封禁IP动作;
  • maxretry:设置从日志中匹配到IP的最大数量,即尝试次数;
  • bantime:设置IP被禁止的持续时间,单位为秒;
  • ignoreip:忽略的IP
  • action:关联动作 action = iptables-multiport[name=”sshd”, bantime=”%(bantime)s”, port=”0:65535”, protocol=”tcp”, chain=”INPUT”]

创建过滤器

在 filter.d 目录下,创建过滤器配置 nginx-access.conf

[INCLUDES]
###
# 定义过滤器
###
[Definition]
# 定义要禁止的IP,使用正则表达式匹配日志行,使用关键字"<HOST>"表示要禁止的IP。
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*" (400|401|403|404|444)
# 定义要忽略禁止的IP,使用正则表达式匹配日志行,使用关键字"<HOST>"表示要忽略的IP。
ignoreregex =
###
# 初始化过滤器
###
[Init]
# 设置过滤器每次读取日志的行数,每次读取10行做匹配。
maxlines = 10
# 过滤器每次从日志中缓冲多少行,进行匹配处理,如果一次读取大量的行,程序会崩溃,系统内存将会不够用
journalmatch =

这将匹配Nginx访问日志中的GET和POST请求,并在状态码为400、401、403、404和444时查找主机IP地址。

创建动作

在 action.d 目录下,创建动作配置 iptables.conf

这段仅供参考。

[INCLUDES]
###
# 定义动作
# 使用"<关键字>"声明变化的值
# "<ip>"关键字等于过滤器正则表达式中的"<HOST>"
###
[Definition]
actionstart = <iptables> -N f2b-<name>
              <iptables> -A f2b-<name> -j <returntype>
              <iptables> -I <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
actionstop = <iptables> -D <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
             <iptables> -F f2b-<name>
             <iptables> -X f2b-<name>
actioncheck = <iptables> -n -L <chain> | grep -q 'f2b-<name>[ \t]'
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
###
# 初始化动作
# 声明在监禁中关联动作允许传入的参数等于上面的"<关键字>",若未传入则使用默认值
###
[Init]
chain = INPUT
name = default
port = ssh
protocol = tcp
blocktype = REJECT --reject-with icmp-port-unreachable
returntype = RETURN
lockingopt = -w
iptables = iptables <lockingopt>

更新使用动作

上面创建动作是更高级的应用,我们可以先使用模板。

更新默认配置(/etc/fail2ban/jail.d/00-firewalld.conf)

[DEFAULT]
banaction = firewallcmd-rich-rules[actiontype=<multiport>]
banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]

如果需要变更为使用ipset,只需要做如下修改:

[DEFAULT]
banaction = firewallcmd-ipset[actiontype=<multiport>]
banaction_allports = firewallcmd-ipset[actiontype=<allports>]

更改配置文件后需要使用 fail2ban-client restart 重启 fail2ban 才能生效,单纯的 reload 是无法生效的。

# 获取所有 direct 规则
firewall-cmd --direct --get-all-rules
# 获取 ipset 列表
ipset list

fail2ban-client 常用操作

  • 重启:fail2ban-client restart
  • 查看运行状态:fail2ban-client status nginx
  • 黑名单操作 IP 加入黑名单:fail2ban-client set nginx banip 192.168.1.8 IP 解锁:fail2ban-client set nginx unbanip 192.168.1.8
  • 白名单操作 IP 加入白名单:fail2ban-client set nginx addignoreip 192.168.1.8 IP 从白名单中移除:fail2ban-client set nginx delignoreip 192.168.1.8 在所有监禁中加入IP 白名单:fail2ban-client unban 192.168.1.8