背景
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
分别作为uac
和uas
, 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信令如下:

总结
MAX_PIPES
和MAX_QUEUES
分别为32
ratelimit
和pipelimit
功能类似,ratelimit
不需要数据库,pipelimit
需要数据库。
ratelimit
可以配置多个队列,每个队列可以配置多个算法,pipelimit
只能一个pipe name
一个算法。