0

我正在尝试通过 kamailio 代理将所有呼叫路由到 twilio。使用我的配置文件,呼叫被连接并在大约 30 秒后自动挂断。这是因为 200 OK 发送到 twilio 的 ACK 不正确。Twilio 在 200 OK 响应中期望 ruri 的 ACK 与联系人相同,但发送的 kamailio 不同。如何修复此错误?

200 OK 响应,ACK 转发和 kamailio 配置文件是粘贴 bin 中的帖子,请查看下面的链接。(在这里粘贴代码不容易)

http://pastebin.com/hyLVTT23

现在我正在尝试通过将 htable 中的联系人存储为 200 并转发 ack 来更改 sip ruri。但它不起作用,我无法将联系人从 200 存储到 htable 并在 ack 中使用。请查看我正在绑定的配置文件中的代码。

     if(status=="200")
  {

    $var(x) = $ct;
    $var(c) = $(var(x){nameaddr.uri});
    $sht(b=>ru)=$var(c);
    exit;
  }

if ( is_method("ACK") && $si=="64.2.142.90") {
        $du = "sip:xxxxxxx.sip.twilio.com";

        $ru=$sht(b=>ru);

        forward();
        exit;
        }
4

1 回答 1

1

为了进行适当的分析,将需要传入 Kamailio 的 ACK 以及 Kamailio 发出的 ACK。

我可以试着猜测那里会发生什么。查看 200ok,有 3 个 Record-Route 标头,这意味着有 3 个 SIP 代理路由此呼叫。我假设 Kamailio 在 107.21.211.20:5060 上(此 IP 不在通过 200ok 回复的堆栈中,这让我认为您粘贴的 200ok 是 Kamailio 发回给呼叫者的那个)。

然后,200ok 中的第二个(54.69.159.69:5060)和第三个(64.2.142.90)Record-Route 标头使用 lr=on 参数,这对于类似 SER 的代理(SER、较旧的 Kamailio(包括 OpenSER)或其他变体)。

我得出的结论是,在呼叫者和您的 Kamailio 之间还有另外两个这样的代理。很可能,第二个(54.69.159.69:5060)具有 NAT 遍历路由逻辑。但它做得不对。它查看 200ok 中的 Contact 标头并看到一个私有 IP,断定被调用者在 NAT 后面,并将 Contact 替换为源 IP 和 200ok 端口,这是您的 Kamailio 的。

要确认这一点,您需要查看呼叫者收到的 200ok - 请参阅此处的 Contact 标头。如果这得到证实,解决方案是:

1) 与第二个代理的所有者取得联系,并告诉他进行适当的 NAT 遍历处理。如果它是一个接一个代理,它不应该在 SIP 流量的那一侧做任何事情。如果它在那里使用 Kamailio,它必须从使用 fix_nated_contact() 切换到使用 set_contact_alias()/handle_contact_alias() 来处理 natted 联系人和 r-uri 到 natted 目的地(示例在最新 kamailio 版本如 4.2.x 的默认配置文件中或 4.1.x)

2) 如果 1) 不是解决方案,那么您必须在您的 kamailio 中修复它,这可以通过使用 set_contact_alias()/handle_contact_alias() 来完成。看来您的 kamailio 是 nat 后面的 twilio UA 旁边的第一跳,所以无论如何您都应该这样做。

请注意,如果 twilio UA 对传入的 r-uri 非常严格,则解决方案 2) 可能不起作用——第二个代理处理将丢失 twilio UA 的 ip。如果是这种情况,那么您必须采取额外的技巧来存储 twilio 发送的 200ok 中的原始联系人。可以通过联系人 uri 中的额外参数或使用 htable 并存储在 kamailio 内存中来完成,然后在收到 ACK 时使用它(re-INVITE 或 BYE 也需要相同)。

于 2014-11-18T23:00:27.017 回答