Hello Sergio Charrua
Find below the necessary routing blocks, I have made some adjustments to the
previous routing blocks.
#!ifdef WITH_WEBSOCKETS
event_route[xhttp:request] {
set_reply_close();
set_reply_no_connect();
if ($Rp != MY_WS_PORT && $Rp != MY_WSS_PORT
) {
xlog("L_WARN", "HTTP request received on $Rp\n");
xhttp_reply("403", "Forbidden", "", "");
exit;
}
xlog("L_INFO", "HTTP Request Received\n");
if ($hdr(Upgrade) =~ "websocket"
&& $hdr(Connection) =~ "Upgrade"
&& $rm =~ "GET"
) {
if ($hdr(Host) == $null) {
xlog("L_WARN", "Bad host $hdr(Host)\n");
xhttp_reply("403", "Forbidden", "", "");
exit;
}
if (ws_handle_handshake()) {
exit;
}
}
xhttp_reply("404", "Not Found", "", "");
}
event_route[websocket:closed] {
xlog("L_INFO", "WebSocket connection from $si:$sp has closed\n");
}
#!endif
request_route {
xlog("L_ALERT"," ------- New Call (Routing) ----- $rm \n");
xlog("L_INFO",
"[REQ-IN] "
"src=$si:$sp "
"dst=$Ri:$Rp "
"du =$du "
"proto=$proto "
"ru=$ru "
"ruri_user=$rU "
"from=$fu "
"to=$tu "
"callid=$ci "
"ct=$hdr(Content-Type)\n"
);
#!ifdef WITH_WEBSOCKETS
if (nat_uac_test(64)) {
force_rport();
if (is_method("REGISTER")) {
fix_nated_register();
xlog("L_INFO", "Fixed NAT registration for $fu\n");
} else {
if (!add_contact_alias()) {
xlog("L_ERR", "Error aliasing contact <$ct> from $si:$sp\n");
sl_send_reply("400", "Bad Request");
exit;
}
xlog("L_INFO", "Added contact alias from $si:$sp\n");
}
}
#!endif
route(REQINIT);
route(SET_DIRECTION_FLAG);
# NAT detection
route(NATDETECT);
if ( is_method("OPTIONS") ) {
if($fU=='sipsak'){
sl_send_reply("500", "Server Dead");
exit;
}
}
if ( is_method("INFO") ) {
sl_send_reply("200", "OK");
exit;
}
#!ifdef WITH_HOMER
#start duplicate the SIP message now
sip_trace();
setflag(22);
#!endif
# per request initial checks
# handle requests within SIP dialogs
route(WITHINDLG);
### only initial requests (no To tag)
# CANCEL processing
if (is_method("CANCEL")){
if (t_check_trans())
t_relay();
exit;
}
t_check_trans();
# authentication
route(AUTH);
# record routing for dialog forming requests (in case they are routed)
# - remove preloaded route headers
remove_hf("Route");
remove_hf("X-VoipMonitor-Custom1");
if (is_method("INVITE|SUBSCRIBE")){
record_route_preset("x.x.x.x:5060;nat=yes");
}
# account only INVITEs
if (is_method("INVITE"))
{
setflag(FLT_ACC); # do accounting
}
# handle registrations
route(REGISTRAR);
if ($rU==$null)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
# dispatch destinations to PSTN
route(PSTN);
# user location service
route(LOCATION);
xlog("L_INFO",
"REQ OUT $rm | via proto=$proto sndto=$sndto(proto) "
"dst=$sndto(ip):$sndto(port) du=$du\n"
);
route(RELAY);
}
onsend_route {
#if(to_ip==1.2.3.4 && !isflagset(12)){
xlog("L_WARN", "[onsend_route] Packet going to $du [$mb]\n" );
#}
}
route[RELAY] {
if (is_method("INVITE|SUBSCRIBE|UPDATE|INFO")) {
route(SET_RTP_REQUEST);
t_on_branch("MANAGE_BRANCH");
t_on_reply("MANAGE_REPLY");
}
if (is_method("INVITE|UPDATE|INFO")) {
t_on_failure("MANAGE_FAILURE");
}
if (!t_relay()) {
sl_reply_error();
}
exit;
}
# Per SIP request initial checks
route[REQINIT] {
#!ifdef WITH_ANTIFLOOD
#!ifdef WITH_EXEC
#Run-time IPTable
if ($ua =~ "(VoipSwitch|Asterisk)") {
xdbg("Callfrom UA $ua\n");
} else if($ua =~
"(zxcvfdf11|friendly-scanner|pplsip|sipvicious|sipcli|VaxSIPUserAgent|voxalot|MizuPhone|Ozeki|tramb2017|voip|hello|Independant|Skipper)")
{
# silent drop for scanners
xlog("L_INFO","Blocking scanners and pushing
IPs to iptables");
exec_avp("iptables -I INPUT -s $si -j DROP");
exec_avp("/sbin/service iptables save");
sl_send_reply("403", "Forbidden");
exit;
}
#!endif
if (is_method("REGISTER")){
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
}
if(!sanity_check("1511", "7")) {
xlog("L_ALERT","Malformed SIP message from $si:$sp\n");
send_reply("403", "Forbidden");
exit;
}
return 1;
}
if(is_method("INVITE") || is_method("SUBSCRIBE") ||
is_method("REGISTER")){
# 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) {
# $fu is already blocked
xdbg("request from blocked User - $fU, $rm
from $fu (IP:$si:$sp)\n");
if(is_method("INVITE")){
xlog("L_ALERT"," ALERT: $fU
user source IP Address $si:$sp is already blocked.\n");
}
send_reply("403", "Forbidden");
exit;
}
if (!pike_check_req()) {
xlog("L_ALERT","Blocking traffic from $si\n");
xlog("L_ALERT","ALERT: pike blocking $fU, $rm
from $fu (IP:$si:$sp)\n");
$sht(ipban=>$si) = 1;
xlog("L_ALERT","ALERT: $fU user source IP
Address $si:$sp is blocking by system.\n");
xlog("L_INFO","ALERT: INSERT INTO `htable`
(`key_name`, `key_value`, ip, htime,serverid) VALUES ('$si',
'1','$si',now(),'1')\n");
sql_xquery("ca","INSERT INTO `htable`
(`key_name`, `key_value`, ip, htime,serverid) VALUES ('$si',
'1','$si',now(),'1')", "ra");
sql_xquery("ca","INSERT INTO `htabledump`
(`key_name`, `key_value`, ip, htime,serverid) VALUES ('$si',
'1','$si',now(),'1')", "ra");
send_reply("403", "Forbidden");
exit;
}
}
if($ua =~ "friendly-scanner") {
sl_send_reply("200", "OK");
exit;
}
}
if(!is_method("OPTIONS") && !is_method("SUBSCRIBE") &&
!is_method("NOTIFY") && !is_method("INVITE")){
if(src_ip!=myself) {
if($sht(userban=>$fU)!=$null) {
xdbg("request from blocked User - $fU, $rm
from $fu (IP:$si:$sp)\n");
if(is_method("INVITE")){
xlog("L_ALERT"," ALERT: $fU user source
IP Address $si:$sp is already blocked.\n");
}
send_reply("403", "Forbidden");
exit;
}
if (!pike_check_req()) {
xlog("L_ALERT","ALERT: pike blocking $fU, $rm
from $fu (IP:$si:$sp)\n");
xlog("L_ALERT","Blocking traffic from $si\n");
$sht(userban=>$fU) = 1;
xlog("L_ALERT","ALERT: $fU user source IP
Address $si:$sp is blocking by system.\n");
xlog("L_INFO","ALERT: INSERT INTO `htable`
(`key_name`, `key_value`, ip, htime,serverid) VALUES ('$fU',
'1','$si',now(),'1')\n");
sql_xquery("ca","INSERT INTO `htable`
(`key_name`, `key_value`, ip, htime,serverid) VALUES ('$fU',
'1','$si',now(),'1')", "ra");
sql_xquery("ca","INSERT INTO `htabledump`
(`key_name`, `key_value`, ip, htime,serverid) VALUES ('$fU',
'1','$si',now(),'1')", "ra");
send_reply("403", "Forbidden");
exit;
}
}
if($ua =~ "friendly-scanner") {
sl_send_reply("200", "OK");
exit;
}
}
#!endif
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("1511", "7")) {
xlog("Malformed SIP message from $si:$sp\n");
exit;
}
}
route[WITHINDLG] {
if (has_totag()) {
if (loose_route()) {
if (is_method("BYE")) {
setflag(FLT_ACC); # do accounting ...
setflag(FLT_ACCFAILED); # ... even if the
transaction fails
rtpengine_delete();
}
if ( is_method("ACK") ) {
# ACK is forwarded statelessy
route(NATMANAGE);
}
remove_hf("X-FROMURI");
remove_hf("X-CARRIERCPS");
remove_hf("X-CARRIERID");
remove_hf("X-MEDIP");
remove_hf("X-ACCOUNTCODE");
remove_hf("X-DEVICEID");
remove_hf("X-DEVICECC");
remove_hf("X-DEVICECPS");
remove_hf("X-ACCOUNTID");
remove_hf("X-ACCOUNTCC");
remove_hf("X-ACCOUNTCPS");
remove_hf("X-WITHMEDIA");
remove_hf("X-DEVICETYPE");
remove_hf("X-SRC-ACCOUNT");
remove_hf("X-SRC-MED-IP");
remove_hf("X-FS-Support");
remove_hf("X-DSTURI");
remove_hf("X-GMEDIA");
remove_hf("X-RE");
remove_hf("X-Billing-Code");
remove_hf("X-AI");
remove_hf("X-PU");
remove_hf("X-MEDIATRA");
remove_hf("X-INCOMINGCARRIER");
remove_hf("X-INCOMINGCARRIERDST");
remove_hf("X-DEVICEID-1");
remove_hf("Allow-Events");
msg_apply_changes();
route(RELAY);
} else {
if (is_method("SUBSCRIBE") && uri == myself) {
# in-dialog subscribe requests
sl_send_reply("404","Not here");
exit;
}
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
t_relay();
exit;
} else {
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}
}
route[NATDETECT] {
#!ifdef WITH_NAT
force_rport();
if (nat_uac_test("19")) {
if (is_method("REGISTER")) {
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(FLT_NATS);
setbflag(FLB_NATB);
}
if ($proto == "WS" || $proto == "WSS") {
force_rport();
if (is_method("REGISTER")) {
fix_nated_register();
add_path_received();
}
setflag(FLT_NATS);
setbflag(FLB_NATB);
xlog("L_INFO", "WebRTC client detected: $si:$sp\n");
}
#!endif
return;
}
route[NATMANAGE] {
if (is_request()) {
if(has_totag()) {
if(check_route_param("nat=yes")) {
setbflag(FLB_NATB);
}
}
}
if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;
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();
}
}
return;
}
route[PSTN] {
if($hdr(X-DSTURI) == $null){
return;
}else {
#!ifdef WITH_FREESWITCH
if(route(FROMFREESWITCH)){
#External Call sip_h_X-CARRIERCPS
sip_h_X-CARRIERID
$var(CARRIERCPS) = $hdr(X-CARRIERCPS);
$var(CARRIERID) = $hdr(X-CARRIERID);
xlog("L_ALERT","Carrier Allowed CPS
$var(CARRIERCPS) for carrier $hdr(X-CARRIERID)\n");
if(route(CCPSCHECK)){
sl_send_reply("515", "Limit issue");
exit;
}
$avp(oexten) = $rU;
$ru = $hdr(X-DSTURI);
#$du = $null;
$tu = $ru;
$var(MEDIATRA) = $hdr(X-MEDIATRA);
if($hdr(X-MEDIATRA) == '1'){
setflag(FLT_NATS);
}else{
resetflag(FLT_NATS);
}
remove_hf("X-FROMURI");
remove_hf("X-CARRIERCPS");
remove_hf("X-CARRIERID");
remove_hf("X-MEDIP");
remove_hf("X-ACCOUNTCODE");
remove_hf("X-DEVICEID");
remove_hf("X-DEVICECC");
remove_hf("X-DEVICECPS");
remove_hf("X-ACCOUNTID");
remove_hf("X-ACCOUNTCC");
remove_hf("X-ACCOUNTCPS");
remove_hf("X-WITHMEDIA");
remove_hf("X-DEVICETYPE");
remove_hf("X-SRC-ACCOUNT");
remove_hf("X-SRC-MED-IP");
remove_hf("X-FS-Support");
remove_hf("X-DSTURI");
remove_hf("X-GMEDIA");
remove_hf("X-RE");
remove_hf("X-AI");
remove_hf("X-PU");
remove_hf("X-MEDIATRA");
remove_hf("Allow-Events");
remove_hf("User-Agent");
remove_hf("X-INCOMINGCARRIER");
remove_hf("X-INCOMINGCARRIERDST");
remove_hf("X-Billing-Code");
remove_hf("X-DEVICEID-1");
append_hf("User-Agent: \r\n");
msg_apply_changes();
# when routing via usrloc, log the missed calls
also
if (is_method("INVITE")) {
setflag(FLT_ACCMISSED);
}
if($(var(CARRIERID){s.len}) > 1 ){
route(CCPSSET);
}
route(RELAY);
exit;
}
}
#!endif
}
branch_route[MANAGE_BRANCH] {
xdbg("new branch [$T_branch_idx] to $ru\n");
route(NATMANAGE);
}
onreply_route[MANAGE_REPLY] {
xlog("L_INFO",
"[REPLY-IN] "
"method=$rm "
"src=$si:$sp "
"dst=$Ri:$Rp "
"du=$du "
"proto=$proto "
"ru=$ru "
"to-tag=$tt "
"to-tag=$(tt{s.len}) "
"ct=$hdr(Content-Type)\n"
);
xdbg("incoming reply\n");
# if (!has_body("application/sdp")) return;
# if (!($rs == 183 || $rs == 200)) return;
# if (!has_totag()) return;
route(NATMANAGE);
route(SET_DIRECTION_FLAG);
route(SET_RTP_REPLY);
}
failure_route[MANAGE_FAILURE] {
route(NATMANAGE);
route(SET_RTP_REPLY);
if (t_is_canceled()) {
exit;
}
#!ifdef WITH_BLOCK3XX
if (t_check_status("3[0-9][0-9]")) {
t_reply("404","Not found");
exit;
}
#!endif
#!ifdef WITH_CODE486408
# serial forking
if (t_check_status("408")) {
t_reply("486","Busy");
exit;
}
if (t_check_status("408")) {
t_reply("486","Request Timeout");
exit;
}
#!endif
}
route[SET_DIRECTION_FLAG] {
# === FROM CORE ===
if ( is_ip_rfc1918("$si") ) {
# Core → WebRTC
if ($proto == "ws" || $proto == "wss" || $ru =~ "transport=(ws|wss)") {
xlog("L_INFO", "[DIR] CORE → WEBRTC | src=$si proto=$proto ru=$ru
du=$du\n");
setflag(FLB_FROM_CORE_TO_WEBRTC);
return;
}
# Core → SIP
xlog("L_INFO", "[DIR] CORE → SIP | src=$si proto=$proto ru=$ru
du=$du\n");
setflag(FLB_FROM_CORE_TO_SIP);
return;
}
# === FROM PUBLIC ===
else {
# Public → WebRTC
if ($proto == "ws" || $proto == "wss") {
xlog("L_INFO", "[DIR] PUBLIC → WEBRTC | src=$si proto=$proto ru=$ru
du=$du\n");
setflag(FLB_FROM_PUBLIC_FROM_WEBRTC);
return;
}
# Public → SIP
xlog("L_INFO", "[DIR] PUBLIC → SIP | src=$si proto=$proto ru=$ru
du=$du\n");
setflag(FLB_FROM_PUBLIC_FROM_SIP);
return;
}
}
route[SET_RTP_REQUEST] {
if (!is_method("UPDATE|INVITE")) {
return 0;
}
if (sdp_content()) {
$avp(originalSDP) = $rb;
if(isflagset(FLB_FROM_PUBLIC_FROM_WEBRTC)) {
xlog("L_INFO", "SET_RTP_REQUEST | FROM PUBLIC FROM
WEBRTC");
rtpengine_manage("replace-origin
replace-session-connection RTP/AVP ICE=remove direction=external
direction=internal");
}
if(isflagset(FLB_FROM_PUBLIC_FROM_SIP)) {
xlog("L_INFO", "SET_RTP_REQUEST | FROM PUBLIC FROM
SIP");
rtpengine_manage("replace-origin
replace-session-connection RTP/AVP ICE=remove direction=external
direction=internal");
}
if(isflagset(FLB_FROM_CORE_TO_WEBRTC)) {
xlog("L_INFO", "SET_RTP_REQUEST | FROM CORE TO WEBRTC");
rtpengine_manage("replace-origin
replace-session-connection RTP/SAVPF ICE=force direction=internal
direction=external");
}
if(isflagset(FLB_FROM_CORE_TO_SIP)) {
xlog("L_INFO", "SET_RTP_REQUEST | FROM CORE TO SIP");
rtpengine_manage("replace-origin
replace-session-connection RTP/AVP direction=internal direction=external");
}
}
}
route[SET_RTP_REPLY] {
xlog("L_INFO", "SET_RTP_REPLY | ENTERING THE ROUTE BLOCK");
if (sdp_content()) {
$avp(originalSDP) = $rb;
if(isflagset(FLB_FROM_PUBLIC_FROM_WEBRTC)) {
xlog("L_INFO", "SET_RTP_REPLY | FROM PUBLIC FROM
WEBRTC");
rtpengine_manage("replace-origin
replace-session-connection RTP/AVP ICE=remove direction=external
direction=internal");
}
if(isflagset(FLB_FROM_PUBLIC_FROM_SIP)) {
xlog("L_INFO", "SET_RTP_REPLY | FROM PUBLIC FROM SIP");
rtpengine_manage("replace-origin
replace-session-connection RTP/AVP ICE=remove direction=external
direction=internal");
}
if(isflagset(FLB_FROM_CORE_TO_WEBRTC)) {
xlog("L_INFO", "SET_RTP_REPLY | FROM CORE TO WEBRTC");
rtpengine_manage("replace-origin
replace-session-connection RTP/SAVPF ICE=force direction=internal
direction=external");
}
if(isflagset(FLB_FROM_CORE_TO_SIP)) {
xlog("L_INFO", "SET_RTP_REPLY | FROM CORE TO SIP");
rtpengine_manage("replace-origin
replace-session-connection RTP/AVP direction=external direction=external");
}
}
if ($rs=~"[3-6][0-9][0-9]") {
rtpengine_manage();
}
}
#!ifdef WITH_FREESWITCH
route[FROMFREESWITCH] {
if(ds_is_from_list("2")){
return 1;
}
return -1;
}
#!endif
__________________________________________________________
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!