1 个不稳定版本
0.1.0 | 2022 年 5 月 3 日 |
---|
#4 在 #公平 中
23KB
296 行
fair-rate-limiter
使用 RateLimiter
结构体来检测过载并从不同的 IP 地址、用户或系统公平地卸载负载。缓解拒绝服务 (DoS
) 攻击。
使用场景
- 域名服务器:域名服务器必须在没有握手的情况下发送 UDP 响应。您的域名服务器可能会被用于 DNS 放大攻击。使用此 crate 防止这种情况。
- 无握手的服务器:如果您的服务器在没有握手的情况下发送大响应,则可能会被用于放大攻击。使用此 crate 防止这种情况。
- 负载均衡器:在负载均衡器中使用此 crate 以避免将
DoS
攻击转发到后端系统。 - API 服务器:从行为不当的客户端卸载负载,并保持 API 对其他客户端可用。
功能
- 全局吞吐量限制
- IPv4 & IPv6
forbid(unsafe_code)
,仅依赖于forbid(unsafe_code)
的 crate- 83% 测试覆盖率
- 优化。在 i5-8259U 上的性能
- 内部服务跟踪 10 个客户端:每次检查 150 纳秒,每秒 7M 次检查
- 公共服务跟踪 1M 个客户端:每次检查 500 纳秒,每秒 2M 次检查
DDoS
缓解跟踪 30M 个客户端:每次检查 750 纳秒,每秒 1.3M 次检查
限制
替代方案
- governor
- 流行
- 许多功能
- 良好的文档
- 不必要的
unsafe
- 使用非标准的互斥锁库
parking_lot
- r8limit
- 支持单个桶。可用于不公平的负载卸载。
- 无
unsafe
或依赖项
- 漏桶
- 异步任务可以等待轮到它们使用资源的机会。
- 不适用于负载卸载。
相关 Crates
- dns-server 使用此库
示例
let mut limiter = new_fair_ip_address_rate_limiter(10.0).unwrap();
let mut now = Instant::now();
let key = IpAddrKey::from(Ipv4Addr::new(10,0,0,1));
assert!(limiter.check(key, 4, now));
assert!(limiter.check(key, 4, now));
now += Duration::from_secs(1);
assert!(limiter.check(key, 4, now));
assert!(limiter.check(key, 4, now));
now += Duration::from_secs(1);
assert!(limiter.check(key, 4, now));
assert!(limiter.check(key, 4, now));
now += Duration::from_secs(1);
assert!(limiter.check(key, 4, now));
assert!(limiter.check(key, 4, now));
assert!(!limiter.check(key, 4, now));
Cargo Geiger 安全报告
Metric output format: x/y
x = unsafe code used by the build
y = total unsafe code found in the crate
Symbols:
🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)]
❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)]
☢️ = `unsafe` usage found
Functions Expressions Impls Traits Methods Dependency
0/0 0/0 0/0 0/0 0/0 🔒 fair-rate-limiter 0.1.0
0/0 0/0 0/0 0/0 0/0 🔒 └── oorandom 11.1.3
0/0 0/0 0/0 0/0 0/0
变更日志
- v0.1.0 - 初始版本
待办事项
- 与
governor
比较性能 - 发布
- 模拟突发流量
- 测量内存消耗,添加到限制部分
- 将哈希表替换为跳表,看是否提高性能
- 支持并发使用
- 允许跟踪源使用未使用的未跟踪吞吐量分配
许可证:Apache-2.0
依赖项
~32KB