记录路由头行 1 对于 180 Ringing 和 200 OK 消息为空,记录路由的第二行包含 IP。对于 INVITE 则不然,两行都包含 IP。 这会导致 200 OK 的 ACK 未转发到正确的 IP 的问题。
什么可能导致此问题?记录路由已添加但为空?下面我添加了一些有关我的设置的信息。
Kamailio 有两个接口,右侧(eth1)连接到 Asterisk,左侧是(eth0)。 Asterisk 正在发送 200 ok 的 ACK,但发送到记录路由标头第二行中的 IP,即另一个接口 (eth0)。
感谢任何形式的支持。
谢谢!
这是记录路由配置:
`remove_hf("Route");
if (is_request()) {
if (is_method("INVITE")) {
#!ifndef RECORD_ROUTE_WORKAROUND
$var(loglevel)=2;
$var(logmessage)="Insert Record Route into " + $rm ;
route(LOGGING);
record_route();
#!endif
#!ifdef RECORD_ROUTE_WORKAROUND
if(ds_is_from_list(2, "3")) {
$var(loglevel)=2;
$var(logmessage)="Insert Record Route into " + $rm ;
route(LOGGING);
record_route();
}
if(ds_is_from_list(1, "3")) {
$var(loglevel)=2;
$var(logmessage)="Removing Record Route " + $rm ;
route(LOGGING);
remove_hf("Record-Route");
}
#!endif
}
/* Set request URI and TO header to the target server */
if (ds_is_from_list(-1, "3")) {
if(is_method("INVITE")) {
if($ru!=$null) {
$ru = "sip:" + $rU + "@" + $(avp(dsattrs){param.value,fqdn}) + ";user=phone" ;
}
if(is_present_hf("To")) {
$td = $(avp(dsattrs){param.value,fqdn});
}
}
}
}
#!ifdef RECORD_ROUTE_WORKAROUND
if (is_reply()) {
if(ds_is_from_list(2, "3")) {
$var(loglevel)=2;
$var(logmessage)="Instert Record Route into " + $rm ;
route(LOGGING);
record_route();
}
if(ds_is_from_list(1, "3")) {
$var(loglevel)=2;
$var(logmessage)="Removing Record Route " + $rm ;
route(LOGGING);
remove_hf("Record-Route");
}
}
#!endif
}`
Record-Route 标头仅在 SIP INVITE 请求中添加,相应的 SIP 回复必须仅镜像它们。如果传出 INVITE 具有正确的 Record-Route 值,但相应的传入 18x/200 回复带有空 Record-Route,则问题很可能出在生成回复的 UA 处,请尝试在那里进行调查。
关于描述中的kamailio.cfg片段,应该没有删除用于回复的Record-Route标头,在if(is_reply())中有一个remove_hf(“Record-Route”) { } 块。它由 #!ifdef 守护,也许它未激活。
顺便说一句,如果从 Kamailio 发出的 INVITE 第一个 Record-Route 为空,那通常是因为 record_route() 在 msg_apply_changes() 之前执行。