如何设置kamailio代理服务器并将调用路由到twilio?

时间:2014-11-11 11:56:43

标签: proxy-server kamailio

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

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

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;
        }

1 个答案:

答案 0 :(得分:0)

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

我可以试着猜猜那里发生了什么。查看200ok,有3个Record-Route标头,这意味着有3个SIP代理路由此呼叫。我假设Kamailio在107.21.211.20:5060(这个IP不在200k回复的Via堆栈中,让我觉得你粘贴的200ok是从Kamailio发回给调用者的那个)。

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

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

要确认这一点,您需要查看来电者收到的200ok - 请参阅那里的联系人标题。如果确认,解决方案是:

1)与第二代理的所有者联系并告诉他进行正确的NAT遍历处理。如果它是另一个代理之后的代理,则它不应该在SIP流量的那一侧做任何事情。如果它在那里使用Kamailio,它必须从使用fix_nated_contact()切换到使用set_contact_alias()/ handle_contact_alias()来处理natted联系人和r-uri到natted目的地(例如,在4.2.x的最新kamailio版本的默认配置文件中或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需要相同)。