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

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

REGISTER sip:47.99.60.58:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.110:5060;rport;branch=z9hG4bK504370402
Route: <sip:47.99.60.58;lr>
From: "1982595644" <sip:1982595644@47.99.60.58>;tag=1899555974
To: "1982595644" <sip:1982595644@47.99.60.58>
Call-ID: 118260472@192.168.1.110
CSeq: 1 REGISTER
Contact: <sip:1982595644@192.168.1.110: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:1982595644@47.99.60.58>;tag=1899555974
To: "1982595644" <sip:1982595644@47.99.60.58>;tag=bf8638324618dc61059d4c604476fea1.f3fe
Call-ID: 118260472@192.168.1.110
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="47.99.60.58", nonce="XtYVo17WFHdzgA1OOXJnCD4S1iVq+mNh", qop="auth", algorithm=MD5
Server: kamailio (5.2.4 (x86_64/linux))
Content-Length: 0

REGISTER sip:47.99.60.58:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.110:5060;rport;branch=z9hG4bK1729793929
Route: <sip:47.99.60.58;lr>
From: "1982595644" <sip:1982595644@47.99.60.52>;tag=1899555974
To: "1982595644" <sip:1982595644@47.99.60.52>
Call-ID: 118260472@192.168.1.110
CSeq: 2 REGISTER
Contact: <sip:1982595644@192.168.1.110:5060>
Authorization: Digest username="1982595644", realm="47.99.60.58", nonce="XtYVo17WFHdzgA1OOXJnCD4S1iVq+mNh", uri="sip:47.99.60.58: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:1982595644@47.99.60.58>;tag=1899555974
To: "1982595644" <sip:1982595644@47.99.60.58>;tag=bf8638324618dc61059d4c604476fea1.262a
Call-ID: 118260472@192.168.1.110
CSeq: 2 REGISTER
Contact: <sip:1982595644@192.168.1.110: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:1982595644@192.168.1.110: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);
        }
}

 

     

 

 

Kamailio是一款开源的多媒体通信服务器,主要用于IP多媒体子系统(IMS)和多媒体通信服务,如VoIP(Voice over IP)。它提供了一种灵活的方式来构建和管理实时通信应用程序,支持SIP(Session Initiation Protocol)标准。下面是Kamailio安装部署的基本步骤: 1. **下载安装包**: 访问Kamailio的官方网站 <https://kamailio.org/download/> ,选择适合你的操作系统版本(Linux、Windows、Mac等)的源代码或预编译二进制包。 2. **配置环境**: 安装必要的依赖项,比如开源数据库(MySQL、PostgreSQL)、编译工具和其他库。确保你的系统已安装了libxml2、libssl、SQLite等。 3. **解压并编译**: 对于源代码安装,使用tar命令解压下载的包,然后进入目录,执行 `./configure` 命令进行配置,接着运行 `make` 和 `sudo make install` 来编译和安装。 4. **配置文件**: 需要编辑`/etc/kamailio/kamailio.cfg` 或者`$PREFIX/etc/kamailio/kamailio.cfg`(取决于安装位置),设置服务器地址、端口、认证信息、路由策略等参数。 5. **启动服务**: 使用`sudo /usr/sbin/kamctl start` 或者 `systemctl start kamailio` 命令启动Kamailio服务。首次启动可能需要创建数据库表。 6. **测试与监控**: 可以使用`kamcontrol`或SIP客户端测试服务器是否正常运行。同时,监控系统的日志文件(通常是/var/log/kamailio/kamailio.log)以及性能指标,确保服务稳定。 7. **安全管理**: 配置访问控制,包括防火墙规则,只允许来自特定IP或网段的SIP请求。 8. **备份和维护**: 定期备份配置和数据,以防止数据丢失。更新到新的Kamailio版本时,需要对比新旧配置文件,并考虑是否需要迁移数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值