OpenSIPS + RTPProxy

http://opensips.org/pipermail/users/2011-January/016175.html


注意要将防火墙关闭。


# ----------- global configuration parameters ------------------------
debug=3
fork=yes
log_facility=LOG_LOCAL0
log_stderror=no
children=4
port=5060
dns=no
rev_dns=no


#advertised_address="xx.xx.xx.xx"
#alias="xx.xx.xx.xx:5060"


# ------------------ module loading ----------------------------------
mpath="/usr/lib/opensips/modules/"
loadmodule "db_mysql.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "nathelper.so"
loadmodule "domain.so"


# ----------------- setting module-specific parameters ---------------
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("usrloc", "db_url",
"mysql://opensipsrw:opensipsrw@localhost/opensips")
modparam("usrloc", "db_mode", 2)
modparam("rr", "enable_full_lr", 1)
modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:50010")
modparam("nathelper", "nortpproxy_str", "")
modparam("domain", "db_url",
"mysql://opensipsrw:opensipsrw@localhost/opensips")


################## NAT ######################
modparam("usrloc", "nat_bflag", 6)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", 8)
modparam("nathelper", "received_avp", "$avp(i:801)")
################## NAT ######################




# main routing logic
route {


   # initial sanity checks
   if (!mf_process_maxfwd_header("10")) {
       sl_send_reply("483","Too Many Hops");
       exit;
   };


   if (msg:len >=  2048 ) {
       sl_send_reply("513", "Message too big");
       exit;
   };




   ################## NAT ######################
   if (nat_uac_test("3")) {


       if (is_method("REGISTER") && !is_present_hf("Record-Route")) {


           # Rewrite contact with source IP of signalling
           fix_nated_contact();


           force_rport();
           setbflag(6); # Mark as NATed


           # if you want SIP NAT pinging
           setbflag(8);
       };
   };
   ################## NAT ######################


   if (!method=="REGISTER")
       record_route();


   # subsequent messages withing a dialog should take the
   # path determined by record-routing
   if (loose_route()) {
       # mark routing logic in request
       append_hf("P-hint: rr-enforced\r\n");
       route(1);
   };


   if (!uri==myself) {
       # mark routing logic in request
       append_hf("P-hint: outbound\r\n");
       route(1);
   };


   if (uri==myself) {
       if (method=="REGISTER") {
           save("location");
           exit;
       };
   }


   if (is_method("BYE"))
       unforce_rtp_proxy();
     if (!lookup("location","m")) {
       switch ($retcode) {
           case -1:
           case -3:
               t_newtran();
               t_on_failure("1");
               t_reply("404", "Not Found");
               exit;
           case -2:
               sl_send_reply("405", "Method Not Allowed");
               exit;
       }
   };


   route(1);
}






route[1] {


   ################## NAT ######################
   if (uri=~"[@:](192\.168\.10\.172\.(1[6-9]2[0-9]3[0-1])\.)" &&
!search("^Route:")) {
       sl_send_reply("479", "We don't forward to private IP addresses");
       exit;
   };


   # if client or server know to be behind a NAT, enable relay
   if (isbflagset(6)) {
       if (has_body("application/sdp")) {
           rtpproxy_offer("o");
       };
   };


   t_on_reply("1");
   ################## NAT ######################




   # send it out now; use stateful forwarding as it works
   # reliably even for UDP2TCP
   if (!t_relay()) {
       sl_reply_error();
   };


   exit;
}






onreply_route[1] {


   ################## NAT ######################
   if (isbflagset(6) && status =~ "(183)|2[0-9][0-9]") {
       fix_nated_contact();
       if (has_body("application/sdp")) {
           rtpproxy_answer("o");
       };


       # Is this a transaction behind a NAT and we did not
       # know at time of request processing?
   } else if (nat_uac_test("1")) {
       fix_nated_contact();
   };
   ################## NAT ######################

}

failure_route[1] {
   unforce_rtp_proxy();
}


注:如果opensips没有配置nat功能,遇到软电话注册使用局域网地址时,那么opensips的分机注册ip会显示为局域网ip,这样对于在公网上的opensips服务器显然是不行的。
microsip有一个ip重写的设置,设置后可以解决这个问题。但如果是其它软电话或是ip电话没有这个功能设置,那就不行了。因此需要opensips来解决nat穿透。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值