Featured image of post opensips pike模块

opensips pike模块

背景

pike模块提供了简单的防DOS攻击功能,根据请求的ip对请求进行计数, 达到限制时, 只是上报信息,后续执行哪种动作,由用户决定。此功能和之前章节kamailio的pike模块功能一致。

支持两种模式:

  1. 手动模式, 调用pike_check_req
  2. 自动模式, 设置路由check_route

官方文档地址:pike

本次测试的opensips版本:

version: opensips 3.5.5 (x86_64/linux)

配置参数

1
2
3
4
5
6
7
8
# 采样的时间间隔, 单位秒,默认2 
modparam("pike", "sampling_time_unit", 10)
# 每个采样时间内, 每个ip的最大请求数, 默认30
modparam("pike", "reqs_density_per_unit", 30)
# ip地址保存多长时间在内存中,默认: 120
modparam("pike", "remove_latency", 130)
# pike日志级别, 默认: 1(L_WARN)
modparam("pike", "pike_log_level", -1)

重要函数

pike_check_req()

检查当前请求的ip是否超过限制, 如果超过, 则返回false

返回值:

1(true): `ip`没有被限制或者内部错误
-1(false): `ip`是洪水来源,正在检测
-2(false): `ip`是新的洪水来源,正在检测 

实战

配置

  1. 手动模式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
loadmodule "pike.so"
modparam("pike", "sampling_time_unit", 5)
modparam("pike", "reqs_density_per_unit", 3)
modparam("pike", "remove_latency", 130)
modparam("pike", "pike_log_level", -1)


route {
    ...
    
    if (is_method("INVITE")&& !pike_check_req()) {
        append_to_reply("Retry-After: 5\r\n");
        sl_send_reply(503,"Limiting");
        xlog("L_DBG","[$cfg_line][$ci]----receive limited--\n");
        exit; 
    }
    ...
}
  1. 自动模式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
loadmodule "pike.so"
modparam("pike", "sampling_time_unit", 5)
modparam("pike", "reqs_density_per_unit", 3)
modparam("pike", "remove_latency", 130)
modparam("pike", "pike_log_level", -1)
modparam("pike", "check_route", "pike")

route[pike] {
    if ($si == 172.16.4.114) {
        drop;
    }

    xlog("L_DBG", "receive packeage.\n");
}

测试

  1. 手动模式

并发请求,得到的信令图为:

sip

可以看到如果5s内请求数超过3次,后续请求都会返回503。如果要解除锁定就要remove_latency时间过期. 503返回:

503

  1. 自动模式

并发请求,得到的信令图为:

sip

达到限制时日志为:

1
2
3
4
Jun 24 14:58:19 [540] DBG:receive packeage.
Jun 24 14:58:19 [540] ERROR:PIKE - BLOCKing ip 172.16.4.113, node=0x7fae720338c8
Jun 24 14:58:19 [540] DBG:receive packeage.
Jun 24 14:58:20 [535] DBG:receive packeage

达到限制之后的sip信令图为: sip

可以看到之后的请求没处理,这种方式不可控,而且会导致正常的会话未完成: sip

由于达到了限制,正常的一通对话的后面的信令就不再接收了.

总结

  1. 手动模式自动模式更可控,可自定义返回错误码.
  2. opensipspikekamailiopike功能一样,但kamailiopike没有自动模式。
本博客已稳定运行
发表了57篇文章 · 总计94.35k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计