From 0d93ba61d56944e243abebfd954e801679eb6ac5 Mon Sep 17 00:00:00 2001 From: lazedo Date: Thu, 7 Mar 2019 15:04:26 +0000 Subject: [PATCH] nat with loop --- kamailio/default.cfg | 25 +++++++++++++++++++-- kamailio/presence-nat.cfg | 43 +++++++++++++++++++++++++------------ kamailio/presence-role.cfg | 1 - kamailio/sip_trace-role.cfg | 4 ++++ 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 52e8bcd..e8dd78c 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -13,6 +13,7 @@ #!trydef FLT_T38 10 #!trydef FLT_NATS 11 #!trydef FLAG_LOCAL_REQUEST 12 +#!trydef FLAG_LOCAL_ROUTE 17 ####### Global Parameters ######### fork = yes @@ -309,9 +310,15 @@ loadmodule "permissions.so" modparam("permissions", "db_url", "KAZOO_DB_URL") modparam("permissions", "db_mode", 1) +###### local route ###### +tcp_children = 5 +listen=tcp:127.0.0.1:5090 + ####### Routing Logic ######## route { + route(LOCAL_REQUEST); + route(SANITY_CHECK); route(CHECK_RETRANS); @@ -889,14 +896,16 @@ onsend_route { xlog("L_INFO", "$ci|log|associate traffic from $var(user_source) with media server sip:$sndto(ip):$sndto(port)\n"); $sht(associations=>$var(user_source))= "sip:" + $sndto(ip) + ":" + $sndto(port); } - + #!ifdef SIP_TRACE_ROLE if (is_method("ACK") && isflagset(FLAG_SIP_TRACE)) { sip_trace(); } #!endif - xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)\n"); + if(!isflagset(FLAG_LOCAL_ROUTE)) { + xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)\n"); + } } route[ROUTE_TO_AOR] @@ -957,5 +966,17 @@ event_route[evrexec:DEFERRED_INIT] } +route[LOCAL_REQUEST] +{ + if(src_ip != myself || $hdr(X-TM-Local) == $null) { + return; + } + xlog("L_DEBUG", "internal route $hdr(X-TM-Local)\n"); + $var(LocalRoute) = $hdr(X-TM-Local); + remove_hf_re("^X-TM-Local"); + route_if_exists("$var(LocalRoute)"); + exit; +} + # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/presence-nat.cfg b/kamailio/presence-nat.cfg index e3913bf..7932c2a 100644 --- a/kamailio/presence-nat.cfg +++ b/kamailio/presence-nat.cfg @@ -79,37 +79,52 @@ route[PRESENCE_NAT_PING] { $var(CallId) = $uuid(g); xlog("L_DEBUG", "$var(CallId)|$rtimer_worker|timer|SENDING PING FROM $(xavp(ra=>local_contact){uri.tosocket}) TO => $xavp(ra=>contact)\n"); - t_uac_send("OPTIONS", "$xavp(ra=>contact)", "", "$(xavp(ra=>local_contact){uri.tosocket})", "CSeq: 1 OPTIONS\r\nFrom: PRESENCE_NAT_S_FROM_URI\r\nTo: $xavp(ra=>contact);nat_id=$xavp(ra=>id)\r\nContact: <$xavp(ra=>local_contact)>\r\nCall-ID: $var(CallId)\r\n", ""); + + $uac_req(method)="OPTIONS"; + $uac_req(hdrs) = "X-TM-Local: PRESENCE_ROUTE_NAT_PING\r\nX-TM-Contact: " + $xavp(ra=>local_contact) + "\r\n"; + $uac_req(turi) = $xavp(ra=>contact); + $uac_req(ruri) = $xavp(ra=>contact); + $uac_req(furi) = $_s(PRESENCE_NAT_S_FROM_URI;nat_id=$xavp(ra=>id)); + $uac_req(ouri) = "sip:127.0.0.1:5090;transport=tcp"; + $uac_req(callid) = $var(CallId); + uac_req_send(); + } onreply_route[PRESENCE_NAT_REPLY] { xlog("L_DEBUG", "$ci|nat|NAT REPLY $(tu{nameaddr.uri})\n"); - $var(Query) = $_s(UPDATE presence_nat SET selected = 0, time_sent = datetime('now') WHERE id = $(tu{uri.param,nat_id});); + $var(Query) = $_s(UPDATE presence_nat SET selected = 0, time_sent = datetime('now') WHERE id = $(fu{uri.param,nat_id});); xlog("L_DEBUG", "$ci|nat|NAT UPDATE SQL => '$var(Query)'\n"); mq_add("presence_last_notity", "$uuid(g)", "$var(Query)"); + t_drop(); } failure_route[PRESENCE_NAT_FAULT] { xlog("L_WARNING", "$ci|nat|received error $T_reply_code $T_reply_reason from $(tu{nameaddr.uri})\n"); - $var(Query) = $_s(DELETE FROM presence_nat WHERE id = $(tu{uri.param,nat_id});); + $var(Query) = $_s(DELETE FROM presence_nat WHERE id = $(fu{uri.param,nat_id});); xlog("L_DEBUG", "$ci|nat|NAT REMOVE SQL => '$var(Query)'\n"); mq_add("presence_last_notity", "$uuid(g)", "$var(Query)"); + t_drop(); } -route[PRESENCE_LOCAL_REQ_NAT] +route[PRESENCE_ROUTE_NAT_PING] { - #!ifdef NAT_TRAVERSAL_ROLE - if($rm == "OPTIONS" && $fu == "PRESENCE_NAT_S_FROM_URI") { - t_on_reply("PRESENCE_NAT_REPLY"); - t_on_failure("PRESENCE_NAT_FAULT"); - t_set_fr(0, PRESENCE_NAT_TIMEOUT); - handle_ruri_alias(); - record_route(); - } - #!endif - return; + $fs = $(hdr(X-TM-Contact){uri.tosocket}); + remove_hf_re("^X-TM-Contact"); + + force_rport(); + handle_ruri_alias(); + record_route(); + xlog("L_DEBUG", "$ci|local|sending nat keepalive from $fu to $ru => $du => $tu\n"); + setflag(FLAG_LOCAL_ROUTE); + + t_on_reply("PRESENCE_NAT_REPLY"); + t_on_failure("PRESENCE_NAT_FAULT"); + t_set_fr(0, PRESENCE_NAT_TIMEOUT); + + t_relay(); } route[PRESENCE_NAT_ON_REGISTRATION] diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index 78e52d3..5f88ede 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -519,7 +519,6 @@ route[PRESENCE_API_BINDINGS] route[PRESENCE_LOCAL_REQUEST] { route(PRESENCE_LOCAL_REQ_NOTIFY); - route(PRESENCE_LOCAL_REQ_NAT); } route[PRESENCE_ON_REGISTRATION] diff --git a/kamailio/sip_trace-role.cfg b/kamailio/sip_trace-role.cfg index a2768c9..89af0f0 100644 --- a/kamailio/sip_trace-role.cfg +++ b/kamailio/sip_trace-role.cfg @@ -75,6 +75,10 @@ route[SIP_TRACE_LOCAL] route[SIP_TRACE] { + if(src_ip == 127.0.0.1 || dst_ip == 127.0.0.1) { + return; + } + if (isflagset(FLAG_INTERNALLY_SOURCED)) { route(SIP_TRACE_INTERNAL); } else if (isflagset(FLAG_LOCAL_REQUEST)) {