nochnoi82 created an issue (kamailio/kamailio#4272)

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

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",
"Not allowed from $si");
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;


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <kamailio/kamailio/issues/4272@github.com>