kamailio通过rtpproxy实现穿透

 

本文描述通过路由器映射到内网时,怎么通过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

 

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