kamailio在公网部署注册和呼叫相关的问题

       kamailio在公网部署,收到SIP终端注册的消息中的contact地址可能带的是内网的IP地址和端口,例如终端注册报文如下:

REGISTER sip:47.99.60.52:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.110:5060;rport;branch=z9hG4bK504370402
Route: <sip:47.99.60.52;lr>
From: "1982595644" <sip:[email protected]>;tag=1899555974
To: "1982595644" <sip:[email protected]>
Call-ID: [email protected]
CSeq: 1 REGISTER
Contact: <sip:[email protected]:5060>
Max-Forwards: 70
User-Agent: Cisco
Expires: 300
Allow: INVITE,ACK,CANCEL,BYE,UPDATE,INFO,OPTIONS,REFER,NOTIFY
Content-Length: 0

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.110:5060;rport=5060;branch=z9hG4bK504370402;received=122.226.117.78
From: "1982595644" <sip:[email protected]>;tag=1899555974
To: "1982595644" <sip:[email protected]>;tag=bf8638324618dc61059d4c604476fea1.f3fe
Call-ID: [email protected]
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="47.99.60.52", nonce="XtYVo17WFHdzgA1OOXJnCD4S1iVq+mNh", qop="auth", algorithm=MD5
Server: kamailio (5.2.4 (x86_64/linux))
Content-Length: 0

REGISTER sip:47.99.60.52:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.110:5060;rport;branch=z9hG4bK1729793929
Route: <sip:47.99.60.52;lr>
From: "1982595644" <sip:[email protected]>;tag=1899555974
To: "1982595644" <sip:[email protected]>
Call-ID: [email protected]
CSeq: 2 REGISTER
Contact: <sip:[email protected]:5060>
Authorization: Digest username="1982595644", realm="47.99.60.52", nonce="XtYVo17WFHdzgA1OOXJnCD4S1iVq+mNh", uri="sip:47.99.60.52:5060", response="615570b427d299ad05baaa94bc8533d7", algorithm=MD5, cnonce="0a4f113b", qop=auth, nc=00000001
Max-Forwards: 70
User-Agent: Cisco
Expires: 300
Allow: INVITE,ACK,CANCEL,BYE,UPDATE,INFO,OPTIONS,REFER,NOTIFY
Content-Length: 0

SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.110:5060;rport=5060;branch=z9hG4bK1729793929;received=122.226.117.78
From: "1982595644" <sip:[email protected]>;tag=1899555974
To: "1982595644" <sip:[email protected]>;tag=bf8638324618dc61059d4c604476fea1.262a
Call-ID: [email protected]
CSeq: 2 REGISTER
Contact: <sip:[email protected]:5060>;expires=300
Server: kamailio (5.2.4 (x86_64/linux))
Content-Length: 0

      kamailio保存在内存中的终端地址为终端注册过来的内网地址,而不是来源的IP地址和端口,通过kamailio进行外呼这个注册的终端,发现kamailio会将消息发往终端注册过来的内网地址,可能会导致呼叫失败。通过阅读kamailio的官方文档,可以通过设置NAT相关标致来解决,但是发现一般NAT是和rtpproxy一块使用,我们项目中只使用kamailio来做信令的代理,不处理媒体,而且本人设置了下NAT相关的,发现保存注册过来的SIP终端的地址还是内网的地址,可能是我没有用好kamailio的NAT,本人通过修改kamailio的registrar的save.c函数中的save函数,如果发现contact地址中的IP和来源IP地址不一致,将REGISTER报文中的contact地址改为来源的IP地址和端口,这时kamailio内存中保存的注册信息的contact地址从内网地址变成了公网地址。但是发现通过kamailio进行外呼注册的SIP终端还是不能呼叫成功,发现终端回复的INVITE的200 OK中的contact地址为终端的内网地址,导致主叫回复到ACK 中的request-uri(ACK sip:[email protected]:5060 SIP/2.0)为终端的内网地址,导致kamailio路由ACK信令时,将信令转到了request-uri中的导致,最后导致ack信令没有到达终端,导致呼叫失败。

       通过修改kamailio.cfg配合文件,判断如果收到终端回复的INVITE 200 OK信令时,在该信令中添加一个私有头域,带上该200 OK的来源IP地址和端口,主叫收到200 OK后,解析该私有头域,后续发送ACK、UPDATE、BYE等信令时,request-uri中的IP地址和端口都使用该地址,最后呼叫成功。

       外呼模型为:标准SIP网关-------kamailio-------SIP终端,信令都通过kamailio进行代理;

       kamailio.cfg的更改如下:

# Manage incoming replies
onreply_route[MANAGE_REPLY] {
        xdbg("incoming reply\n");
        if ( is_method("INVITE") && t_check_status("200") ) {
                xinfo("----- IP:$si:$sp");
                append_hf("SourceAddress: $si:$sp\r\n");
        }
        if(status=~"[12][0-9][0-9]") {
                route(NATMANAGE);
        }
}

 

     

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章