背景
ratelimit模块用来限制sip请求, 并不是按照源ip来限制,可以根据不同的分组设置,和pike不同.
该模块可以和Redis或者memcache结合, 可以实现集群opensips的统一限制。
另外也可以使用clusterer分布式模块,使用pipe_replication_cluster参数,把pipes复制到其他的实例上。
如果要使用CacheDB发送,就在pipes后加/r, 如果要用clusterer,就在pipes后加/b。
支持的算法有:
(Tail Drop Algorithm)TAILDROP: 请求达到限制后,后面的请求丢弃(Random Early Detection Algorithm)RED: 随机早期检测算法,测量平均负载并动态调整丢包率(Slot Based Taildropping)SBT: 持有一个或多个slot组成的窗口.NETWORK: 依赖网口上等待消耗的字节数FEEDBACK: 使用PID控制模型, 根据负载因子动态调整下降率.
官方文档地址:ratelimit
本次测试的opensips版本:
version: opensips 3.5.5 (x86_64/linux)
配置参数
|
|
重要函数
rl_check(name, limit[, algorithm])
当前请求和pipe name的算法比较限制数, 如果pipe没有,会根据限制数和算法创建新的,如果算法也没有,使用默认的。
rl_dec_count(name)
减少pipe name当前的计数
rl_reset_count(name)
重置pipe name的当前计数
实战
配置
|
|
为了测试出效果, pipe名字为: gw_$si, 以源ip来测试。
测试
设置的是3个请求/5s, 当并发请求10个/5s,看到的信令图:

可以看到,当达到第6个请求之后,第7个请求就被拒绝了, 之后当计数减少之后,后续还是能再次请求成功。
测试过程中使用opensips-cli -x mi rl_list查看:
|
|
请求拒绝的信令:

总结
opensips的ratelimit功能比kamailio的ratelimit强大,opensips可以使用clusterer模块或者cacheDB实现集群的ratelimit,kamailio不可以。