最近在搞opensips时发现好多问题,总结下面几点!
1、现在很难申请到公网地址,所以大多opensips都放在nat后面,这样的话通过路由器的DMZ功能的话,opensips会造成回环via路由,直接连注册登录都不行。解决方法就是在opensips.cfg中增加两个变量:
advertised_address="public_ip"
alias="public_ip"
或者
listen=udp:private_ip:5060 as public_ip:5060 (这种方式可解决36秒问题和主叫方挂断被叫方不挂现象)
但是这种方式通话中没有语音传输,是要走rtp代理才可以
2、关于rtp代理的问题
opensips在1.9.1版本中提供了rtpproxy模块,走rtp代理可以实现所有nat类型的穿透,包括复杂的对称型nat。不过把rtpproxy代理放到nat后面的话会很麻烦,最近在网上看到了一个解决方案,更新rtpproxy-1.2.1下面几个文件。给大家参考一下:
(1)修改main.c文件
131 bh[0] = bh[1] = bh6[0] = bh6[1] = NULL;
132
133 cf->advertised = NULL;
134 cf->port_min = PORT_MIN;
135 cf->port_max = PORT_MAX;
if (getrlimit(RLIMIT_NOFILE, &(cf->nofile_limit)) != 0)
149 err(1, "getrlimit");
150
151 while ((ch = getopt(argc, argv, "vf2Rl:6:s:S:t:r:p:T:L:m:M:u:Fin:Pad:A:")) != -1)
152 switch (ch) {
153 case 'A':
154 cf->advertised = strdup(optarg);
155 break;
156 case 'f':
157 cf->nodaemon = 1;
158 break;
(2)修改rtpp_command.c文件
if (lia[0] == NULL || ishostnull(lia[0]))
203 len += sprintf(cp, "%d\n", lport);
204 else{
205 if(cf->advertised != NULL)
206 len += sprintf(cp, "%d %s%s\n", lport, cf->advertised,
207 (lia[0]->sa_family == AF_INET) ? "" : " 6");
208 else
209 len += sprintf(cp, "%d %s%s\n", lport, addr2char(lia[0]),
210 (lia[0]->sa_family == AF_INET) ? "" : " 6");
211 doreply(cf, fd, buf, len, raddr, rlen);
212 }
213 }
(3)在rtpp_define.h中增加定义
136
137 int log_level;
138 int log_facility;
139 char *advertised;
140 };
(4)使用如下命令启动rtpproxy代理
rtpproxy -A public_IP -l privite_ip -s udp:localhost:7890 -L 8192 -F -d INFO LOG_LOCAL0
我是参考下面方式(rtpproxy -A you_public_ip -l 0.0.0.0 -s udp:localhost:7722 -L 8192 -m 25000 -M 34999 -F -d INFO LOG_LOCAL0)
(5)同样修改opensips.cfg配置文件,设置rtp连接
modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:7890") # CUSTOMIZE ME