[Serusers] [Question]:module nathelper

jimmy huang jimmy_huang at uni.com.tw
Mon Apr 26 09:28:27 CEST 2004


Hi :
I have download the latest ser and all modules with CVS (2004/04/21)
i still testing the same environment with nathelper , rtpproxy
UA 1(kphone 3.14)     ->     NAT    ->        Ser        <-    UA 2 (kphone
3.14)

UA1 can register to ser with public (after NAT ) correctly ,
but when UA 2 INVITE UA1
When UA1 reply 200 OK with SDP
Ser seems not modify the SDP to public ip and port
so when UA2 receive SDP , it still can't know or should say it can't send
rtp to correct IP:port

it seems my config has some bug , so sdp has not been modify ??
can any one give my any ideas?

and
in this scenario , is ser modify the sdp to force UA to send rtp to ser
then rtpproxy will handle the both UAs' rtp to transport to the both UAs?

these are my ser.cfg refered from
(http://www.informatik.uni-bremen.de/~prelle/terena/cookbook/main/ch04s07.ht
ml )

============================================================================
#
# $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei Exp $
#
# simple quick-start config script
#

# ----------- global configuration parameters ------------------------

#debug=3         # debug level (cmd line: -dddddddddd)
#fork=yes
#log_stderror=no # (cmd line: -E)

#/* Uncomment these lines to enter debugging mode
debug=7
#fork=no
log_stderror=yes
#*/

check_via=no # (cmd. line: -v)
dns=no           # (cmd. line: -r)
rev_dns=no      # (cmd. line: -R)
#port=5060
#children=4
fifo="/tmp/ser_fifo"

# ------------------ module loading ----------------------------------

# Uncomment this if you want to use SQL database
#loadmodule "/usr/local/lib/ser/modules/mysql.so"

loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
#++++++++++    jimmy added      ++++++++++++++++++
loadmodule "/usr/local/lib/ser/modules/textops.so"
loadmodule "/usr/local/lib/ser/modules/nathelper.so"
#----------------------------------------------------
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
#loadmodule "/usr/local/lib/ser/modules/auth.so"
#loadmodule "/usr/local/lib/ser/modules/auth_db.so"

# ----------------- setting module-specific parameters ---------------

#++++++++++    jimmy added      ++++++++++++++++++
#we will you flag 6 to mark NATed contacts
modparam("registrar","nat_flag",6)
#Enable NAT pinging
modparam("nathelper","natping_interval",3)
#ping only contacts that are known to be behind NAT
modparam("nathelper","ping_nated_only",1)
#----------------------------------------------------

# -- usrloc params --

modparam("usrloc", "db_mode",   0)

# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
#modparam("usrloc", "db_mode", 2)

# -- auth params --
# Uncomment if you are using auth module
#
#modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
#modparam("auth_db", "password_column", "password")

# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)

# -------------------------  request routing logic -------------------

# main routing logic

route{

#++++++++++    jimmy added      ++++++++++++++++++
 if(nat_uac_test("3"))
 {
  if((method == "REGISTER") || !(search("^Record-Route:")))
  {
   log("LOG:Someone trying to register from private IP, rewriting\n");

   fix_nated_contact();
   if(method == "INVITE")
   {
#+++++
log("+++++++++++++++++++++++++++++++++++++\n");
log("method==invite , so fix+nated_sdp\n");
log("+++++++++++++++++++++++++++++++++++++\n");

#-----
    fix_nated_sdp("1");
   };
   force_rport();
   setflag(6);
  };
 };
#----------------------------------------------------
 # initial sanity checks -- messages with
 # max_forwards==0, or excessively long requests
 if (!mf_process_maxfwd_header("10")) {
  sl_send_reply("483","Too Many Hops");
  break;
 };
 if ( msg:len > max_len ) {
  sl_send_reply("513", "Message too big");
  break;
 };

 # we record-route all messages -- to make sure that
 # subsequent messages will go through our proxy; that's
 # particularly good if upstream and downstream entities
 # use different transport protocol
 record_route();
 # loose-route processing
 if (loose_route()) {
  t_relay();
  break;
 };

 # if the request is for other domain use UsrLoc
 # (in case, it does not work, use the following command
 # with proper names and addresses in it)
 if (uri==myself) {

  if (method=="REGISTER") {

# Uncomment this if you want to use digest authentication
#   if (!www_authorize("iptel.org", "subscriber")) {
#    www_challenge("iptel.org", "0");
#    break;
#   };

   save("location");
   break;
  };

  # native SIP destinations are handled using our USRLOC DB
  if (!lookup("location")) {
   sl_send_reply("404", "Not Found");
   break;
  };
 };
 # forward to current uri now; use stateful forwarding; that
 # works reliably even if we forward from TCP to UDP
 if (!t_relay()) {
  sl_reply_error();
 };

}


#++++++++++    jimmy added      +++++++++++++++++++++
route[1]
{
 if(uri=~"[@:](192\.168\.|10\.|172\.16)" && !search("^Route:"))
 {
  sl_send_reply("479","we don't forward to private IP address");
  break;
 };
 if(isflagset(6))
 {
  force_rtp_proxy();
  t_on_reply("1");
  append_hf("P-Behind-NAT: Yes\r\n");
 }

 if(!t_relay())
 {
  sl_reply_error();
  break;
 }
}

onreply_route[1]
{
 if(status =~ "(183)|2[0-9][0-9]")
 {
  fix_nated_contact();
  force_rtp_proxy();
 };
}
#----------------------------------------------------

============================================================================

thanks
Jimmy





More information about the sr-users mailing list