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!

Reply via email to