本文描述通过路由器映射到内网时,怎么通过rtpproxy实现NAT。
下载rtpproxy源码
# cd /usr/local/src
# git clone git://sippy.git.sourceforge.net/gitroot/sippy/rtpproxy
# cd rtpproxy
修改源码
修改源码,添加一个参数,用于设置路由器的映射地址。
编辑main.c源码:
找到以下一行代码,
cf->stable.log_facility = -1;
在这行后面添加一行:
cf->stable.advertised = NULL;
找到这一行代码
while ((ch = getopt(argc, argv, "vf2Rl:6:s:S:t:r:p:T:L:m:M:u:Fin:Pad:")) != -1)
把它改为:
while ((ch = getopt(argc, argv, "vf2Rl:6:s:S:t:r:p:T:L:m:M:u:Fin:Pad:A:")) != -1)
在紧接着的switch/case分支里,添加一个分支:
case 'A':
cf->stable.advertised = strdup(optarg);
break;
存盘。
编辑rtpp_command.c文件,找到下面这段代码:
if (lia[0] == NULL || ishostnull(lia[0]))
len += sprintf(cp, "%d\n", lport);
else {
len += sprintf(cp, "%d %s%s\n", lport, addr2char(lia[0]),
(lia[0]->sa_family == AF_INET) ? "" : " 6");
}
将它修改为:
存盘退出。
if(cf->advertised != NULL)
len += sprintf(cp, "%d %s%s\n", lport, cf->advertised,
(lia[0]->sa_family == AF_INET) ? "" : " 6");
else
len += sprintf(cp, "%d %s%s\n", lport, addr2char(lia[0]),
(lia[0]->sa_family == AF_INET) ? "" : " 6");
编辑rtpp_defines.h文件
在struct cfg_stable定义里添加一个属性:
char *advertised; /* The mapped public network IP address*/
编译安装
执行以下命令编译安装:
# ./configure && make && make install
启动rtpproxy
# rtpproxy -A218.75.32.50 -l0.0.0.0 -sudp:localhost:7722 -m 33000 -M 35000 -F
参数说明:
-A: 映射的公网IP
-s: 本机用于kamailio控制的监听地址和端口
-m: 最小RTP端口
-M: 最大RTP端口
配置kamailio
编辑kamailio.cfg
添加WITH_NAT定义:
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
#!define WITH_NAT
找到这一行:
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
把IP和端口指向rtpproxy的服务IP和端口。
在request_route的开头加上一行:
add_local_rport();
配置listen 别名,添加以下内容
listen=udp:192.168.124.68:6060 advertise PublicIP:port