跟我一起写Kamailio xhttp路由

以这个路由文件为蓝本:

https://github.com/kamailio/kamailio/blob/master/etc/kamailio.cfg

新建一个/etc/kamailio-local.cfg,内容是:

#!define WITH_MYSQL
#!define WITH_NAT
#!define WITH_USRLOCDB

listen=udp:192.168.100.131:5060 # 改成自己的
listen=tcp:192.168.100.131:5060 # 改成自己的
listen=tcp:127.0.0.1:5060

下面编辑/etc/kamailio/kamailio.cfg,

先找到这一行:

request_route {

在这行的上面增加这些内容:

#!ifndef MOD_htable
loadmodule "htable.so" # 如果前面没有加载htable模块,那么现在加载
modparam("htable", "htable", "bancc=>size=10;")
#!endif

loadmodule "jansson.so"
loadmodule "geoip2.so"
modparam("geoip2", "path", "/etc/kamailio/GeoLite2-City.mmdb") # 到github.com找这个文件

bancc保存有哪些国家(country code)需要禁止(ban),路由部分是这样:

request_route {
     xinfo("START: $rm|$ci|to = $tu|fu = $fu|IP = $si:$sp\n");

     if (!has_totag()) {
        if (geoip2_match("$si", "src")) {
            $var(cc) = $gip2(src=>cc);
            if ($sht(bancc=>$var(cc))) {
                xerr("$ci|$si from $var(cc), will drop\n");
                drop;
            }
        }
    }
    ... 

drop就行,不要回403之类的消息。

初始化时从配置文件/etc/kamailio/bancc读取:

event_route[htable:mod-init] {
    if (!file_read("/etc/kamailio/bancc", "$var(cclist)")) {
        xerr("can not read bancc!\n");
        exit;
    }
    route(CHECK_BANCC);
    exit;
}

route[CHECK_BANCC] {
    sht_rm_name_re("bancc=>.*"); # 清除以前的内容
    xinfo("cclist = $var(cclist)\n");
    $var(count) = 0;
    jansson_array_size("bancc", $var(cclist), "$var(size)");
    xinfo("size = $var(size)\n");
    while($var(count) < $var(size)) {
        jansson_get("bancc[$var(count)]", $var(cclist), "$var(cc)");
        xinfo("cc = $var(cc)\n");
        $sht(bancc=>$var(cc)) = 1;
        $var(count) = $var(count) + 1;
    }
}

xhttp的路由是这样:

event_route[xhttp:request] {
    if ($hu =~ "bancc/re_config"){
        route(BANCC_RE_CONFIG);
    }
    xhttp_reply("403", "Forbidden", "", "");
    exit;
}

route[BANCC_RE_CONFIG] {
    # 写到/etx/kamailio/bancc
    if (!file_write("/etc/kamailio/bancc", "$rb")) {
        xerr("can not write bancc!\n");
    }

    $var(cclist) = $rb;
    route(CHECK_BANCC);
    xhttp_reply("200", "OK", "", "");
    exit;
}

测试:

curl -H "Content-Type: application/json" -X POST -d '{"bancc":["ES","FR"]}' http://127.0.0.1:5060/api/bancc/re_config -vvv
kamcmd htable.dump bancc

赶紧试试吧。

这里还有个安全问题,有几个解决办法,其中比较简单的是只允许从本机发http请求过来,具体怎么实现,就当是作业吧。(查下这两个伪变量:$Ri 和$Rp)

全文完。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值