[Users] Mediaproxy newbie

Marnus van Niekerk m at mjvn.net
Wed Oct 18 18:04:20 CEST 2006


Hi,

I am trying to set up openser with mediaproxy (at xx.xx.xx.133) to route 
calls from UA behind NAT to asterisk as voicemail (at xx.xx.xx.134) and 
PSTN gateways (at xx.xx.xx.32)

I can see in the SDP payload that the RTP is being sent from asterisk to 
mediaproxy, but in sessions.py it shows the private ip not the public 
one and I have one way audio.

Can anybody help please.

opnser.cfg below.

Marnus

--

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

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

# ------------------ module loading ----------------------------------
loadmodule "/usr/local/lib/openser/modules/mysql.so"
loadmodule "/usr/local/lib/openser/modules/sl.so"
loadmodule "/usr/local/lib/openser/modules/tm.so"
loadmodule "/usr/local/lib/openser/modules/rr.so"
loadmodule "/usr/local/lib/openser/modules/maxfwd.so"
loadmodule "/usr/local/lib/openser/modules/usrloc.so"
loadmodule "/usr/local/lib/openser/modules/registrar.so"
loadmodule "/usr/local/lib/openser/modules/textops.so"
loadmodule "/usr/local/lib/openser/modules/uri_db.so"
loadmodule "/usr/local/lib/openser/modules/domain.so"
loadmodule "/usr/local/lib/openser/modules/mediaproxy.so"
loadmodule "/usr/local/lib/openser/modules/nathelper.so"

# Logging
loadmodule "/usr/local/lib/openser/modules/xlog.so"

loadmodule "/usr/local/lib/openser/modules/auth.so"
loadmodule "/usr/local/lib/openser/modules/auth_db.so"

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

# -- usrloc params --
modparam("usrloc", "db_mode",   0)

modparam("usrloc", "db_mode", 2)

modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")

modparam("rr", "enable_full_lr", 1)

#tm timeout for voicemail params
modparam("tm", "fr_timer", 3)
modparam("tm", "fr_inv_timer", 35)
modparam("tm", "noisy_ctimer", 1)

# parms for NAT/mediaproxy
modparam("nathelper", "rtpproxy_disable", 1)
modparam("nathelper", "natping_interval", 0)
modparam("mediaproxy", "natping_interval", 30)
modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy.sock")
modparam("mediaproxy", "sip_asymmetrics", 
"/usr/local/etc/openser/sip-clients")
modparam("mediaproxy", "rtp_asymmetrics", 
"/usr/local/etc/openser/rtp-clients")
modparam("registrar", "nat_flag", 6)


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

# main routing logic
route {
        #check for old messages: could mean a problem with the DNS 
entries or some other loop-causer...
        if (!mf_process_maxfwd_header("10"))
        {
                xlog("L_WARN", "WARNING: Too many hops\n");
                sl_send_reply("483", "Too many hops, forward count 
exceeded limit\n");
                return;
        };

        #check for extremely large messages; we don't need a sip dos attack
        if (msg:len >= 2048)
        {
                xlog("L_WARN", "WARNING: Message too large, &>= 2048 
bytes\n");
                sl_send_reply("513", "Message too large, exceeded limit\n");
                return;
        };

        # Track what is happening
        xlog("L_INFO", "SIP Request: method [$rm] from [$fu] to [$tu]\n");

        #record everything besides registers and acks
        if(method!="REGISTER" && method!="ACK")
        {
                setflag(1);
        };

        # Record Route Section
        if (method=="INVITE" && client_nat_test("3"))
        {
                record_route_preset("xx.xx.xx.133:5060;nat=yes");
        }
        else if (method!="REGISTER")
        {
                record_route();
        }

        # Call tear down section
        if (method=="BYE" || method=="CANCEL")
        {
                end_media_session();
        }

        #do not send to voicemail if BYE or CANCEL
        #is used to end call before user pickup or timeout
        if(method=="CANCEL" || method=="BYE")
        {
                setflag(10);
        };

        #grant route if route headers already present
        if (loose_route())
        {
                # May need client_nat_test & use_media_proxy here...
                route(1);
                return;
        };

        #Always require authentication, which could result in a PSTN
        if (method=="REGISTER")
        {

                if (!search("^Contact:[ ]*\*") && client_nat_test("7"))
                {
                        setflag(6);
                        fix_nated_register();
                        force_rport();
                };

                if(!www_authorize("domain.tld", "subscriber"))
                {
                        www_challenge("domain.tld", "0");
                        return;
                }
                else
                {
                        if (!check_to())
                        {
                                sl_send_reply("401", "Unauthorized");
                                return;
                        };

                        #Save into user database, used below when 
checking if user is available
                        xlog("L_INFO", "REGISTER: User $fu Authenticated 
Correctly\n");
                        save("location");
                        return;
                };
        };

        if (method=="INVITE")
        {
                if (client_nat_test("3"))
                {
                        setflag(7);
                        force_rport();
                        fix_nated_contact();
                };

                if(uri=~"sip:\*86 at .*")
                {
                        #authorize if a call is going to VM
                        if(!proxy_authorize("domain.tld", "subscriber"))
                        {
                                proxy_challenge("domain.tld", "0");
                                return;
                        };

                        xlog("L_INFO", "CALL: Call from $fu to check 
voicemail\n");
                        rewritehostport("vm.domain.tld:5060");
                }
                else
                {
                        if (does_uri_exist())
                        {
                                #Call is to sip client, so do nothing 
but route
                                xlog("L_INFO", "CALL: Sip client\n");
                                if (!lookup("location"))
                                {
                                         sl_send_reply("404", "Not Found");
                                         xlog("L_ERROR", "ERROR: User 
$tu Not Found\n");
                                         return;
                                };
                        }
                        else
                        {
                                #authorize if a call is going to PSTN
                                if(!proxy_authorize("domain.tld", 
"subscriber"))
                                {
                                         proxy_challenge("domain.tld", "0");
                                         return;
                                };

                                #Call destination is PSTN, so send it to 
the gateway
                                xlog("L_INFO", "CALL: PSTN $tu from $fu 
\n");
                                rewritehostport("ast1.domain.tld:5060");
                        };
                };

                #Make sure that all subsequent requests go through us;
                #done at the top already
                #record_route();
        }
        else
        {
                if (does_uri_exist())
                {
                        #Call is to sip client, so do nothing but route
                        xlog("L_INFO", "CALL: Sip client\n");
                        if (!lookup("location"))
                        {
                                sl_send_reply("404", "Not Found");
                                xlog("L_ERROR", "ERROR: User $tu Not 
Found\n");
                                return;
                        };
                }
                else
                {
                        #Call destination is PSTN, so send it to the gateway
                        xlog("L_INFO", "CALL: PSTN $tu from $fu \n");
                        rewritehostport("ast1.domain.tld:5060");
                };
                #record_route();
        };

        #ALL PROCESSING IS DONE, SO ROUTE
        route(4);
        route(1);
}

route[1]
{
        #send the call outward
        if(method=="INVITE" && !isflagset(10))
        {
                t_on_failure("2");   # voicemail if failure
        };

        if (!t_relay())
        {
                xlog("L_WARN", "ERROR: t_relay failed");
                sl_reply_error();
        };
}

# -----------------------------------------------------------------
# NAT Traversal Section
# -----------------------------------------------------------------
route[4]
{
        if (isflagset(6) || isflagset(7))
        {
                if (!isflagset(8))
                {
                        setflag(8);
                        use_media_proxy();
                };
        };
}

failure_route[2]
{
        if(!t_was_cancelled() && !t_check_status("407"))
        {
                revert_uri();
                rewritehostport("vm.domain.tld:5060");
                append_branch();
                #PREVENT SOME CRAZY VOICEMAIL LOOP
                xlog("L_INFO", "INFO: CALL TO VOICEMAIL");
                setflag(10);
                route(1);
        }
}

onreply_route[1]
{
        if ((isflagset(6) || isflagset(7)) && 
(status=~"(180)|(183)|2[0-9][0-9]"))
        {
                if (!search("^Content-Length:[ ]*0"))
                {
                        use_media_proxy();
                };
        };

        if (client_nat_test("1"))
        {
                fix_nated_contact();
        };
}

-- 

"Opportunity is missed by most people because it is
dressed in overalls and looks like work."

Thomas Alva Edison - Inventor of 1093 patents,
including the light bulb, phonogram and motion pictures.





More information about the Users mailing list