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

 

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