本文描述通過路由器映射到內網時,怎麼通過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