
/var/log/nginx/access.log,每一行记录可能类似这样:192.168.1.100 - - [20/Jul/2025:10:30:00 +0800] "GET /index.html HTTP/1.1" 200 1234,其中192.168.1.100就是客户端的 IP 地址。iptables -I INPUT -s 192.168.1.100 -j DROP,这样来自该 IP 的所有请求都会被直接丢弃。而封禁的时长,就是由我们要重点讨论的 bantime 参数来决定的。当 bantime 时间过去后,Fail2Ban 会自动解除对该 IP 的封禁,恢复其正常访问权限 。
bantime设置为 3600 秒,也就是 1 小时。同时,结合以下配置参数:findtime = 60(60 秒内统计请求次数),maxretry = 100(60 秒内请求超过 100 次触发封禁) 。这样的配置可以有效地拦截那些批量扫描的恶意 IP,而 1 小时的封禁时间也不会对正常用户造成太大影响。即使出现误封,用户等待 1 小时后就能恢复访问。/etc/fail2ban/jail.local文件中可以添加如下配置片段:
[nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth action = iptables[name=nginx, port=http, protocol=tcp] logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600
ignoreregex,忽略对静态资源文件(如.css、.js、.png 等)的请求。因为用户在正常访问页面时,会频繁请求这些静态文件,若不加以区分,很容易触发封禁规则。/etc/fail2ban/filter.d/nginx-http-auth.conf文件中添加如下内容:
[Definition] failregex = ^<HOST> -.* \"(GET|POST).* ignoreregex = \.css$|\.js$|\.png$|\.jpg$|\.gif$|\.ico$bantime设置为 86400 秒,即 24 小时。同时,设置findtime = 300(5 分钟内统计请求次数),maxretry = 200(5 分钟内请求超过 200 次触发封禁) 。较长的封禁时间可以对攻击者形成有效的威慑,减少他们重复攻击的可能性。因为企业站点的攻击往往是有针对性的,延长封禁时间可以让攻击者付出更大的代价,从而降低攻击频率。X-Real-IP、X-Forwarded-For等 HTTP 头来实现 。
bantime设置为 86400 秒(24 小时),findtime = 300(5 分钟内统计登录失败次数),maxretry = 2(5 分钟内登录失败 2 次触发封禁) 。这样可以有效防止暴力破解 SSH 密码的攻击行为。同时,建议修改 SSH 的默认端口(默认为 22),进一步降低被攻击的概率。修改端口后,要相应地调整 Fail2Ban 配置文件中的port参数 。/etc/fail2ban/jail.local文件中,SSH 服务的配置可以如下:
[sshd] enabled = true port = your_ssh_port filter = sshd action = iptables[name=SSH, port=your_ssh_port, protocol=tcp] logpath = /var/log/auth.log maxretry = 2 findtime = 300 bantime = 86400
bantime设置为 604800 秒,也就是 7 天。同时,关闭自动解封功能,改为手动审核后解封。这是因为这类攻击的持续性很强,如果封禁时间过短,攻击者很容易再次发起攻击。而 7 天的封禁时间可以大大降低攻击频率,让攻击者知难而退。/etc/fail2ban/jail.local文件中,可以添加如下配置:
[your_service] enabled = true port = your_service_port filter = your_service_filter action = iptables[name=your_service, port=your_service_port, protocol=tcp] logpath = /var/log/your_service.log maxretry = your_maxretry_value findtime = your_findtime_value bantime = 604800 autounban = falseUser-Agent或者请求路径。可以在/etc/fail2ban/filter.d/your_service_filter.conf文件中编写相应的正则表达式。假设攻击者的User-Agent中包含evilbot字样,可以添加如下failregex:
[Definition] failregex = ^<HOST> -.* \"(GET|POST).*User-Agent:.*evilbot.* ignoreregex =fail2ban-regex命令来测试规则的有效性:
fail2ban-regex /var/log/your_service.log /etc/fail2ban/filter.d/your_service_filter.confsudo yum install epel-release sudo yum install fail2ban
sudo apt update sudo apt install fail2ban/etc/fail2ban/jail.conf,但不建议直接修改这个文件,因为在软件更新时,该文件可能会被覆盖,导致自定义配置丢失。正确的做法是复制jail.conf为jail.local,然后在jail.local中进行配置 。执行以下命令:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.localjail.local文件中,首先配置ignoreip,将自己的办公 IP、服务器内网 IP 等信任 IP 添加到白名单中,这些 IP 将不会被 Fail2Ban 封禁。例如:
[DEFAULT] ignoreip = 127.0.0.1/8 192.168.1.100 10.0.0.0/24127.0.0.1/8是本地回环地址,192.168.1.100是你的办公 IP,10.0.0.0/24是服务器内网 IP 段,根据实际情况进行修改 。
/etc/fail2ban/filter.d目录下创建一个新的过滤文件,例如nginx-cc.conf,用于定义匹配 CC 攻击的正则表达式 。执行以下命令:
sudo nano /etc/fail2ban/filter.d/nginx-cc.confnginx-cc.conf文件中,编写如下内容:
[Definition] failregex = ^<HOST> -.* \"(GET|POST).* HTTP/1.[01]\" .*$ ignoreregex =failregex定义了匹配规则,它会匹配 Nginx 访问日志中短时间内频繁出现的 GET 或 POST 请求。ignoreregex暂时留空,如果有需要忽略的请求模式,可以在这里添加 。jail.local文件中添加一个新的 Jail 配置,用于启用 Nginx 的防 CC 功能 。在jail.local文件末尾添加如下内容:
[nginx-cc] enabled = true port = http,https filter = nginx-cc action = iptables[name=nginx-cc, port=http,https, protocol=tcp] logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600enabled:设置为true,表示启用该 Jail。port:指定要监控的端口,这里是 HTTP 和 HTTPS 的默认端口。filter:指定使用的过滤规则,对应刚才创建的nginx-cc.conf。action:定义采取的动作,这里使用iptables防火墙来封禁恶意 IP。logpath:指定 Nginx 的访问日志路径。需要注意的是,不同系统的 Nginx 日志路径可能不同,Ubuntu 系统中通常是/var/log/nginx/access.log,而 CentOS 系统中可能是/var/log/nginx/error.log,根据实际情况进行调整。maxretry:在findtime时间内允许的最大请求次数,这里设置为 100 次。findtime:定义监视时间窗口,这里是 60 秒。bantime:定义 IP 被封禁的时间,这里设置为 3600 秒,即 1 小时 。sudo systemctl start fail2ban sudo systemctl enable fail2banfail2ban-regex命令来测试过滤规则是否能够正确匹配 Nginx 日志中的 CC 攻击行为 。执行以下命令:
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-cc.confRunning tests ============= Use failregex filter file : /etc/fail2ban/filter.d/nginx-cc.conf Use log file : /var/log/nginx/access.log Results ======= Failregex: 10 total |- #) [# of hits] regular expression | 1) [10] ^<HOST> -.* \"(GET|POST).* HTTP/1.[01]\" .*$ `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [10] Day(?P<_sep>[-/])Month(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)? `- Lines: 10 lines, 0 ignored, 10 matched, 0 missed [processed in 0.00 sec]Failregex匹配到了 10 次,说明过滤规则能够正确识别日志中的攻击行为 。fail2ban-client命令查看当前被封禁的 IP 列表,以确认封禁功能是否正常工作 。执行以下命令:
sudo fail2ban-client status nginx-ccStatus for the jail: nginx-cc |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- File list: /var/log/nginx/access.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:Banned IP list中显示出来 。/var/log/fail2ban.log中的封禁记录,调整maxretry和bantime等参数,以达到最佳的防护效果。例如,如果发现误封情况较多,可以适当增大maxretry的值;如果攻击仍然频繁发生,可以适当延长bantime的时间 。
bantime设置为一个非常长的时间,甚至设置为永久封禁(bantime=-1)。这种做法虽然看似能够有效阻止恶意 IP,但却忽略了误封的风险 。maxretry等参数来提高检测的精准度,减少误封的可能性 。
bantime的设置效果,还需要与findtime(检测时间窗口)和maxretry(最大重试次数)相互配合。很多用户在配置时,只关注bantime,而忽略了这两个参数的重要性 。maxretry = 100,如果findtime设置为 60 秒,那么在这 60 秒内,某个 IP 的请求次数超过 100 次就会触发封禁,这是一种比较严格的检测策略;但如果findtime设置为 600 秒,同样是maxretry = 100,则意味着在 10 分钟内,IP 请求次数超过 100 次才会触发封禁,这就相对宽松很多 。findtime设置得过短,maxretry设置得过高,可能会导致一些真正的攻击行为被漏封;反之,如果findtime设置过长,maxretry设置过低,又容易误封正常用户 。所以,在设置bantime时,一定要综合考虑findtime和maxretry的取值,根据站点的正常请求频率,找到一个最佳的平衡点 。
iptables、firewalld等。在配置banaction(封禁动作)时,需要根据系统中实际使用的防火墙来选择相应的配置 。firewalld,应该选择以firewallcmd开头的banaction,如firewallcmd-ipset;如果没有启用firewalld,而是使用iptables,则应该选择以iptables开头的banaction,如iptables-multiport 。banaction,或者同时使用两种不同的防火墙管理工具来管理同一防火墙,这可能会导致规则冲突,使得 Fail2Ban 的封禁规则无法生效 。在配置前,一定要先确认系统中使用的防火墙,并选择与之对应的banaction 。
ignoreip)是非常重要的一步。很多用户在配置过程中,会忘记将自己的常用 IP(如办公 IP、服务器管理 IP 等)添加到白名单中 。ignoreip中 。sudo fail2ban-client set sshd unbanip 192.168.1.100192.168.1.100替换为实际被封禁的 IP 地址即可 。
/var/log/fail2ban.log,通过查看这个日志文件,可以了解到 Fail2Ban 是否正常运行,是否成功封禁了恶意 IP,以及是否存在配置错误等问题 。同时,也要关注 Web 服务器的日志,如 Nginx 或 Apache 的访问日志,查看是否有被遗漏的攻击行为 。logpath配置错误,导致 Fail2Ban 无法监控到 Web 服务器的日志,结果服务器遭受了长时间的 CC 攻击,而用户却毫不知情。定期监控日志,能够及时发现并解决这些问题,确保 Fail2Ban 的防护规则始终有效 。
jail.local配置文件内容、filter.d目录下的过滤规则文件内容等,以代码块的形式完整呈现,并搭配 “关注收藏,防攻击不迷路” 的引导语,引导读者关注公众号并收藏文章,以便日后查阅,有效提升文章的收藏率 。
maxretry和findtime如何根据网站流量精准调整,要详细回复,通过专业互动提升点赞、关注,增强自己在知乎社区的影响力 。
maxretry、findtime、bantime)以及建议值进行汇总展示,方便读者快速查看和对比,节省他们的时间 。findtime和maxretry等参数,以及配置白名单、编写自定义过滤规则,都是提升 Fail2Ban 防护精准度的关键。只有综合考虑这些因素,不断根据实际情况进行优化,才能让 Fail2Ban 在防 CC 攻击中发挥出最大的效能 。
ngx_http_limit_req_module,对单个 IP 的请求频率进行更细粒度的限制。在 Nginx 配置文件中,可以添加如下配置:
http { limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; server { location / { limit_req zone=mylimit; # 其他配置 } } }
-->