背景
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
分别作为uac
和uas
, 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
}
|