这实际上是一个普遍的问题。
问题在于您的 RTP 传输 - 与端口 5060 或 5080 上的信号无关。虽然我看不到数据包本身,但您正在收到 RTP 超时 - 星号默认 RTP 超时为 30 秒。
几件事要检查。
- 确保远程防火墙允许您发送媒体的端点(RTP 流本身 - UDP 端口 10000 - 60000)。
- 确保您接受来自远程系统的所有 UDP RTP 端口 - 这可能很棘手,我通常建议在 SBC 上允许从 1025 到 60000 的所有 UDP 端口,例如您拥有的那个 - 这没有风险,因为您不能放置或在没有信号的情况下接听电话(您已在端口 5060-5080 上保护)。
正如前面的评论者所说,检查 NAT 并确保外部 IP 在 SIP 数据包中正确。如果您愿意,请在星号 CLI 中键入以下内容:
sip 设置调试
然后粘贴调试的内容以回复此问题,我可以进一步提供帮助。
- 您还可以在星号中设置 rtpignoreversion 属性。但我只推荐这作为最后的手段。最好按照上面的说明粘贴 SIP 跟踪,以找到问题的根源。
如果我是一个打赌的人——有时我是:-)——我会向甜甜圈打赌,RTP(媒体)流在该服务器和与之通信的端点之间没有正确传递。SIP 跟踪将向您显示问题 IP 地址,并且我敢打赌,允许您打开防火墙以允许所述端点和/或通过打开上面引用的 UDP 端口说服您打开到该服务器的 RTP。如果 IPTABLES 已打开,请尝试禁用它并进行测试。同样,SIP 跟踪将告诉我们我们需要知道的所有信息,以便为您提供准确的答案。
看到你的日志后更新----
在我看来,您的路由脚本没有以您想要的方式绑定星号所需的钩子......
看看这个脚本——我过去用过这个。它需要您进行一些修改,但它应该让您继续......
显然,这不是一个完整的路由脚本——它会被放置在你的路由定义之前,靠近你的脚本底部......
另外-您确实发现了星号无法验证用户3012的事实,对吗?我假设您这样做了,并且与您的问题无关,但我想我应该问...
# ASTERISK HOOK - BEGIN
# media service number? (digits starting with *)
if ($rU=~"^\*[1-9]+") {
# we do provide access to media services only to our
# subscribers, who were previously authenticated
if (!is_from_local()) {
send_reply("403","Forbidden access to media service");
exit;
}
#identify the services and translate to Asterisk extensions
if ($rU=="*1111") {
# access to own voicemail IVR
seturi("sip:VM_pickup@ASTERISK_IP:ASTERISK_PORT");
} else
if ($rU=="*2111") {
# access to the "say time" announcement
seturi("sip:AN_time@ASTERISK_IP:ASTERISK_PORT");
} else
if ($rU=="*2112") {
# access to the "say date" announcement
seturi("sip:AN_date@ASTERISK_IP:ASTERISK_PORT");
} else
if ($rU=="*2113") {
# access to the "echo" service
seturi("sip:AN_echo@ASTERISK_IP:ASTERISK_PORT");
} else
if ($rU=~"\*3[0-9]{3}") {
# access to the conference service
# remove the "*3" prefix and place the "CR_" prefix
strip(2);
prefix("CR_");
rewritehostport("ASTERISK_IP:ASTERISK_PORT");
} else {
# unknown service
seturi("sip:AN_notavailable@ASTERISK_IP:ASTERISK_PORT");
}
# after setting the proper RURI (to point to corresponding ASTERISK extension),
# simply forward the call
t_relay();
exit;
}
# ASTERISK HOOK - END
# do lookup
if (!lookup("location")) {
# ASTERISK HOOK - BEGIN
# callee is not registered, so different to Voicemail
# First add the VM recording prefix to the RURI
prefix("VMR_");
# forward to the call to Asterisk (replace below with real IP and port)
rewritehostport("ASTERISK_IP:ASTERISK_PORT");
route(1);
# ASTERISK HOOK - END
exit;
}
# when routing via usrloc, log the missed calls also
setflag(2);
# arm a failure route in order to catch failed calls
# targeting local subscribers; if we fail to deliver
# the call to the user, we send the call to voicemail
t_on_failure("1");
route(1);
}
route[1] {
if (!t_relay()) {
sl_reply_error();
};
exit;
}
failure_route[1] {
if (t_was_cancelled()) {
exit;
}
# if the failure code is "408 - timeout" or "486 - busy",
# forward the calls to voicemail recording
if (t_check_status("486|408")) {
# ASTERISK HOOK - BEGIN
# First revert the RURI to get the original user in RURI
# Then add the VM recording prefix to the RURI
revert_uri();
prefix("VMR_");
# forward to the call to Asterisk (replace below with real IP and port)
rewritehostport("ASTERISK_IP:ASTERISK_PORT");
t_relay();
# ASTERISK HOOK - END
exit;
}