背景
pike
模块提供了简单的防DOS
攻击功能,根据请求的ip
对请求进行计数, 达到限制时,
只是上报信息,后续执行哪种动作,由用户决定。此功能和之前章节kamailio的pike模块
功能一致。
支持两种模式:
- 手动模式, 调用
pike_check_req
- 自动模式, 设置路由
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
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
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");
}
|
测试
- 手动模式
并发请求,得到的信令图为:

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

- 自动模式
并发请求,得到的信令图为:

达到限制时日志为:
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信令图为:

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

由于达到了限制,正常的一通对话的后面的信令就不再接收了.
总结
手动模式
比自动模式
更可控,可自定义返回错误码.
opensips
的pike
和kamailio
的pike
功能一样,但kamailio
的pike
没有自动模式。