From ab6e63dcb31551a9b534f26eeae883153fd1af39 Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Mon, 23 Jul 2018 14:08:38 +0200 Subject: [PATCH] misc/examples: added minimal config sample for anycast --- .../mixed/kamailio-minimal-anycast.cfg | 345 ++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 misc/examples/mixed/kamailio-minimal-anycast.cfg diff --git a/misc/examples/mixed/kamailio-minimal-anycast.cfg b/misc/examples/mixed/kamailio-minimal-anycast.cfg new file mode 100644 index 00000000000..812695d9198 --- /dev/null +++ b/misc/examples/mixed/kamailio-minimal-anycast.cfg @@ -0,0 +1,345 @@ +#!KAMAILIO +# +# Kamailio (OpenSER) SIP Server v5.2 - default configuration script +# - web: https://www.kamailio.org +# - git: https://github.com/kamailio/kamailio +# +# Direct your questions about this file to: +# +# Refer to the Core CookBook at https://www.kamailio.org/wiki/ +# for an explanation of possible statements, functions and parameters. +# + +####### Defined Values ######### + +# the specific address for this node +#!define IPADDR_THISNODE "192.168.178.75" +#!subst "/IPADDR_THISNODE/192.168.178.75/" + +# the specific address of the pair node in the anycast deployment +#!define IPADDR_PAIRNODE "192.168.178.74" +#!subst "/IPADDR_PAIRNODE/192.168.178.74/" + +# the anycast address +#!define IPADDR_ANYCAST "192.168.178.80" +#!subst "/IPADDR_ANYCAST/192.168.178.80/" + +# the address of the main sip server where to route requests to +# [UA1] <===> [ANYCASTNODE] <===> [MAINSRV] <===> [ANYCASTNODE] <===> [UA2] +#!define IPADDR_MAINSRV "192.168.178.40" +#!subst "/IPADDR_MAINSRV/192.168.178.40/" + +#!define MULTIDOMAIN 0 + +# - flags +# FLT_ - per transaction (message) flags +# FLB_ - per branch flags +#!define FLT_ACC 1 +#!define FLT_ACCMISSED 2 +#!define FLT_ACCFAILED 3 +#!define FLT_NATS 5 + +#!define FLB_NATB 6 +#!define FLB_NATSIPPING 7 + +####### Global Parameters ######### + +### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR +#!ifdef WITH_DEBUG +debug=4 +log_stderror=yes +#!else +debug=2 +log_stderror=no +#!endif + +memdbg=5 +memlog=5 + +log_facility=LOG_LOCAL0 +log_prefix="{$mt $hdr(CSeq) $ci} " + +/* number of SIP routing processes */ +children=8 + +server_id = 10 +xavp_via_params = "via" + +/* uncomment the next line to disable TCP (default on) */ +# disable_tcp=yes + +/* uncomment the next line to disable the auto discovery of local aliases + * based on reverse DNS on IPs (default on) */ +# auto_aliases=no + +/* add local domain aliases */ +# alias="sip.mydomain.com" + +/* listen on local and anycast addresses */ +listen=udp:IPADDR_THISNODE:5060 +# listen=udp:IPADDR_ANYCAST:5060 + + +####### Custom Parameters ######### + +/* These parameters can be modified runtime via RPC interface + * - see the documentation of 'cfg_rpc' module. + * + * Format: group.id = value 'desc' description + * Access: $sel(cfg_get.group.id) or @cfg_get.group.id */ + +####### Modules Section ######## + +/* set paths to location of modules */ +loadmodule "jsonrpcs.so" +loadmodule "kex.so" +loadmodule "corex.so" +loadmodule "tm.so" +loadmodule "tmx.so" +loadmodule "sl.so" +loadmodule "rr.so" +loadmodule "pv.so" +loadmodule "maxfwd.so" +loadmodule "textops.so" +loadmodule "siputils.so" +loadmodule "xlog.so" +loadmodule "sanity.so" +loadmodule "ctl.so" +loadmodule "cfg_rpc.so" +loadmodule "acc.so" +loadmodule "counters.so" + +# ----------------- setting module-specific parameters --------------- + + +# ----- jsonrpcs params ----- +modparam("jsonrpcs", "pretty_format", 1) +/* set the path to RPC fifo control file */ +# modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo") +/* set the path to RPC unix socket control file */ +# modparam("jsonrpcs", "dgram_socket", "/var/run/kamailio/kamailio_rpc.sock") + +# ----- ctl params ----- +/* set the path to RPC unix socket control file */ +# modparam("ctl", "binrpc", "unix:/var/run/kamailio/kamailio_ctl") + +# ----- tm params ----- +# auto-discard branches from previous serial forking leg +modparam("tm", "failure_reply_mode", 3) +# default retransmission timeout: 30sec +modparam("tm", "fr_timer", 30000) +# default invite retransmission timeout after 1xx: 120sec +modparam("tm", "fr_inv_timer", 120000) + +# ----- rr params ----- +# set next param to 1 to add value to ;lr param (helps with some UAs) +modparam("rr", "enable_full_lr", 0) +# do not append from tag to the RR (no need for this script) +modparam("rr", "append_fromtag", 0) + +# ----- acc params ----- +/* what special events should be accounted ? */ +modparam("acc", "early_media", 0) +modparam("acc", "report_ack", 0) +modparam("acc", "report_cancels", 0) +/* by default ww do not adjust the direct of the sequential requests. + * if you enable this parameter, be sure the enable "append_fromtag" + * in "rr" module */ +modparam("acc", "detect_direction", 0) +/* account triggers (flags) */ +modparam("acc", "log_flag", FLT_ACC) +modparam("acc", "log_missed_flag", FLT_ACCMISSED) +modparam("acc", "log_extra", + "src_user=$fU;src_domain=$fd;src_ip=$si;" + "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd") +modparam("acc", "failed_transaction_flag", FLT_ACCFAILED) + +####### 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); + + # 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) + + # 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) { + # request with no Username in RURI + sl_send_reply("484","Address Incomplete"); + exit; + } + + if($si != IPADDR_MAINSRV) { + # received from client - send to main sip server + $du = "sip:" + IPADDR_MAINSRV; + route(RELAY); + exit; + } + + # received from main server - send to client + # add via tokens for anycast handling + via_add_srvid("1"); + $xavp(via=>node) = IPADDR_THISNODE; + via_add_xavp_params("1"); + 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] { + if($ua =~ "friendly-scanner|sipcli|VaxSIPUserAgent") { + # 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("1511", "7")) { + xlog("Malformed SIP message 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()) { + if (is_method("BYE")) { + setflag(FLT_ACC); # do accounting ... + setflag(FLT_ACCFAILED); # ... even if the transaction fails + } else if ( is_method("NOTIFY") ) { + # Add Record-Route for in-dialog NOTIFY as per RFC 6665. + record_route(); + } + route(RELAY); + 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; +} + +# Manage outgoing branches +branch_route[MANAGE_BRANCH] { + xdbg("new branch [$T_branch_idx] to $ru\n"); +} + +# Manage incoming replies +onreply_route[MANAGE_REPLY] { + xdbg("incoming reply\n"); + + if($si != IPADDR_MAINSRV) { + + if($si == IPADDR_PAIRNODE) { + # receiving a transparent proxied request from pair server + if(is_present_hf("X-Src-Addr")) { + # set the original source IP address + xinfo("setting source address: $hdr(X-Src-Addr)\n"); + set_source_address("$hdr(X-Src-Addr)"); + remove_hf("X-Src-Addr"); + } + # switch received socket to anycast address + set_recv_socket("udp:IPADDR_ANYCAST:5060"); + } else { + # receiving response from client + # response belongs to a transaction? + # - yes: route it, request was handled here + # - no: send to pair server + if(!t_check_trans()) { + append_hf("X-Src-Addr: $su\r\n"); + # $var(vd) = $(hdr(Via){s.select, ,-1}{param.value,node}); + $var(vd) = $sel(via.params["node"]); + xinfo("via param domain: $var(vd)\n"); + sendx("sip:$var(vd)", "udp:IPADDR_THISNODE:5060", "$mbu"); + drop(); + } + } + } + # from now on, the usual sip response processing +} + +# Manage failure routing cases +failure_route[MANAGE_FAILURE] { + if (t_is_canceled()) exit; +}