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