Featured image of post kamailio pike模块

kamailio pike模块

背景

pike模块可以跟踪sip请求的ip源, 如果达到限制, 会产生日志表示达到了最高限制,后续的动作由用户来决定。 官方文档地址: pike

本次测试的kamailio版本:

version: kamailio 5.8.5 (x86_64/linux)

参数解析

1
2
3
4
5
6
7
8
# 用于采样的时间段,值越小越好,但是会慢。默认2
modparam("pike", "sampling_time_unit", 10)
# 在sampling_time_unit时间内,允许多少个请求,ipv4为x到3*x, ipv6为x到8*x. 默认30 
modparam("pike", "reqs_density_per_unit", 30)
# 设置上次请求的ip保留多长时间在内存中,默认120s
modparam("pike", "remove_latency", 130)
# pike模块的日志等级,默认1(L_WARN)
modparam("pike", "pike_log_level", -1)

重要函数

pike_check_req()

检查请求是否被限制。返回值:

  • 1: ip没有限制或者内部错误
  • -1: ip是洪水源, 被检测到
  • -2: ip是新的洪水源被首次检测到.

pike_check_ip(ipaddr)

检查ip是否被限制,如果ip被限制,返回false, 返回参数和pike_check_req()一致。

实战

配置新增

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
loadmodule "pike.so"
modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 6)
modparam("pike", "pike_log_level", -1)


request_route {
        xlog("L_INFO","------$si:$sp|$Ri:$Rp|$pr|$rm\n");
        if (!has_totag() && !pike_check_req()) {
                xlog("L_ERROR", "----$si receive limit\n");
                sl_send_reply("500", "request limit");
                exit;
        }
        ...
}

设置2s内, 相同ip6个请求, 测试是否能触发限制.

测试方式

使用sipp分别作为uacuas, uac发送并发请求到kamailio, 然后kamailio转发请求到uas.

uac的参数: -l 10 -m 10

实际看到的日志:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
11(3977) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
 9(3975) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
15(3981) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
11(3977) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
10(3976) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
16(3982) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
 9(3975) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
14(3980) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
13(3979) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
12(3978) INFO: <script>: ------172.16.4.113:5666|172.16.4.111:5461|udp|INVITE
12(3978) ERROR: pike [pike_funcs.c:135]: pike_check_ipaddr(): PIKE - BLOCKing ip 172.16.4.113, node=0x7f9f01214b30
12(3978) ERROR: <script>: ----172.16.4.113 receive limit
33(3999) ERROR: pike [pike_funcs.c:313]: refresh_node(): PIKE - UNBLOCKing node 0x7f9f01214b30

因为pike_check_req,只是用来检测ip是否被限制, 如果想要拦截请求,可以使用sl_send_reply("", "");自定义返回错误。

使用kamcmd pike.top,看到的数据为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
        max_hits: 6
        list: {
                {
                        ip_addr: 172.16.4.113
                        leaf_hits_prev: 9
                        leaf_hits_curr: 0
                        expires: 118
                        status: HOT
                }
        }
        number_of_rows: 1
}
本博客已稳定运行
发表了45篇文章 · 总计78.36k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计