网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息

IP限流实现指南

🎯 功能概述

RejectBots 中间件添加了基于IP的智能限流机制,可以有效防止同一IP频繁触发拦截规则,提高系统安全性和稳定性。

🔧 实现特性

1. 多层防护机制

请求流程:
客户端请求 
    ↓
IP限流检查 (第一层)
    ↓
黑名单检查 (第二层)
    ↓  
User-Agent检查 (第三层)
    ↓
自定义规则检查 (第四层)
    ↓
正常业务处理

2. 智能限流策略

频率限制

  • 时间窗口: 5分钟滑动窗口
  • 请求限制: 每个窗口最多100次请求
  • 自动重置: 窗口过期后自动重置计数

拦截累积

  • 拦截阈值: 每个窗口最多3次拦截
  • 自动封禁: 超过阈值自动封禁IP
  • 封禁时长: 30分钟

内存管理

  • 自动清理: 60分钟清理一次过期记录
  • 内存控制: 防止内存泄漏

📊 默认配置参数

private static readonly IpRateLimitConfig RateLimitConfig = new()
{
    WindowSizeMinutes = 5,        // 时间窗口:5分钟
    MaxRequestsPerWindow = 100,   // 每个时间窗口最大请求数
    MaxBlocksPerWindow = 3,       // 每个时间窗口最大拦截次数
    BlockDurationMinutes = 30,    // IP被阻止的持续时间:30分钟
    CleanupIntervalMinutes = 60   // 清理过期记录的间隔:60分钟
};

参数说明

参数默认值说明建议调整
WindowSizeMinutes5分钟统计时间窗口根据业务访问模式调整
MaxRequestsPerWindow100次窗口内最大请求数正常用户峰值的1.5-2倍
MaxBlocksPerWindow3次窗口内最大拦截次数较为严格,可适当调整
BlockDurationMinutes30分钟封禁持续时间根据业务容忍度调整
CleanupIntervalMinutes60分钟清理间隔根据内存使用情况调整

🚨 拦截触发条件

1. 请求频率超限

条件: 5分钟内请求次数 > 100
行为: 立即拦截并记录
日志: "IP访问频率超限"

2. 拦截次数累积

条件: 5分钟内被拦截次数 ≥ 3
行为: 封禁IP 30分钟
日志: "IP限流阻止访问"

3. 现有规则增强

黑名单拦截 → 记录IP拦截次数
空User-Agent → 记录IP拦截次数  
自定义规则拦截 → 记录IP拦截次数

📈 监控和统计

实时统计API

var stats = RejectBots.GetIpRateLimitStats();
Console.WriteLine($"总跟踪IP: {stats.TotalTrackedIps}");
Console.WriteLine($"被阻止IP: {stats.BlockedIps}");
Console.WriteLine($"活跃IP: {stats.ActiveIps}");

日志记录

// IP频率超限
logger.LogWarning("IP访问频率超限,IP:{ClientIp}, RequestPath:{RequestPath}", 
    clientIp, httpContext.Request.Path);

// IP被封禁
logger.LogWarning("IP限流阻止访问,IP:{ClientIp}, RequestPath:{RequestPath}", 
    clientIp, httpContext.Request.Path);

// 其他拦截增强
logger.LogInformation("黑名单拦截,RequestMethod:{RequestMethod}, RequestPath:{RequestPath}",
    httpContext.Request.Method, httpContext.Request.Path);

🎯 使用场景

1. 恶意扫描防护

场景: 自动化工具频繁扫描敏感路径
效果: 5分钟内超过100次请求自动封禁
示例: /admin/*, /.env, /wp-admin/*

2. 爬虫限制

场景: 爬虫忽略robots.txt大量抓取
效果: 被拦截3次后自动封禁30分钟
示例: 空User-Agent、违规User-Agent

3. API滥用防护

场景: 单个IP短时间内大量调用API
效果: 超过频率限制立即阻止
示例: /api/*, 批量数据请求

⚙️ 自定义配置

方法1: 修改默认配置

// 在 RejectBots 类中修改默认配置
private static readonly IpRateLimitConfig RateLimitConfig = new()
{
    WindowSizeMinutes = 10,       // 调整为10分钟窗口
    MaxRequestsPerWindow = 200,   // 调整为200次请求
    MaxBlocksPerWindow = 5,       // 调整为5次拦截
    BlockDurationMinutes = 60,    // 调整为60分钟封禁
    CleanupIntervalMinutes = 120  // 调整为120分钟清理
};

方法2: 基于配置文件

// appsettings.json
{
  "IpRateLimit": {
    "WindowSizeMinutes": 5,
    "MaxRequestsPerWindow": 100,
    "MaxBlocksPerWindow": 3,
    "BlockDurationMinutes": 30,
    "CleanupIntervalMinutes": 60
  }
}

🚀 性能特性

内存效率

  • 轻量级记录: 每个IP仅存储必要信息
  • 自动清理: 定期清理过期记录
  • 并发安全: 使用 ConcurrentDictionary

处理能力

  • 高并发: 支持大量并发请求
  • 低延迟: 毫秒级检查时间
  • 可扩展: 支持分布式部署

资源消耗

预估内存使用 (1000个活跃IP):
- 基础结构: ~50KB
- IP记录: ~100KB  
- 总计: ~150KB

🛡️ 安全考虑

防绕过机制

  1. 多重检查: 请求频率 + 拦截累积
  2. 时间窗口: 滑动窗口防止边界绕过
  3. 自动恢复: 过期自动解封,避免永久封禁

误封防护

  1. 合理阈值: 默认配置考虑正常用户行为
  2. 渐进式封禁: 先限流,再短期封禁
  3. 自动解封: 30分钟后自动恢复

日志审计

  1. 详细记录: 记录所有拦截原因和IP
  2. 结构化日志: 便于后续分析
  3. 统计信息: 实时监控系统状态

📊 效果评估

预期效果

  • 恶意扫描减少: 90%+ 自动化攻击被阻止
  • 服务器负载降低: 减少无效请求处理
  • 安全性提升: 多层防护机制
  • 运维简化: 自动化防护,减少人工干预

监控指标

  • 被限流的IP数量
  • 平均封禁时长
  • 拦截成功率
  • 系统资源使用

🔄 升级建议

未来扩展

  1. 分布式缓存: 支持多实例共享限流数据
  2. 白名单机制: 信任IP免检查
  3. 动态配置: 运行时调整限流参数
  4. 地域限制: 基于IP地理位置的限制
  5. 机器学习: 智能识别异常访问模式

集成建议

  1. 监控系统: 集成Prometheus/Grafana监控
  2. 告警机制: 异常IP数量告警
  3. 分析工具: 日志分析和可视化
  4. 备份恢复: 重要IP记录持久化

🎉 总结

IP限流机制为 RejectBots 中间件提供了强大的防护能力:

  • 🛡️ 智能防护: 自适应的多层防护机制
  • 高性能: 毫秒级响应,低资源消耗
  • 🔧 易配置: 灵活的参数调整
  • 📊 可监控: 完整的统计和日志
  • 🔄 自维护: 自动清理和恢复机制

通过这个实现,你的Web应用将获得更强的安全防护能力!🚀

loading