Featured image of post kamailio ratelimit模块

kamailio ratelimit模块

背景

ratelimit模块限制sip请求数,相对于上章介绍的pipelimit,多了队列功能,不需要数据库。

算法支持:TAILDROP,RED,NETWORK, Dynamic Rate Limiting Algorithms, FEEDBACK

本次测试的kamailio版本:

version: kamailio 5.8.5 (x86_64/linux)

配置参数

1
2
3
4
5
6
7
# 时间间隔,单位秒,默认10
modparam("ratelimit", "timer_interval", 5)
# 格式为"pipe_no:method",设置一个队列接受所有的方法,用*替换。 
modparam("ratelimit", "queue", "0:REGISTER")
modparam("ratelimit", "queue", "1:*")
# 定义pipe_no的算法和限制大小, 示例: pipe 0 with a limit of 80 pkts/sec using TAILDROP 
modparam("ratelimit", "pipe", "0:TAILDROP:80")

重要函数

rl_check([pvar])

检查当前请求匹配的ratelimit算法, 如果没有参数,使用METHOD匹配。 如果pvar提供了pipe number,按照pipe_no匹配。

当达到限制时,会返回错误码,后续动作需要用户来决定。

rl_check_pipe(pipe_no)

检查pipe_no的限制,如果没有设置,返回0.

实战

配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
loadmodule "ratelimit.so"
modparam("ratelimit", "timer_interval", 5)
modparam("ratelimit", "queue", "1:INVITE")
modparam("ratelimit", "pipe", "1:TAILDROP:3")


request_route {
    ...
    if (is_method("INVITE")) {
        if (!rl_check()) {
            append_to_reply("Retry-After: 5\r\n");
            sl_send_reply("503","Limiting");
            xlog("L_ALERT","received limit \n");
            exit;
        }
    }

}

测试

使用sipp分别作为uacuas, uac发送并发请求到kamailio, 可以看到输出的结果为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
 9(5655) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
10(5656) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
16(5662) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
14(5660) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
11(5657) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
 9(5655) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
14(5660) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
13(5659) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
16(5662) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
14(5660) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
16(5662) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
10(5656) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
15(5661) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
 9(5655) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
10(5656) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
13(5659) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
13(5659) ALERT: <script>: received limit 
 9(5655) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
 9(5655) ALERT: <script>: received limit 
10(5656) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
10(5656) ALERT: <script>: received limit 

因为配置了 3pkts/5s, 所以可以看到当请求到15个之后,第16个INVITE会触发限制, 此时由于配置了503错误,所以sip信令如下: sip

总结

  1. MAX_PIPESMAX_QUEUES分别为32
  2. ratelimitpipelimit功能类似,ratelimit不需要数据库,pipelimit需要数据库。
  3. ratelimit可以配置多个队列,每个队列可以配置多个算法,pipelimit只能一个pipe name一个算法。
本博客已稳定运行
发表了45篇文章 · 总计78.36k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计