先贴一段 osipsconfig(OpenSIIPS3.4) 产生的路由脚本:
if ( !(is_method("REGISTER") ) ) {
if (is_myself("$fd")) {
# authenticate if from local subscriber
# authenticate all initial non-REGISTER request that pretend to be
# generated by local subscriber (domain from FROM URI is local)
if (!proxy_authorize("", "subscriber")) {
proxy_challenge("", "auth");
exit;
}
if ($au!=$fU) {
send_reply(403,"Forbidden auth ID");
exit;
}
consume_credentials();
# caller authenticated
} else {
# if caller is not local, then called number must be local
if (!is_myself("$rd")) {
send_reply(403,"Relay Forbidden");
exit;
}
}
}
第一个 if 检查是否 REGISTER 方法。
第二个 if 检查 From 域是不是自己。
但这些不是我们关注的重点。
我们要留意中间的这几句:
if ($au!=$fU) {
send_reply(403,"Forbidden auth ID");
exit;
}
下面是 $au 的英文解释:
$au - Auth username user, user part of username from Authorization or Proxy-Authorization header
简单准确,熟悉 SIP 协议的秒懂,应该不需再翻译成中文。
$fU 就更简单了,就是From URI username。
我们知道很多模拟网关会把整个网关注册到 OpenSIPS,
fxo-to-ip 路由时,INVITE包里面的$fU就是线路主叫号码,跟鉴权用户不一致(鉴权用户只有一个),那么这种情况下就不要再检查 $au 是否等于 $fU 了。
OpenSIPS 就介绍到这里。
Kamailio 也可以做上面的检查,但 Kamailio 有自己独特的方式,
看下面这段路由代码:
# authenticate requests
if (!auth_check("$fd", "subscriber", "1")) {
auth_challenge("$fd", "0");
exit;
}
留意 auth_check 的第三个参数,如果为 1,那么 $au 必须等于 $fU,否则就失败;如果为 0,那么不再检查 $au 是否等于 $fU。
Kamailio 就介绍到这里。
至于 FreeSWITCH,我不清楚是否有类似的检查(估计没有)。如果您更清楚细节,烦请留言给我,先致谢!