[SR-Users] Kamailio and rtpengine - client behind NAT

Martin Schiøtz malinux at gmail.com
Thu Apr 23 01:40:17 CEST 2015


Hi

I'm using Kamailio 4.2.4 and rtpengine 4.0.0.0+0~mr4.0.0.0. Kamailio is
configured with sip users that can register. I have also configured a sip
trunk to PSTN. I'm using rtpengine to handle RTP when a client want's to
call to PSTN.

When a user behind NAT wants to make a call to PSTN and sends INVITE, then
the rtpengine gets the SDP info from kamailio and rtppengine creates the
new SDP info to be forwarded to PSTN.

The problem is that when the call is established rtpengine sends RTP to
10.0.0.100 instead of sending RTP to the NAT'ed users public IP 80.71.X.X ?

I thought that "fix_nated_sdp("2")" would do the job before
"rtpengine_offer("asymmetric")" but it dosen't have any effect?

I have included kamailio.cfg, rtpengine logs and ngrep between kamailio and
rtpengine.

Cheers,
Martin





kamailio.cfg
---------------------------------------
#!KAMAILIO

## !define WITH_DEBUG

#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
#!define WITH_NAT
#!define WITH_TLS
#!define WITH_PSTN

#
# Kamailio (OpenSER) SIP Server v3.1 - default configuration script
#     - web: http://www.kamailio.org
#     - git: http://sip-router.org
#
# Direct your questions about this file to: <sr-users at lists.sip-router.org>
#
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
# for an explanation of possible statements, functions and parameters.
#
# Several features can be enabled using '#!define WITH_FEATURE' directives:
#
# *** To run in debug mode:
#     - define WITH_DEBUG
#
# *** To enable mysql:
#     - define WITH_MYSQL
#
# *** To enable authentication execute:
#     - enable mysql
#     - define WITH_AUTH
#     - add users using 'kamctl'
#
# *** To enable IP authentication execute:
#     - enable mysql
#     - enable authentication
#     - define WITH_IPAUTH
#     - add IP addresses with group id '1' to 'address' table
#
# *** To enable persistent user location execute:
#     - enable mysql
#     - define WITH_USRLOCDB
#
# *** To enable presence server execute:
#     - enable mysql
#     - define WITH_PRESENCE
#
# *** To enable nat traversal execute:
#     - define WITH_NAT
#     - install RTPProxy: http://www.rtpproxy.org
#     - start RTPProxy:
#        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
#
# *** To enable PSTN gateway routing execute:
#     - define WITH_PSTN
#     - set the value of pstn.gw_ip
#     - check route[PSTN] for regexp routing condition
#
# *** To enable database aliases lookup execute:
#     - enable mysql
#     - define WITH_ALIASDB
#
# *** To enable multi-domain support execute:
#     - enable mysql
#     - define WITH_MULTIDOMAIN
#
# *** To enable TLS support execute:
#     - adjust CFGDIR/tls.cfg as needed
#     - define WITH_TLS
#
# *** To enable XMLRPC support execute:
#     - define WITH_XMLRPC
#     - adjust route[XMLRPC] for access policy
#
# *** To enable anti-flood detection execute:
#     - adjust pike and htable=>ipban settings as needed (default is
#       block if more than 16 requests in 2 seconds and ban for 300 seconds)
#     - define WITH_ANTIFLOOD
#
# *** To enhance accounting execute:
#     - enable mysql
#     - define WITH_ACCDB
#     - add following columns to database
#!ifdef ACCDB_COMMENT
  ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
  ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT
'';
  ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL
DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL
DEFAULT '';
  ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT
'';
  ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL
DEFAULT '';
#!endif

####### Defined Values #########

# *** Value defines - IDs used later in config
#!ifdef WITH_MYSQL
# - database URL - used to connect to database server by modules such
#       as: auth_db, acc, usrloc, a.s.o.
#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
#!endif
#!ifdef WITH_MULTIDOMAIN
# - the value for 'use_domain' parameters
#!define MULTIDOMAIN 1
#!else
#!define MULTIDOMAIN 0
#!endif

# - flags
#   FLT_ - per transaction (message) flags
# FLB_ - per branch flags
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_NATS 5

#!define FLB_NATB 6
#!define FLB_NATSIPPING 7

####### Global Parameters #########

#!ifdef WITH_DEBUG
debug=4
log_stderror=yes
#!else
debug=2
log_stderror=no
#!endif

memdbg=5
memlog=5

log_facility=LOG_LOCAL0

fork=yes
children=4

/* uncomment the next line to disable TCP (default on) */
#disable_tcp=yes

/* uncomment the next line to disable the auto discovery of local aliases
   based on reverse DNS on IPs (default on) */
#auto_aliases=no

/* add local domain aliases */
#alias="sip.mydomain.com"

/* uncomment and configure the following line if you want Kamailio to
   bind on a specific interface/port/proto (default bind on all available)
*/
#listen=udp:10.0.0.10:5060

/* port to listen to
 * - can be specified more than once if needed to listen on many ports */
port=5060

#!ifdef WITH_TLS
enable_tls=yes
#!endif

tcp_connection_lifetime=3605

####### Custom Parameters #########

# These parameters can be modified runtime via RPC interface
# - see the documentation of 'cfg_rpc' module.
#
# Format: group.id = value 'desc' description
# Access: $sel(cfg_get.group.id) or @cfg_get.group.id
#

#!ifdef WITH_PSTN
# PSTN GW Routing
#
# - pstn.gw_ip: valid IP or hostname as string value, example:
# pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
#
# - by default is empty to avoid misrouting
pstn.gw_ip = "trunk.testconnect.dk" desc "PSTN GW Address"
#!endif


####### Modules Section ########

# set paths to location of modules
#!ifdef LOCAL_TEST_RUN
mpath="modules"
#!else
mpath="/usr/lib/x86_64-linux-gnu/kamailio/modules/"
#!endif

#!ifdef WITH_MYSQL
loadmodule "db_mysql.so"
#!endif

loadmodule "mi_fifo.so"
loadmodule "kex.so"
loadmodule "tm.so"
loadmodule "tmx.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "mi_rpc.so"
loadmodule "acc.so"
# loadmodule "rtpengine.so"

#!ifdef WITH_AUTH
loadmodule "auth.so"
loadmodule "auth_db.so"
#!ifdef WITH_IPAUTH
loadmodule "permissions.so"
#!endif
#!endif

#!ifdef WITH_ALIASDB
loadmodule "alias_db.so"
#!endif

#!ifdef WITH_MULTIDOMAIN
loadmodule "domain.so"
#!endif

#!ifdef WITH_PRESENCE
loadmodule "presence.so"
loadmodule "presence_xml.so"
#!endif

#!ifdef WITH_NAT
loadmodule "nathelper.so"
# loadmodule "rtpproxy.so"
loadmodule "rtpengine.so"
loadmodule "path.so"
#!endif

#!ifdef WITH_TLS
loadmodule "tls.so"
#!endif

#!ifdef WITH_ANTIFLOOD
loadmodule "htable.so"
loadmodule "pike.so"
#!endif

#!ifdef WITH_XMLRPC
loadmodule "xmlrpc.so"
#!endif

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


# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")


# ----- tm params -----
# auto-discard branches from previous serial forking leg
modparam("tm", "failure_reply_mode", 3)
# default retransmission timeout: 30sec
modparam("tm", "fr_timer", 30000)
# default invite retransmission timeout after 1xx: 120sec
modparam("tm", "fr_inv_timer", 120000)


# ----- rr params -----
# add value to ;lr param to cope with most of the UAs
modparam("rr", "enable_full_lr", 1)
# do not append from tag to the RR (no need for this script)
modparam("rr", "append_fromtag", 0)


# ----- registrar params -----
modparam("registrar", "method_filtering", 1)
/* uncomment the next line to disable parallel forking via location */
# modparam("registrar", "append_branches", 0)
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)


# ----- acc params -----
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_ack", 0)
modparam("acc", "report_cancels", 0)
/* by default ww do not adjust the direct of the sequential requests.
   if you enable this parameter, be sure the enable "append_fromtag"
   in "rr" module */
modparam("acc", "detect_direction", 0)
/* account triggers (flags) */
modparam("acc", "log_flag", FLT_ACC)
modparam("acc", "log_missed_flag", FLT_ACCMISSED)
modparam("acc", "log_extra",
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
/* enhanced DB accounting */
#!ifdef WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC)
modparam("acc", "db_missed_flag", FLT_ACCMISSED)
modparam("acc", "db_url", DBURL)
modparam("acc", "db_extra",
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
#!endif


# ----- usrloc params -----
/* enable DB persistency for location entries */
#!ifdef WITH_USRLOCDB
modparam("usrloc", "db_url", DBURL)
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "use_domain", MULTIDOMAIN)
#!endif


# ----- auth_db params -----
#!ifdef WITH_AUTH
modparam("auth_db", "db_url", DBURL)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")
modparam("auth_db", "use_domain", MULTIDOMAIN)

# ----- permissions params -----
#!ifdef WITH_IPAUTH
modparam("permissions", "db_url", DBURL)
modparam("permissions", "db_mode", 1)
#!endif

#!endif


# ----- alias_db params -----
#!ifdef WITH_ALIASDB
modparam("alias_db", "db_url", DBURL)
modparam("alias_db", "use_domain", MULTIDOMAIN)
#!endif


# ----- domain params -----
#!ifdef WITH_MULTIDOMAIN
modparam("domain", "db_url", DBURL)
# use caching
modparam("domain", "db_mode", 1)
# register callback to match myself condition with domains list
modparam("domain", "register_myself", 1)
#!endif


#!ifdef WITH_PRESENCE
# ----- presence params -----
modparam("presence", "db_url", DBURL)

# ----- presence_xml params -----
modparam("presence_xml", "db_url", DBURL)
modparam("presence_xml", "force_active", 1)
#!endif


#!ifdef WITH_NAT
# ----- rtpproxy params -----
# modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
# modparam("rtpproxy", "rtpproxy_sock",
"unix:/var/run/rtpproxy/rtpproxy.sock")

# single rtproxy
#modparam("rtpengine", "rtpengine_disable_tout", -1)
#modparam("rtpengine", "rtpengine_sock", "udp:localhost:12222")
modparam("rtpengine", "rtpengine_sock", "udp:localhost:22222")
modparam("path", "use_received", 1);

# ----- nathelper params -----
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
modparam("nathelper", "sipping_from", "sip:pinger at kamailio.org")

# params needed for NAT traversal in other modules
modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
modparam("usrloc", "nat_bflag", FLB_NATB)
#!endif


#!ifdef WITH_TLS
# ----- tls params -----
modparam("tls", "config", "/etc/kamailio/tls.cfg")
#!endif

#!ifdef WITH_ANTIFLOOD
# ----- pike params -----
modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 16)
modparam("pike", "remove_latency", 4)

# ----- htable params -----
# ip ban htable with autoexpire after 5 minutes
modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
#!endif

#!ifdef WITH_XMLRPC
# ----- xmlrpc params -----
modparam("xmlrpc", "route", "XMLRPC");
modparam("xmlrpc", "url_match", "^/RPC")
#!endif

####### Routing Logic ########


# Main SIP request routing logic
# - processing of any incoming SIP request starts with this route
route {

if($rU=~"^\+[1-9][0-9]{3,20}$") {
xlog("L_INFO", "MS: BEFORE STRIP $rm from $fu:$sp) to $ru\n");
strip(3);
xlog("L_INFO", "MS: AFTER STRIP $rm from $fu:$sp) to $ru\n");
} else if($rU=~"^00[1-9][0-9]{3,20}$") {
xlog("L_INFO", "MS: BEFORE STRIP $rm from $fu:$sp) to $ru\n");
strip(4);
xlog("L_INFO", "MS: AFTER STRIP $rm from $fu:$sp) to $ru\n");
}

xlog("L_INFO", "MS: BEFORE REQINIT $rm from $fu:$sp) to $ru\n");

# per request initial checks
route(REQINIT);

xlog("L_INFO", "MS: AFTER REQINIT $rm from $fu:$sp) to $ru\n");

# NAT detection
route(NAT);

xlog("L_INFO", "MS: AFTER NAT $rm from $fu:$sp) to $ru\n");

# handle requests within SIP dialogs
route(WITHINDLG);

xlog("L_INFO", "MS: AFTER WITHINDLG $rm from $fu:$sp) to $ru\n");

### only initial requests (no To tag)

# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}

t_check_trans();

# authentication
route(AUTH);

# record routing for dialog forming requests (in case they are routed)
# - remove preloaded route headers
remove_hf("Route");
if (is_method("INVITE|SUBSCRIBE"))
record_route();

# account only INVITEs
if (is_method("INVITE"))
{
setflag(FLT_ACC); # do accounting
}

# dispatch requests to foreign domains
route(SIPOUT);

### requests for my local domains

# handle presence related requests
route(PRESENCE);

xlog("L_INFO", "MS: AFTER PRESENCE $rm from $fu:$sp) to $ru\n");

# handle registrations
route(REGISTRAR);

xlog("L_INFO", "MS: AFTER REGISTRAR $rm from $fu:$sp) to $ru\n");

if ($rU==$null)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}

xlog("L_INFO", "MS: BEFORE PSTN $rm from $fu:$sp) to $ru\n");

# dispatch destinations to PSTN
route(PSTN);

xlog("L_INFO", "MS: AFTER PSTN $rm from $fu:$sp) to $ru\n");

# user location service
route(LOCATION);

route(RELAY);
}


route[RELAY] {
#!ifdef WITH_NAT
if (check_route_param("nat=yes")) {
setbflag(FLB_NATB);
}
if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {
xlog("L_INFO", "MS: RELAY NAT RTPPROXY $rm from $fu:$sp) to $ru\n");
route(RTPPROXY);
}
#!endif

#if (!isflagset(FLT_NATS) && !isbflagset(FLB_NATB) && is_method("INVITE")) {
# xlog("L_INFO", "MS: RELAY ALWAYS RTPPROXY $rm from $fu:$sp) to $ru\n");
# route(RTPPROXY);
#}

#rtpengine_manage();

/* example how to enable some additional event routes */
if (is_method("INVITE")) {
#t_on_branch("BRANCH_ONE");
t_on_reply("REPLY_ONE");
t_on_failure("FAIL_ONE");
}

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

# Per SIP request initial checks
route[REQINIT] {
#!ifdef WITH_ANTIFLOOD
# flood dection from same IP and traffic ban for a while
# be sure you exclude checking trusted peers, such as pstn gateways
# - local host excluded (e.g., loop to self)
if(src_ip!=myself)
{
if($sht(ipban=>$si)!=$null)
{
# ip is already blocked
xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
exit;
}
if (!pike_check_req())
{
xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
$sht(ipban=>$si) = 1;
exit;
}
}
#!endif

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

if(!sanity_check("1511", "7"))
{
xlog("Malformed SIP message from $si:$sp\n");
exit;
}
}

# Handle requests within SIP dialogs
route[WITHINDLG] {
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if (is_method("BYE")) {
setflag(FLT_ACC); # do accounting ...
setflag(FLT_ACCFAILED); # ... even if the transaction fails
}
route(RELAY);
} else {
if (is_method("SUBSCRIBE") && uri == myself) {
# in-dialog subscribe requests
route(PRESENCE);
exit;
}
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
# no loose-route, but stateful ACK;
# must be an ACK after a 487
# or e.g. 404 from upstream server
t_relay();
exit;
} else {
# ACK without matching transaction ... ignore and discard
exit;
}
}
xlog("L_INFO", "MS: route[WITHINDLG] 404 $rm from $fu:$sp) to $ru\n");
sl_send_reply("404","Not here");
}
exit;
}
}

# Handle SIP registrations
route[REGISTRAR] {
if (is_method("REGISTER"))
{
if(isflagset(FLT_NATS))
{
setbflag(FLB_NATB);
# uncomment next line to do SIP NAT pinging
## setbflag(FLB_NATSIPPING);
}
if (!save("location"))
sl_reply_error();

exit;
}
}

# USER location service
route[LOCATION] {

#!ifdef WITH_ALIASDB
# search in DB-based aliases
alias_db_lookup("dbaliases");
#!endif

if (!lookup("location")) {
switch ($rc) {
case -1:
case -3:
t_newtran();
xlog("L_INFO", "MS: LOCATION 404 $rm from $fu:$sp) to $ru\n");
t_reply("404", "Not Found");
exit;
case -2:
sl_send_reply("405", "Method Not Allowed");
exit;
}
}

# when routing via usrloc, log the missed calls also
if (is_method("INVITE"))
{
setflag(FLT_ACCMISSED);
}
}

# Presence server route
route[PRESENCE] {
if(!is_method("PUBLISH|SUBSCRIBE"))
return;

#!ifdef WITH_PRESENCE
if (!t_newtran())
{
sl_reply_error();
exit;
};

if(is_method("PUBLISH"))
{
handle_publish();
t_release();
}
else
if( is_method("SUBSCRIBE"))
{
handle_subscribe();
t_release();
}
exit;
#!endif
 # if presence enabled, this part will not be executed
if (is_method("PUBLISH") || $rU==$null)
{
sl_send_reply("404", "Not here");
exit;
}
return;
}

# Authentication route
route[AUTH] {
#!ifdef WITH_AUTH
if (is_method("REGISTER"))
{
# authenticate the REGISTER requests (uncomment to enable auth)
if (!www_authorize("$td", "subscriber"))
{
www_challenge("$td", "0");
exit;
}

if ($au!=$tU)
{
sl_send_reply("403","Forbidden auth ID");
exit;
}
} else {

#!ifdef WITH_IPAUTH
if(allow_source_address())
{
# source IP allowed
return;
}
#!endif

# authenticate if from local subscriber
if (from_uri==myself)
{
if (!proxy_authorize("$fd", "subscriber")) {
proxy_challenge("$fd", "0");
exit;
}
if (is_method("PUBLISH"))
{
if ($au!=$tU) {
sl_send_reply("403","Forbidden auth ID");
exit;
}
} else {
if ($au!=$fU) {
sl_send_reply("403","Forbidden auth ID");
exit;
}
}

consume_credentials();
# caller authenticated
} else {
# caller is not local subscriber, then check if it calls
# a local destination, otherwise deny, not an open relay here
if (!uri==myself)
{
sl_send_reply("403","Not relaying");
exit;
}
}
}
#!endif
return;
}

# Caller NAT detection route
route[NAT] {
#!ifdef WITH_NAT
force_rport();
setflag(FLT_NATS);
if (nat_uac_test("19")) {
if (method=="REGISTER") {
fix_nated_register();
} else {
fix_nated_contact();
}
if (method=="INVITE" && has_body("application/sdp")) {
xlog("L_INFO", "MS: fix_nated_sdp $rm from $fu:$sp) to $ru\n");
#fix_nated_sdp("11");
#fix_nated_sdp("2");
#fix_nated_sdp("8");
}
setflag(FLT_NATS);
}
#!endif
return;
}

# RTPProxy control
route[RTPPROXY] {
#!ifdef WITH_NAT
if (is_method("BYE")) {
## unforce_rtp_proxy();
rtpengine_delete();
} else if (is_method("INVITE")){
# force_rtp_proxy();
## rtpproxy_offer();
#rtpengine_manage();
rtpengine_offer("asymmetric");
}

if (!has_totag()) add_rr_param(";nat=yes");
#!endif
return;
}

# Routing to foreign domains
route[SIPOUT] {
if (!uri==myself)
{
append_hf("P-hint: outbound\r\n");
route(RELAY);
}
}

# PSTN GW routing
route[PSTN] {
#!ifdef WITH_PSTN
# check if PSTN GW IP is defined
if (strempty($sel(cfg_get.pstn.gw_ip))) {
xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
return;
}

# route to PSTN dialed numbers starting with '+' or '00'
#     (international format)
# - update the condition to match your dialing rules for PSTN routing
#if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) {
# xlog("L_INFO", "MS: PSTN not international $rm from $fu:$sp) to $ru\n");
# xlog("L_INFO", "MS: PSTN not international rU=$rU\n");
# return;
#}
xlog("L_INFO", "MS: PSTN check myself $rm from $fu:$sp) to $rU\n");
if($rU=~"^201111[0-9][0-9]$") {
xlog("L_INFO", "MS: PSTN to myself $rm from $fu:$sp) to $ru\n");
return;
}

# only local users allowed to call
if(from_uri!=myself) {
xlog("L_INFO", "MS: PSTN 403 $rm from $fu:$sp) to $ru\n");
sl_send_reply("403", "Not Allowed");
exit;
}

#if (is_method("INVITE")) {
# rtpproxy_offer();
#}

xlog("L_INFO", "MS: PSTN before rewrite $rm from $fu:$sp) to $ru\n");
$ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
xlog("L_INFO", "MS: PSTN before rewrite $rm from $fu:$sp) to $ru\n");

route(RELAY);
exit;
#!endif

return;
}

# XMLRPC routing
#!ifdef WITH_XMLRPC
route[XMLRPC]
{
# allow XMLRPC from localhost
if ((method=="POST" || method=="GET")
&& (src_ip==127.0.0.1)) {
# close connection only for xmlrpclib user agents (there is a bug in
# xmlrpclib: it waits for EOF before interpreting the response).
if ($hdr(User-Agent) =~ "xmlrpclib")
set_reply_close();
set_reply_no_connect();
dispatch_rpc();
exit;
}
send_reply("403", "Forbidden");
exit;
}
#!endif

# Sample branch router
branch_route[BRANCH_ONE] {
xdbg("new branch at $ru\n");
}

# Sample onreply route
onreply_route[REPLY_ONE] {
xdbg("incoming reply\n");
#!ifdef WITH_NAT
if ((isflagset(FLT_NATS) || isbflagset(FLB_NATB))
&& status=~"(183)|(2[0-9][0-9])") {
# force_rtp_proxy();
## rtpproxy_answer();
rtpengine_answer("asymmetric");
}
if (isbflagset("6")) {
fix_nated_contact();
}
#!endif
}

# Sample failure route
failure_route[FAIL_ONE] {
#!ifdef WITH_NAT
if (is_method("INVITE")
&& (isbflagset(FLB_NATB) || isflagset(FLT_NATS))) {
#unforce_rtp_proxy();
rtpengine_delete();
}
#!endif

if (t_is_canceled()) {
exit;
}

# uncomment the following lines if you want to block client
# redirect based on 3xx replies.
##if (t_check_status("3[0-9][0-9]")) {
##t_reply("404","Not found");
## exit;
##}

# uncomment the following lines if you want to redirect the failed
# calls to a different new destination
##if (t_check_status("486|408")) {
## sethostport("192.168.2.100:5060");
## append_branch();
## # do not set the missed call flag again
## t_relay();
##}
}
---------------------------------------


rtpengine logs -  rtpengine offer
---------------------------------------
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Received command 'offer'
from 127.0.0.1:56696
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Dump for 'offer' from
127.0.0.1:56696: { "sdp": "v=0#015#012o=20111101-jitsi.org 0 0 IN IP4
10.0.0.100#015#012s=-#015#012c=IN IP4 10.0.0.100#015#012t=0
0#015#012m=audio 5034 RTP/AVP 0 101#015#012a=rtpmap:0
PCMU/8000#015#012a=rtpmap:101 telephone-event/8000#015#012a=extmap:1
urn:ietf:params:rtp-hdrext:csrc-audio-level#015#012a=extmap:2
urn:ietf:params:rtp-hdrext:ssrc-audio-level#015#012a=rtcp-xr:voip-metrics#015#012",
"flags": [ "asymmetric" ], "call-id":
"1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0",
"received-from": [ "IP4", "80.71.X.X" ], "from-tag" ...
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] ... : "6bb9cb39",
"command": "offer" }
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Creating new call
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Opened ports
10728..10729 for media relay
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Opened ports
10746..10747 for media relay
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Shutting down ICE agent
(nothing to do)
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Replying to 'offer' from
127.0.0.1:56696
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Response dump for
'offer' to 127.0.0.1:56696: { "sdp": "v=0#015#012o=20111101-jitsi.org 0 0
IN IP4 10.0.0.100#015#012s=-#015#012c=IN IP4 188.166.X.X#015#012t=0
0#015#012m=audio 10728 RTP/AVP 0 101#015#012a=rtpmap:0
PCMU/8000#015#012a=rtpmap:101
telephone-event/8000#015#012a=rtcp-xr:voip-metrics#015#012a=sendrecv#015#012a=rtcp:10729#015#012a=ice-ufrag:LA1hlEBj#015#012a=ice-pwd:S99AwTSnHtaGnaeCv0DL795QH7#015#012a=candidate:rPBAvp2vmOwOv6BS
1 UDP 2130706431 188.166.X.X 10728 typ
host#015#012a=candidate:rPBAvp2vmOwOv6BS 2 UDP 2130706430 188.166.X.X 10729
typ host#015#012", "result": " ...
Apr 23 00:52:30 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] ... ok" }

rtpengine logs -  rtpengine delete
---------------------------------------
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Call branch '6bb9cb39'
deleted, no more branches remaining
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] Final packet stats:
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] --- Tag 'gK04ca43fa',
created 0:46 ago, in dialogue with '6bb9cb39'
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] ------ Media #1 (audio
over RTP/AVP) using PCMU/8000
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] --------- Port 10728 <>
188.226.X.X:10146, 544 p, 93568 b, 0 e, 1429743164 last_packet
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] --------- Port 10729 <>
188.226.X.X:10147 (RTCP), 0 p, 0 b, 0 e, 1429743150 last_packet
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] --- Tag '6bb9cb39',
created 0:46 ago, in dialogue with 'gK04ca43fa'
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] ------ Media #1 (audio
over RTP/AVP) using PCMU/8000
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] --------- Port 10746 <>
     10.0.0.100:5034 , 595 p, 102340 b, 0 e, 1429743166 last_packet
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
[1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0] --------- Port 10747 <>
     10.0.0.100:5035  (RTCP), 3 p, 228 b, 0 e, 1429743166 last_packet
Apr 23 00:53:16 sipserver-01 rtpengine[27441]:
ci=1040bcc4797199cf13f2820d7e0bea88 at 0:0:0:0:0:0:0:0, created_from=
127.0.0.1:56696, last_signal=1429743164, tos=0,
ml0_start_time=1429743160.638873, ml0_end_time=1429743166.013947,
ml0_duration=5.375074, ml0_termination=REGULAR, ml0_local_tag=gK04ca43fa,
ml0_local_tag_type=FROM_TAG, ml0_remote_tag=6bb9cb39,
ml0_midx1_rtp_endpoint_ip=188.226.X.X, ml0_midx1_rtp_endpoint_port=10146,
ml0_midx1_rtp_local_relay_port=10728, ml0_midx1_rtp_relayed_packets=544,
ml0_midx1_rtp_relayed_bytes=93568, ml0_midx1_rtp_relayed_errors=0,
ml0_midx1_rtp_last_packet=1429743164,
ml0_midx1_rtcp_endpoint_ip=188.226.X.X, ml0_midx1_rtcp_endpoint_port=10147,
ml0_midx1_rtcp_local_relay_port=10729, ml0_midx1_rtcp_relayed_packets=0,
ml0_midx1_rtcp_relayed_bytes=0, ml0_midx1_rtcp_relayed_errors=0,
ml0_midx1_rtcp_last_packet=1429743150, ml1_start_time=1429743164.196879,
ml1_end_time=1429743166.013948, ml1_duration=1.817069,
ml1_termination=REGULAR, ml1_local_tag=6bb9cb39, ml1_local_tag_type=TO_TAG,
ml1_remote_tag=gK04ca43fa, ml1_midx1_rtp_endpoint_ip=10.0.0.100,
ml1_midx1_rtp_endpoint_port=5034, ml1_midx1_rtp_local_relay_port=10746,
ml1_midx1_rtp_relayed_packets=595, ml1_midx1_rtp_relayed_bytes=102340,
ml1_midx1_rtp_relayed_errors=0, ml1_midx1_rtp_last_packet=1429743166,
ml1_midx1_rtcp_endpoint_ip=10.0.0.100, ml1_midx1_rtcp_endpoint_port=5035,
ml1_midx1_rtcp_local_relay_port=10747, ml1_midx1_rtcp_relayed_packets=3,
ml1_midx1_rtcp_relayed_bytes=228, ml1_midx1_rtcp_relayed_errors=0,
ml1_midx1_rtcp_last_packet=1429743166,
--------------------------------


ngrep - SDP send between kamailio and rtpengine:
--------------------------------
U 127.0.0.1:56696 -> 127.0.0.1:22222
10856_6 d3:sdp303:v=0.
o=20111101-jitsi.org 0 0 IN IP4 10.0.0.100.
s=-.
c=IN IP4 10.0.0.100.
t=0 0.
m=audio 5034 RTP/AVP 0 101.
a=rtpmap:0 PCMU/8000.
a=rtpmap:101 telephone-event/8000.
a=extmap:1 urn:ietf:params:rtp-hdrext:csrc-audio-level.
a=extmap:2 urn:ietf:params:rtp-hdrext:ssrc-audio-level.
a=rtcp-xr:voip-metrics.
5:flagsl10:asymmetrice7:call-id48:1040bcc4797199cf13f2820d7e0bea88 at 0
:0:0:0:0:0:0:013:received-froml3:IP413:80.71.X.Xe8:from-tag8:6bb9cb397:command5:offere
#
U 127.0.0.1:22222 -> 127.0.0.1:56696
10856_6 d3:sdp430:v=0.
o=20111101-jitsi.org 0 0 IN IP4 10.0.0.100.
s=-.
c=IN IP4 188.166.X.X.
t=0 0.
m=audio 10728 RTP/AVP 0 101.
a=rtpmap:0 PCMU/8000.
a=rtpmap:101 telephone-event/8000.
a=rtcp-xr:voip-metrics.
a=sendrecv.
a=rtcp:10729.
a=ice-ufrag:LA1hlEBj.
a=ice-pwd:S99AwTSnHtaGnaeCv0DL795QH7.
a=candidate:rPBAvp2vmOwOv6BS 1 UDP 2130706431 188.166.X.X 10728 typ host.
a=candidate:rPBAvp2vmOwOv6BS 2 UDP 2130706430 188.166.X.X 10729 typ host.
6:result2:oke
#
--------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20150423/6c190b19/attachment.html>


More information about the sr-users mailing list