Re: Replace ip address of source
Yuriy G via sr-users <[email protected]>
| Newsgroups | gmane.comp.voip.ser |
|---|---|
| Message-ID | <CABSP_VddVGEkJ3YQd3r_vBw69SfZnPBkGYBF08mD3yNP25Az8w@mail.gmail.com> |
https://www.kamailio.org/wikidocs/cookbooks/5.8.x/transformations/#sreplacematchrepl Which can do the same as $td="whatever you wish to be here"; However replacing domains in from/to headers much more effective with uac_replace_* functions as it can convert data back. On Wed, Jun 4, 2025, 19:51 Antonio via sr-users <[email protected]> wrote: > 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! > __________________________________________________________ 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!