Can I ask here if this subst function reliable enough To use for replacing ip to domain And leave everything else as it is in Contact header ?
*Antony* [email protected] ср, 4 черв. 2025 р. о 11:18 Federico Cabiddu via sr-users < [email protected]> пише: > Hi, > have a look at the uac module and its uac_replace_to function ( > https://kamailio.org/docs/modules/6.0.x/modules/uac.html#uac.f.uac_replace_to_uri > ). > > Regards, > > Federico > > On Wed, Jun 4, 2025 at 10:04 AM disa_369--- via sr-users < > [email protected]> wrote: > >> Hello to everyone. >> I deployed Kamailio on Debian system. Install was successfull. >> I have the task to use Kamailio as proxy between Avaya PBX and >> Videoconference System. >> Outgoing calls only from >> IPPhone ----- Avaya PBX ---sip----> Kamailio -----sip----> Video >> System-IVR >> IVR number is 3000. >> Avaya Prefix for routing to Kamailio is 1234. >> When we dial number 12343000 the call goes to Video system with Header >> "TO" 12343000@ip_of_PBXAvaya and call drops. >> How to replace ip-address of Avaya to ip-address of Video_System? What to >> add in kamailio.cfg? >> >> >> ip video_system - *.*.60.3 >> ip avaya *.*.20.10 >> >> My route config >> >> >> ####### Routing Logic ######## >> /* Main SIP request routing logic >> * - processing of any incoming SIP request starts with this route >> * - note: this is the same as route { ... } */ >> request_route { >> # per request initial checks >> route(REQINIT); >> >> # NAT detection >> route(NATDETECT); >> >> # 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(); >> } >> >> # account only INVITEs >> if (is_method("INVITE")) { >> setflag(FLT_ACC); # do accounting >> } >> >> if ($rU==$null) { >> sl_send_reply("484", "Address Incomplete"); >> exit; >> >> } >> >> $du = "sip:*.*.60.3:5060"; >> route(RELAY); >> exit; >> >> } >> >> # Wrapper for relaying requests >> route[RELAY] { >> >> # enable additional event routes for forwarded requests >> # - serial forking, RTP relaying handling, a.s.o. >> if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) { >> if(!t_is_set("branch_route")) >> t_on_branch("MANAGE_BRANCH"); >> } >> if (is_method("INVITE|SUBSCRIBE|UPDATE")) { >> if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY"); >> } >> if (is_method("INVITE")) { >> if(!t_is_set("failure_route")) >> t_on_failure("MANAGE_FAILURE"); >> } >> >> if (!t_relay()) { >> sl_reply_error(); >> } >> exit; >> } >> >> # Per SIP request initial checks >> route[REQINIT] { >> # no connect for sending replies >> set_reply_no_connect(); >> # enforce symmetric signaling >> # - send back replies to the source address of request >> force_rport(); >> >> #!ifdef WITH_ANTIFLOOD >> # flood detection 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($ua =~ >> "friendly|scanner|sipcli|sipvicious|VaxSIPUserAgent|pplsip") { >> # 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("17895", "7")) { >> xlog("Malformed SIP request 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()) { >> route(DLGURI); >> if (is_method("BYE")) { >> setflag(FLT_ACC); # do accounting ... >> setflag(FLT_ACCFAILED); # ... even if the >> transaction fails >> } else if ( is_method("ACK") ) { >> # ACK is forwarded statelessly >> route(NATMANAGE); >> } else if ( is_method("NOTIFY") ) { >> # Add Record-Route for in-dialog NOTIFY as per >> RFC 6665. >> record_route(); >> } >> route(RELAY); >> exit; >> } >> >> 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 >> route(RELAY); >> exit; >> } else { >> # ACK without matching transaction ... ignore and >> discard >> exit; >> } >> } >> sl_send_reply("404","Not here"); >> exit; >> } >> >> # Handle SIP registrations >> route[REGISTRAR] { >> if (!is_method("REGISTER")) return; >> >> if(isflagset(FLT_NATS)) { >> setbflag(FLB_NATB); >> #!ifdef WITH_NATSIPPING >> # do SIP NAT pinging >> setbflag(FLB_NATSIPPING); >> #!endif >> } >> if (!save("location")) { >> sl_reply_error(); >> } >> exit; >> } >> >> # User location service >> route[LOCATION] { >> >> #!ifdef WITH_SPEEDDIAL >> # search for short dialing - 2-digit extension >> if($rU=~"^[0-9][0-9]$") { >> if(sd_lookup("speed_dial")) { >> route(SIPOUT); >> } >> } >> #!endif >> >> #!ifdef WITH_ALIASDB >> # search in DB-based aliases >> if(alias_db_lookup("dbaliases")) { >> route(SIPOUT); >> } >> #!endif >> >> $avp(oexten) = $rU; >> if (!lookup("location")) { >> $var(rc) = $rc; >> route(TOVOICEMAIL); >> t_newtran(); >> switch ($var(rc)) { >> case -1: >> case -3: >> send_reply("404", "Not Found"); >> exit; >> case -2: >> send_reply("405", "Method Not Allowed"); >> exit; >> } >> } >> >> # when routing via usrloc, log the missed calls also >> if (is_method("INVITE")) { >> setflag(FLT_ACCMISSED); >> } >> >> route(RELAY); >> exit; >> } >> >> # Presence server processing >> route[PRESENCE] { >> if(!is_method("PUBLISH|SUBSCRIBE")) return; >> >> if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") { >> route(TOVOICEMAIL); >> # returns here if no voicemail server is configured >> sl_send_reply("404", "No voicemail service"); >> exit; >> } >> >> #!ifdef WITH_PRESENCE >> #!ifdef WITH_MSGREBUILD >> # apply changes in case the request headers or body were modified >> msg_apply_changes(); >> #!endif >> 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; >> } >> >> # IP authorization and user authentication >> route[AUTH] { >> #!ifdef WITH_AUTH >> >> #!ifdef WITH_IPAUTH >> if((!is_method("REGISTER")) && allow_source_address()) { >> # source IP allowed >> return; >> } >> #!endif >> >> if (is_method("REGISTER") || from_uri==myself) { >> # authenticate requests >> if (!auth_check("$fd", "subscriber", "1")) { >> auth_challenge("$fd", "0"); >> exit; >> } >> # user authenticated - remove auth header >> if(!is_method("REGISTER|PUBLISH")) >> consume_credentials(); >> } >> # if caller is not local subscriber, then check if it calls >> # a local destination, otherwise deny, not an open relay here >> if (from_uri!=myself && uri!=myself) { >> sl_send_reply("403","Not relaying"); >> exit; >> } >> >> #!else >> >> # authentication not enabled - do not relay at all to foreign >> networks >> if(uri!=myself) { >> sl_send_reply("403","Not relaying"); >> exit; >> } >> >> #!endif >> return; >> } >> >> # Caller NAT detection >> route[NATDETECT] { >> #!ifdef WITH_NAT >> if (nat_uac_test("19")) { >> if (is_method("REGISTER")) { >> fix_nated_register(); >> } else { >> if(is_first_hop()) { >> set_contact_alias(); >> } >> } >> setflag(FLT_NATS); >> } >> #!endif >> return; >> } >> >> # RTPProxy control and signaling updates for NAT traversal >> route[NATMANAGE] { >> #!ifdef WITH_NAT >> if (is_request()) { >> if(has_totag()) { >> if(check_route_param("nat=yes")) { >> setbflag(FLB_NATB); >> } >> } >> } >> if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return; >> >> #!ifdef WITH_RTPENGINE >> if(nat_uac_test("8")) { >> rtpengine_manage("SIP-source-address replace-origin >> replace-session-connection"); >> } else { >> rtpengine_manage("replace-origin >> replace-session-connection"); >> } >> #!else >> if(nat_uac_test("8")) { >> rtpproxy_manage("co"); >> } else { >> rtpproxy_manage("cor"); >> } >> #!endif >> >> if (is_request()) { >> if (!has_totag()) { >> if(t_is_branch_route()) { >> add_rr_param(";nat=yes"); >> } >> } >> } >> if (is_reply()) { >> if(isbflagset(FLB_NATB)) { >> if(is_first_hop()) >> set_contact_alias(); >> } >> } >> >> if(isbflagset(FLB_NATB)) { >> # no connect message in a dialog involving NAT traversal >> if (is_request()) { >> if(has_totag()) { >> set_forward_no_connect(); >> } >> } >> } >> #!endif >> return; >> } >> >> # URI update for dialog requests >> route[DLGURI] { >> #!ifdef WITH_NAT >> if(!isdsturiset()) { >> handle_ruri_alias(); >> } >> #!endif >> return; >> } >> >> # Routing to foreign domains >> route[SIPOUT] { >> if (uri==myself) return; >> >> append_hf("P-Hint: outbound\r\n"); >> route(RELAY); >> exit; >> } >> >> # 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 routing 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}$")) return; >> >> # only local users allowed to call >> if(from_uri!=myself) { >> sl_send_reply("403", "Not Allowed"); >> exit; >> } >> >> # normalize target number for pstn gateway >> # - convert leading 00 to + >> if (starts_with("$rU", "00")) { >> strip(2); >> prefix("+"); >> } >> >> if (strempty($sel(cfg_get.pstn.gw_port))) { >> $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip); >> } else { >> $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":" >> + $sel(cfg_get.pstn.gw_port); >> } >> >> route(RELAY); >> exit; >> #!endif >> >> return; >> } >> >> # JSONRPC over HTTP(S) routing >> #!ifdef WITH_JSONRPC >> event_route[xhttp:request] { >> set_reply_close(); >> set_reply_no_connect(); >> if(src_ip!=127.0.0.1) { >> xhttp_reply("403", "Forbidden", "text/html", >> "<html><body>Not allowed from >> $si</body></html>"); >> exit; >> } >> if ($hu =~ "^/RPC") { >> jsonrpc_dispatch(); >> exit; >> } >> >> xhttp_reply("200", "OK", "text/html", >> "<html><body>Wrong URL >> $hu</body></html>"); >> exit; >> } >> #!endif >> >> # Routing to voicemail server >> route[TOVOICEMAIL] { >> #!ifdef WITH_VOICEMAIL >> if(!is_method("INVITE|SUBSCRIBE")) return; >> >> # check if VoiceMail server IP is defined >> if (strempty($sel(cfg_get.voicemail.srv_ip))) { >> xlog("SCRIPT: VoiceMail routing enabled but IP not >> defined\n"); >> return; >> } >> if(is_method("INVITE")) { >> if($avp(oexten)==$null) return; >> >> $ru = "sip:" + $avp(oexten) + "@" + >> $sel(cfg_get.voicemail.srv_ip) >> + ":" + $sel(cfg_get.voicemail.srv_port); >> } else { >> if($rU==$null) return; >> >> $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip) >> + ":" + $sel(cfg_get.voicemail.srv_port); >> } >> route(RELAY); >> exit; >> #!endif >> >> return; >> } >> >> # Manage outgoing branches >> branch_route[MANAGE_BRANCH] { >> xdbg("new branch [$T_branch_idx] to $ru\n"); >> route(NATMANAGE); >> return; >> } >> >> # Manage incoming replies >> reply_route { >> if(!sanity_check("17604", "6")) { >> xlog("Malformed SIP response from $si:$sp\n"); >> drop; >> } >> return; >> } >> >> # Manage incoming replies in transaction context >> onreply_route[MANAGE_REPLY] { >> xdbg("incoming reply\n"); >> if(status=~"[12][0-9][0-9]") { >> route(NATMANAGE); >> } >> return; >> } >> >> # Manage failure routing cases >> failure_route[MANAGE_FAILURE] { >> route(NATMANAGE); >> >> if (t_is_canceled()) exit; >> >> #!ifdef WITH_BLOCK3XX >> # block call redirect based on 3xx replies. >> if (t_check_status("3[0-9][0-9]")) { >> t_reply("404","Not found"); >> exit; >> } >> #!endif >> >> #!ifdef WITH_BLOCK401407 >> # block call redirect based on 401, 407 replies. >> if (t_check_status("401|407")) { >> t_reply("404","Not found"); >> exit; >> } >> #!endif >> >> #!ifdef WITH_VOICEMAIL >> # serial forking >> # - route to voicemail on busy or no answer (timeout) >> if (t_check_status("486|408")) { >> $du = $null; >> route(TOVOICEMAIL); >> exit; >> } >> #!endif >> return; >> __________________________________________________________ >> Kamailio - Users Mailing List - Non Commercial Discussions -- >> [email protected] >> To unsubscribe send an email to [email protected] >> Important: keep the mailing list in the recipients, do not reply only to >> the sender! >> > __________________________________________________________ > Kamailio - Users Mailing List - Non Commercial Discussions -- > [email protected] > To unsubscribe send an email to [email protected] > Important: keep the mailing list in the recipients, do not reply only to > the sender! >
__________________________________________________________ Kamailio - Users Mailing List - Non Commercial Discussions -- [email protected] To unsubscribe send an email to [email protected] Important: keep the mailing list in the recipients, do not reply only to the sender!
