Tengine

先说说‌Tengine‌是由淘宝网发起的Web服务器项目,基于Nginx,并针对大访问量网站的需求添加了许多高级功能和特性,旨在打造一个高效、安全的Web平台‌。Tengine项目从2011年12月开始成为开源项目,由Tengine团队开发和维护,核心成员来自淘宝、搜狗等互联网企业‌。

安装fail2ban:

  1. sudo yum install epel-release
  2. sudo yum install fail2ban

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

  1. [nginx]
  2. enabled = true
  3. port = 80, 443
  4. filter = nginx-access
  5. logpath = /var/log/nginx/access.log
  6. findtime = 60
  7. maxretry = 600
  8. 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

  1. [INCLUDES]
  2. ###
  3. # 定义过滤器
  4. ###
  5. [Definition]
  6. # 定义要禁止的IP,使用正则表达式匹配日志行,使用关键字"<HOST>"表示要禁止的IP。
  7. failregex = ^<HOST> -.*"(GET|POST).*HTTP.*" (400|401|403|404|444)
  8. # 定义要忽略禁止的IP,使用正则表达式匹配日志行,使用关键字"<HOST>"表示要忽略的IP。
  9. ignoreregex =
  10. ###
  11. # 初始化过滤器
  12. ###
  13. [Init]
  14. # 设置过滤器每次读取日志的行数,每次读取10行做匹配。
  15. maxlines = 10
  16. # 过滤器每次从日志中缓冲多少行,进行匹配处理,如果一次读取大量的行,程序会崩溃,系统内存将会不够用
  17. journalmatch =
  18. 这将匹配Nginx访问日志中的GET和POST请求,并在状态码为400、401、403、404和444时查找主机IP地址。

创建动作

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

这段仅供参考。

  1. [INCLUDES]
  2. ###
  3. # 定义动作
  4. # 使用"<关键字>"声明变化的值
  5. # "<ip>"关键字等于过滤器正则表达式中的"<HOST>"
  6. ###
  7. [Definition]
  8. actionstart = <iptables> -N f2b-<name>
  9. <iptables> -A f2b-<name> -j <returntype>
  10. <iptables> -I <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
  11. actionstop = <iptables> -D <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
  12. <iptables> -F f2b-<name>
  13. <iptables> -X f2b-<name>
  14. actioncheck = <iptables> -n -L <chain> | grep -q 'f2b-<name>[ \t]'
  15. actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
  16. actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
  17. ###
  18. # 初始化动作
  19. # 声明在监禁中关联动作允许传入的参数等于上面的"<关键字>",若未传入则使用默认值
  20. ###
  21. [Init]
  22. chain = INPUT
  23. name = default
  24. port = ssh
  25. protocol = tcp
  26. blocktype = REJECT --reject-with icmp-port-unreachable
  27. returntype = RETURN
  28. lockingopt = -w
  29. iptables = iptables <lockingopt>

更新使用动作

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

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

  1. [DEFAULT]
  2. banaction = firewallcmd-rich-rules[actiontype=<multiport>]
  3. banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]
  4. 如果需要变更为使用ipset,只需要做如下修改:
  5. [DEFAULT]
  6. banaction = firewallcmd-ipset[actiontype=<multiport>]
  7. banaction_allports = firewallcmd-ipset[actiontype=<allports>]

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

  1. # 获取所有 direct 规则
  2. firewall-cmd --direct --get-all-rules
  3. # 获取 ipset 列表
  4. ipset list

fail2ban-client 常用操作

重启:

  1. fail2ban-client restart

查看运行状态:

  1. fail2ban-client status nginx

黑名单操作 IP 加入黑名单:

  1. fail2ban-client set nginx banip 192.168.1.8 IP

解锁:

  1. fail2ban-client set nginx unbanip 192.168.1.8

白名单操作 IP 加入白名单:

  1. fail2ban-client set nginx addignoreip 192.168.1.8 IP

从白名单中移除:

  1. fail2ban-client set nginx delignoreip 192.168.1.8

在所有监禁中加入IP 白名单:

  1. fail2ban-client unban 192.168.1.8