[SR-Users] question about reply route

Iván Aponte ivan.aponte at gmail.com
Sat Jun 29 04:26:34 CEST 2019


Hello,

I have a question about record route and via headers. My scenario is
the following:

[asterisk] ---- [kam] -------- [trunk]
10.142.0.27     10.142.0.6    200.x.x.x

I have an asterisk an a kamailio in a private ip network
(10.142.0.0/24). Kamailio has the address 10.142.0.6 but is also
natted 1:1 to a public ip (35.0.0.6).

My problem is that when the invite are replied the asterisk replies to
 the external  ip (35.0.0.6) instead of the internal ip (even though
the kamailio replies goes through the internal network) . I tried
adding  a reply route to change the advertised address to no avail.
any advice would be appreciated.


this is my conf:

LISTEN="listen=udp:0.0.0.0:5060 advertise 35.0.0.6:5060"
disable_tcp=yes
loadmodule "jsonrpcs.so"
loadmodule "kex.so"
loadmodule "corex.so"
loadmodule "tm.so"
loadmodule "tmx.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "cfg_rpc.so"
loadmodule "acc.so"
loadmodule "counters.so"
loadmodule "permissions.so"
loadmodule "ipops.so"

modparam("jsonrpcs", "pretty_format", 1)
modparam("tm", "failure_reply_mode", 3)
modparam("tm", "fr_timer", 30000)
modparam("tm", "fr_inv_timer", 120000)

modparam("rr", "enable_full_lr", 0)
modparam("rr", "append_fromtag", 0)

reply_route {
   xinfo("source $si");
    if(!is_in_subnet($si, "10.0.0.0/8")) {
     set_advertised_address("10.142.0.6");
   }
   else {
     xinfo("not in subnet");
   }
}


request_route {

# per request initial checks
route(REQINIT);
# CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans()) {
route(RELAY);
}
exit;
}

# handle retransmissions
if (!is_method("ACK")) {
if(t_precheck_trans()) {
t_check_trans();
exit;
}
t_check_trans();
}

# handle requests within SIP dialogs
route(WITHINDLG);

### only initial requests (no To tag)

# 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();
}


# dispatch requests to foreign domains
route(SIPOUT);

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

}

# Wrapper for relaying requests
route[RELAY] {
if (!t_relay()) {
sl_reply_error();
}
exit;
}

# Per SIP request initial checks
route[REQINIT] {
if($ua =~ "friendly-scanner|sipcli|VaxSIPUserAgent") {
# silent drop for scanners - uncomment next line if want to reply
# sl_send_reply("200", "OK");
exit;
}

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

if(is_method("OPTIONS") && uri==myself && $rU==$null) {
sl_send_reply("200","Keepalive");
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()) return;

# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if ( is_method("NOTIFY") ) {
record_route();
}
route(RELAY);
exit;
}

if (is_method("SUBSCRIBE") && uri == myself) {
send_reply("405", "Method Not Allowed");
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
route(RELAY);
exit;
} else {
# ACK without matching transaction ... ignore and discard
exit;
}
}
sl_send_reply("404","Not here");
exit;
}
route[SIPOUT] {
if (uri==myself) return;
append_hf("P-hint: outbound\r\n");
route(RELAY);
exit;
}




-- 
Iván Aponte
Office: +58(212)9923193
Mobile: +58(412)2774713



More information about the sr-users mailing list