0644e6ae0720b11354e1ddc38c34ecff6f14fa77
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v4.3 - default configuration script
4 #     - web: http://www.kamailio.org
5 #     - git: http://sip-router.org
6 #
7 # Direct your questions about this file to: <sr-users@lists.sip-router.org>
8 #
9 # Refer to the Core CookBook at http://www.kamailio.org/wiki/
10 # for an explanation of possible statements, functions and parameters.
11 #
12 # Several features can be enabled using '#!define WITH_FEATURE' directives:
13 #
14 # *** To run in debug mode: 
15 #     - define WITH_DEBUG
16 #
17 # *** To enable mysql: 
18 #     - define WITH_MYSQL
19 #
20 # *** To enable authentication execute:
21 #     - enable mysql
22 #     - define WITH_AUTH
23 #     - add users using 'kamctl'
24 #
25 # *** To enable IP authentication execute:
26 #     - enable mysql
27 #     - enable authentication
28 #     - define WITH_IPAUTH
29 #     - add IP addresses with group id '1' to 'address' table
30 #
31 # *** To enable persistent user location execute:
32 #     - enable mysql
33 #     - define WITH_USRLOCDB
34 #
35 # *** To enable presence server execute:
36 #     - enable mysql
37 #     - define WITH_PRESENCE
38 #
39 # *** To enable nat traversal execute:
40 #     - define WITH_NAT
41 #     - install RTPProxy: http://www.rtpproxy.org
42 #     - start RTPProxy:
43 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
44 #     - option for NAT SIP OPTIONS keepalives: WITH_NATSIPPING
45 #
46 # *** To enable PSTN gateway routing execute:
47 #     - define WITH_PSTN
48 #     - set the value of pstn.gw_ip
49 #     - check route[PSTN] for regexp routing condition
50 #
51 # *** To enable database aliases lookup execute:
52 #     - enable mysql
53 #     - define WITH_ALIASDB
54 #
55 # *** To enable speed dial lookup execute:
56 #     - enable mysql
57 #     - define WITH_SPEEDDIAL
58 #
59 # *** To enable multi-domain support execute:
60 #     - enable mysql
61 #     - define WITH_MULTIDOMAIN
62 #
63 # *** To enable TLS support execute:
64 #     - adjust CFGDIR/tls.cfg as needed
65 #     - define WITH_TLS
66 #
67 # *** To enable XMLRPC support execute:
68 #     - define WITH_XMLRPC
69 #     - adjust route[XMLRPC] for access policy
70 #
71 # *** To enable anti-flood detection execute:
72 #     - adjust pike and htable=>ipban settings as needed (default is
73 #       block if more than 16 requests in 2 seconds and ban for 300 seconds)
74 #     - define WITH_ANTIFLOOD
75 #
76 # *** To block 3XX redirect replies execute:
77 #     - define WITH_BLOCK3XX
78 #
79 # *** To enable VoiceMail routing execute:
80 #     - define WITH_VOICEMAIL
81 #     - set the value of voicemail.srv_ip
82 #     - adjust the value of voicemail.srv_port
83 #
84 # *** To enhance accounting execute:
85 #     - enable mysql
86 #     - define WITH_ACCDB
87 #     - add following columns to database
88 #!ifdef ACCDB_COMMENT
89   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
90   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
91   ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
92   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
93   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
94   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
95   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
96   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
97   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
98   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
99   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
100   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
101 #!endif
102
103 ####### Include Local Config If Exists #########
104 import_file "kamailio-local.cfg"
105
106 ####### Defined Values #########
107
108 # *** Value defines - IDs used later in config
109 #!ifdef WITH_MYSQL
110 # - database URL - used to connect to database server by modules such
111 #       as: auth_db, acc, usrloc, a.s.o.
112 #!ifndef DBURL
113 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
114 #!endif
115 #!endif
116 #!ifdef WITH_MULTIDOMAIN
117 # - the value for 'use_domain' parameters
118 #!define MULTIDOMAIN 1
119 #!else
120 #!define MULTIDOMAIN 0
121 #!endif
122
123 # - flags
124 #   FLT_ - per transaction (message) flags
125 #       FLB_ - per branch flags
126 #!define FLT_ACC 1
127 #!define FLT_ACCMISSED 2
128 #!define FLT_ACCFAILED 3
129 #!define FLT_NATS 5
130
131 #!define FLB_NATB 6
132 #!define FLB_NATSIPPING 7
133
134 ####### Global Parameters #########
135
136 ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
137 #!ifdef WITH_DEBUG
138 debug=4
139 log_stderror=yes
140 #!else
141 debug=2
142 log_stderror=no
143 #!endif
144
145 memdbg=5
146 memlog=5
147
148 log_facility=LOG_LOCAL0
149
150 fork=yes
151 children=4
152
153 /* uncomment the next line to disable TCP (default on) */
154 #disable_tcp=yes
155
156 /* uncomment the next line to disable the auto discovery of local aliases
157    based on reverse DNS on IPs (default on) */
158 #auto_aliases=no
159
160 /* add local domain aliases */
161 #alias="sip.mydomain.com"
162
163 /* uncomment and configure the following line if you want Kamailio to 
164    bind on a specific interface/port/proto (default bind on all available) */
165 #listen=udp:10.0.0.10:5060
166
167 /* port to listen to
168  * - can be specified more than once if needed to listen on many ports */
169 port=5060
170
171 #!ifdef WITH_TLS
172 enable_tls=yes
173 #!endif
174
175 # life time of TCP connection when there is no traffic
176 # - a bit higher than registration expires to cope with UA behind NAT
177 tcp_connection_lifetime=3605
178
179 ####### Custom Parameters #########
180
181 # These parameters can be modified runtime via RPC interface
182 # - see the documentation of 'cfg_rpc' module.
183 #
184 # Format: group.id = value 'desc' description
185 # Access: $sel(cfg_get.group.id) or @cfg_get.group.id
186 #
187
188 #!ifdef WITH_PSTN
189 # PSTN GW Routing
190 #
191 # - pstn.gw_ip: valid IP or hostname as string value, example:
192 # pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
193 #
194 # - by default is empty to avoid misrouting
195 pstn.gw_ip = "" desc "PSTN GW Address"
196 pstn.gw_port = "" desc "PSTN GW Port"
197 #!endif
198
199 #!ifdef WITH_VOICEMAIL
200 # VoiceMail Routing on offline, busy or no answer
201 #
202 # - by default Voicemail server IP is empty to avoid misrouting
203 voicemail.srv_ip = "" desc "VoiceMail IP Address"
204 voicemail.srv_port = "5060" desc "VoiceMail Port"
205 #!endif
206
207 ####### Modules Section ########
208
209 # set paths to location of modules (to sources or installation folders)
210 #!ifdef WITH_SRCPATH
211 mpath="modules/"
212 #!else
213 mpath="/usr/local/lib/kamailio/modules/"
214 #!endif
215
216 #!ifdef WITH_MYSQL
217 loadmodule "db_mysql.so"
218 #!endif
219
220 loadmodule "mi_fifo.so"
221 loadmodule "kex.so"
222 loadmodule "corex.so"
223 loadmodule "tm.so"
224 loadmodule "tmx.so"
225 loadmodule "sl.so"
226 loadmodule "rr.so"
227 loadmodule "pv.so"
228 loadmodule "maxfwd.so"
229 loadmodule "usrloc.so"
230 loadmodule "registrar.so"
231 loadmodule "textops.so"
232 loadmodule "siputils.so"
233 loadmodule "xlog.so"
234 loadmodule "sanity.so"
235 loadmodule "ctl.so"
236 loadmodule "cfg_rpc.so"
237 loadmodule "mi_rpc.so"
238 loadmodule "acc.so"
239
240 #!ifdef WITH_AUTH
241 loadmodule "auth.so"
242 loadmodule "auth_db.so"
243 #!ifdef WITH_IPAUTH
244 loadmodule "permissions.so"
245 #!endif
246 #!endif
247
248 #!ifdef WITH_ALIASDB
249 loadmodule "alias_db.so"
250 #!endif
251
252 #!ifdef WITH_SPEEDDIAL
253 loadmodule "speeddial.so"
254 #!endif
255
256 #!ifdef WITH_MULTIDOMAIN
257 loadmodule "domain.so"
258 #!endif
259
260 #!ifdef WITH_PRESENCE
261 loadmodule "presence.so"
262 loadmodule "presence_xml.so"
263 #!endif
264
265 #!ifdef WITH_NAT
266 loadmodule "nathelper.so"
267 loadmodule "rtpproxy.so"
268 #!endif
269
270 #!ifdef WITH_TLS
271 loadmodule "tls.so"
272 #!endif
273
274 #!ifdef WITH_ANTIFLOOD
275 loadmodule "htable.so"
276 loadmodule "pike.so"
277 #!endif
278
279 #!ifdef WITH_XMLRPC
280 loadmodule "xmlrpc.so"
281 #!endif
282
283 #!ifdef WITH_DEBUG
284 loadmodule "debugger.so"
285 #!endif
286
287 # ----------------- setting module-specific parameters ---------------
288
289
290 # ----- mi_fifo params -----
291 modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
292
293
294 # ----- tm params -----
295 # auto-discard branches from previous serial forking leg
296 modparam("tm", "failure_reply_mode", 3)
297 # default retransmission timeout: 30sec
298 modparam("tm", "fr_timer", 30000)
299 # default invite retransmission timeout after 1xx: 120sec
300 modparam("tm", "fr_inv_timer", 120000)
301
302
303 # ----- rr params -----
304 # set next param to 1 to add value to ;lr param (helps with some UAs)
305 modparam("rr", "enable_full_lr", 0)
306 # do not append from tag to the RR (no need for this script)
307 modparam("rr", "append_fromtag", 0)
308
309
310 # ----- registrar params -----
311 modparam("registrar", "method_filtering", 1)
312 /* uncomment the next line to disable parallel forking via location */
313 # modparam("registrar", "append_branches", 0)
314 /* uncomment the next line not to allow more than 10 contacts per AOR */
315 #modparam("registrar", "max_contacts", 10)
316 # max value for expires of registrations
317 modparam("registrar", "max_expires", 3600)
318 # set it to 1 to enable GRUU
319 modparam("registrar", "gruu_enabled", 0)
320
321
322 # ----- acc params -----
323 /* what special events should be accounted ? */
324 modparam("acc", "early_media", 0)
325 modparam("acc", "report_ack", 0)
326 modparam("acc", "report_cancels", 0)
327 /* by default ww do not adjust the direct of the sequential requests.
328    if you enable this parameter, be sure the enable "append_fromtag"
329    in "rr" module */
330 modparam("acc", "detect_direction", 0)
331 /* account triggers (flags) */
332 modparam("acc", "log_flag", FLT_ACC)
333 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
334 modparam("acc", "log_extra", 
335         "src_user=$fU;src_domain=$fd;src_ip=$si;"
336         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
337 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
338 /* enhanced DB accounting */
339 #!ifdef WITH_ACCDB
340 modparam("acc", "db_flag", FLT_ACC)
341 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
342 modparam("acc", "db_url", DBURL)
343 modparam("acc", "db_extra",
344         "src_user=$fU;src_domain=$fd;src_ip=$si;"
345         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
346 #!endif
347
348
349 # ----- usrloc params -----
350 /* enable DB persistency for location entries */
351 #!ifdef WITH_USRLOCDB
352 modparam("usrloc", "db_url", DBURL)
353 modparam("usrloc", "db_mode", 2)
354 modparam("usrloc", "use_domain", MULTIDOMAIN)
355 #!endif
356
357
358 # ----- auth_db params -----
359 #!ifdef WITH_AUTH
360 modparam("auth_db", "db_url", DBURL)
361 modparam("auth_db", "calculate_ha1", yes)
362 modparam("auth_db", "password_column", "password")
363 modparam("auth_db", "load_credentials", "")
364 modparam("auth_db", "use_domain", MULTIDOMAIN)
365
366 # ----- permissions params -----
367 #!ifdef WITH_IPAUTH
368 modparam("permissions", "db_url", DBURL)
369 modparam("permissions", "db_mode", 1)
370 #!endif
371
372 #!endif
373
374
375 # ----- alias_db params -----
376 #!ifdef WITH_ALIASDB
377 modparam("alias_db", "db_url", DBURL)
378 modparam("alias_db", "use_domain", MULTIDOMAIN)
379 #!endif
380
381
382 # ----- speeddial params -----
383 #!ifdef WITH_SPEEDDIAL
384 modparam("speeddial", "db_url", DBURL)
385 modparam("speeddial", "use_domain", MULTIDOMAIN)
386 #!endif
387
388
389 # ----- domain params -----
390 #!ifdef WITH_MULTIDOMAIN
391 modparam("domain", "db_url", DBURL)
392 # register callback to match myself condition with domains list
393 modparam("domain", "register_myself", 1)
394 #!endif
395
396
397 #!ifdef WITH_PRESENCE
398 # ----- presence params -----
399 modparam("presence", "db_url", DBURL)
400
401 # ----- presence_xml params -----
402 modparam("presence_xml", "db_url", DBURL)
403 modparam("presence_xml", "force_active", 1)
404 #!endif
405
406
407 #!ifdef WITH_NAT
408 # ----- rtpproxy params -----
409 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
410
411 # ----- nathelper params -----
412 modparam("nathelper", "natping_interval", 30)
413 modparam("nathelper", "ping_nated_only", 1)
414 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
415 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
416
417 # params needed for NAT traversal in other modules
418 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
419 modparam("usrloc", "nat_bflag", FLB_NATB)
420 #!endif
421
422
423 #!ifdef WITH_TLS
424 # ----- tls params -----
425 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
426 #!endif
427
428 #!ifdef WITH_ANTIFLOOD
429 # ----- pike params -----
430 modparam("pike", "sampling_time_unit", 2)
431 modparam("pike", "reqs_density_per_unit", 16)
432 modparam("pike", "remove_latency", 4)
433
434 # ----- htable params -----
435 # ip ban htable with autoexpire after 5 minutes
436 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
437 #!endif
438
439 #!ifdef WITH_XMLRPC
440 # ----- xmlrpc params -----
441 modparam("xmlrpc", "route", "XMLRPC");
442 modparam("xmlrpc", "url_match", "^/RPC")
443 #!endif
444
445 #!ifdef WITH_DEBUG
446 # ----- debugger params -----
447 modparam("debugger", "cfgtrace", 1)
448 modparam("debugger", "log_level_name", "exec")
449 #!endif
450
451 ####### Routing Logic ########
452
453
454 # Main SIP request routing logic
455 # - processing of any incoming SIP request starts with this route
456 # - note: this is the same as route { ... }
457 request_route {
458
459         # per request initial checks
460         route(REQINIT);
461
462         # NAT detection
463         route(NATDETECT);
464
465         # CANCEL processing
466         if (is_method("CANCEL")) {
467                 if (t_check_trans()) {
468                         route(RELAY);
469                 }
470                 exit;
471         }
472
473         # handle requests within SIP dialogs
474         route(WITHINDLG);
475
476         ### only initial requests (no To tag)
477
478         # handle retransmissions
479         if(t_precheck_trans()) {
480                 t_check_trans();
481                 exit;
482         }
483         t_check_trans();
484
485         # authentication
486         route(AUTH);
487
488         # record routing for dialog forming requests (in case they are routed)
489         # - remove preloaded route headers
490         remove_hf("Route");
491         if (is_method("INVITE|SUBSCRIBE"))
492                 record_route();
493
494         # account only INVITEs
495         if (is_method("INVITE")) {
496                 setflag(FLT_ACC); # do accounting
497         }
498
499         # dispatch requests to foreign domains
500         route(SIPOUT);
501
502         ### requests for my local domains
503
504         # handle presence related requests
505         route(PRESENCE);
506
507         # handle registrations
508         route(REGISTRAR);
509
510         if ($rU==$null) {
511                 # request with no Username in RURI
512                 sl_send_reply("484","Address Incomplete");
513                 exit;
514         }
515
516         # dispatch destinations to PSTN
517         route(PSTN);
518
519         # user location service
520         route(LOCATION);
521 }
522
523 # Wrapper for relaying requests
524 route[RELAY] {
525
526         # enable additional event routes for forwarded requests
527         # - serial forking, RTP relaying handling, a.s.o.
528         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
529                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
530         }
531         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
532                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
533         }
534         if (is_method("INVITE")) {
535                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
536         }
537
538         if (!t_relay()) {
539                 sl_reply_error();
540         }
541         exit;
542 }
543
544 # Per SIP request initial checks
545 route[REQINIT] {
546 #!ifdef WITH_ANTIFLOOD
547         # flood dection from same IP and traffic ban for a while
548         # be sure you exclude checking trusted peers, such as pstn gateways
549         # - local host excluded (e.g., loop to self)
550         if(src_ip!=myself) {
551                 if($sht(ipban=>$si)!=$null) {
552                         # ip is already blocked
553                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
554                         exit;
555                 }
556                 if (!pike_check_req()) {
557                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
558                         $sht(ipban=>$si) = 1;
559                         exit;
560                 }
561         }
562         if($ua =~ "friendly-scanner") {
563                 sl_send_reply("200", "OK");
564                 exit;
565         }
566 #!endif
567
568         if (!mf_process_maxfwd_header("10")) {
569                 sl_send_reply("483","Too Many Hops");
570                 exit;
571         }
572
573         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
574                 sl_send_reply("200","Keepalive");
575                 exit;
576         }
577
578         if(!sanity_check("1511", "7")) {
579                 xlog("Malformed SIP message from $si:$sp\n");
580                 exit;
581         }
582 }
583
584 # Handle requests within SIP dialogs
585 route[WITHINDLG] {
586         if (!has_totag()) return;
587
588         # sequential request withing a dialog should
589         # take the path determined by record-routing
590         if (loose_route()) {
591                 route(DLGURI);
592                 if (is_method("BYE")) {
593                         setflag(FLT_ACC); # do accounting ...
594                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
595                 }
596                 else if ( is_method("ACK") ) {
597                         # ACK is forwarded statelessy
598                         route(NATMANAGE);
599                 }
600                 else if ( is_method("NOTIFY") ) {
601                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
602                         record_route();
603                 }
604                 route(RELAY);
605                 exit;
606         }
607
608         if (is_method("SUBSCRIBE") && uri == myself) {
609                 # in-dialog subscribe requests
610                 route(PRESENCE);
611                 exit;
612         }
613         if ( is_method("ACK") ) {
614                 if ( t_check_trans() ) {
615                         # no loose-route, but stateful ACK;
616                         # must be an ACK after a 487
617                         # or e.g. 404 from upstream server
618                         route(RELAY);
619                         exit;
620                 } else {
621                         # ACK without matching transaction ... ignore and discard
622                         exit;
623                 }
624         }
625         sl_send_reply("404","Not here");
626         exit;
627 }
628
629 # Handle SIP registrations
630 route[REGISTRAR] {
631         if (!is_method("REGISTER")) return;
632
633         if(isflagset(FLT_NATS)) {
634                 setbflag(FLB_NATB);
635 #!ifdef WITH_NATSIPPING
636                 # do SIP NAT pinging
637                 setbflag(FLB_NATSIPPING);
638 #!endif
639         }
640         if (!save("location"))
641                 sl_reply_error();
642         exit;
643 }
644
645 # User location service
646 route[LOCATION] {
647
648 #!ifdef WITH_SPEEDDIAL
649         # search for short dialing - 2-digit extension
650         if($rU=~"^[0-9][0-9]$")
651                 if(sd_lookup("speed_dial"))
652                         route(SIPOUT);
653 #!endif
654
655 #!ifdef WITH_ALIASDB
656         # search in DB-based aliases
657         if(alias_db_lookup("dbaliases"))
658                 route(SIPOUT);
659 #!endif
660
661         $avp(oexten) = $rU;
662         if (!lookup("location")) {
663                 $var(rc) = $rc;
664                 route(TOVOICEMAIL);
665                 t_newtran();
666                 switch ($var(rc)) {
667                         case -1:
668                         case -3:
669                                 send_reply("404", "Not Found");
670                                 exit;
671                         case -2:
672                                 send_reply("405", "Method Not Allowed");
673                                 exit;
674                 }
675         }
676
677         # when routing via usrloc, log the missed calls also
678         if (is_method("INVITE")) {
679                 setflag(FLT_ACCMISSED);
680         }
681
682         route(RELAY);
683         exit;
684 }
685
686 # Presence server processing
687 route[PRESENCE] {
688         if(!is_method("PUBLISH|SUBSCRIBE"))
689                 return;
690
691         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
692                 route(TOVOICEMAIL);
693                 # returns here if no voicemail server is configured
694                 sl_send_reply("404", "No voicemail service");
695                 exit;
696         }
697
698 #!ifdef WITH_PRESENCE
699         if (!t_newtran()) {
700                 sl_reply_error();
701                 exit;
702         }
703
704         if(is_method("PUBLISH")) {
705                 handle_publish();
706                 t_release();
707         } else if(is_method("SUBSCRIBE")) {
708                 handle_subscribe();
709                 t_release();
710         }
711         exit;
712 #!endif
713         
714         # if presence enabled, this part will not be executed
715         if (is_method("PUBLISH") || $rU==$null) {
716                 sl_send_reply("404", "Not here");
717                 exit;
718         }
719         return;
720 }
721
722 # IP authorization and user uthentication
723 route[AUTH] {
724 #!ifdef WITH_AUTH
725
726 #!ifdef WITH_IPAUTH
727         if((!is_method("REGISTER")) && allow_source_address()) {
728                 # source IP allowed
729                 return;
730         }
731 #!endif
732
733         if (is_method("REGISTER") || from_uri==myself)
734         {
735                 # authenticate requests
736                 if (!auth_check("$fd", "subscriber", "1")) {
737                         auth_challenge("$fd", "0");
738                         exit;
739                 }
740                 # user authenticated - remove auth header
741                 if(!is_method("REGISTER|PUBLISH"))
742                         consume_credentials();
743         }
744         # if caller is not local subscriber, then check if it calls
745         # a local destination, otherwise deny, not an open relay here
746         if (from_uri!=myself && uri!=myself) {
747                 sl_send_reply("403","Not relaying");
748                 exit;
749         }
750
751 #!endif
752         return;
753 }
754
755 # Caller NAT detection
756 route[NATDETECT] {
757 #!ifdef WITH_NAT
758         force_rport();
759         if (nat_uac_test("19")) {
760                 if (is_method("REGISTER")) {
761                         fix_nated_register();
762                 } else {
763                         if(is_first_hop())
764                                 set_contact_alias();
765                 }
766                 setflag(FLT_NATS);
767         }
768 #!endif
769         return;
770 }
771
772 # RTPProxy control and singaling updates for NAT traversal
773 route[NATMANAGE] {
774 #!ifdef WITH_NAT
775         if (is_request()) {
776                 if(has_totag()) {
777                         if(check_route_param("nat=yes")) {
778                                 setbflag(FLB_NATB);
779                         }
780                 }
781         }
782         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
783                 return;
784
785         rtpproxy_manage("co");
786
787         if (is_request()) {
788                 if (!has_totag()) {
789                         if(t_is_branch_route()) {
790                                 add_rr_param(";nat=yes");
791                         }
792                 }
793         }
794         if (is_reply()) {
795                 if(isbflagset(FLB_NATB)) {
796                         if(is_first_hop())
797                                 set_contact_alias();
798                 }
799         }
800 #!endif
801         return;
802 }
803
804 # URI update for dialog requests
805 route[DLGURI] {
806 #!ifdef WITH_NAT
807         if(!isdsturiset()) {
808                 handle_ruri_alias();
809         }
810 #!endif
811         return;
812 }
813
814 # Routing to foreign domains
815 route[SIPOUT] {
816         if (uri==myself) return;
817
818         append_hf("P-hint: outbound\r\n");
819         route(RELAY);
820         exit;
821 }
822
823 # PSTN GW routing
824 route[PSTN] {
825 #!ifdef WITH_PSTN
826         # check if PSTN GW IP is defined
827         if (strempty($sel(cfg_get.pstn.gw_ip))) {
828                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
829                 return;
830         }
831
832         # route to PSTN dialed numbers starting with '+' or '00'
833         #     (international format)
834         # - update the condition to match your dialing rules for PSTN routing
835         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
836                 return;
837
838         # only local users allowed to call
839         if(from_uri!=myself) {
840                 sl_send_reply("403", "Not Allowed");
841                 exit;
842         }
843
844         if (strempty($sel(cfg_get.pstn.gw_port))) {
845                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
846         } else {
847                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
848                                         + $sel(cfg_get.pstn.gw_port);
849         }
850
851         route(RELAY);
852         exit;
853 #!endif
854
855         return;
856 }
857
858 # XMLRPC routing
859 #!ifdef WITH_XMLRPC
860 route[XMLRPC] {
861         # allow XMLRPC from localhost
862         if ((method=="POST" || method=="GET")
863                         && (src_ip==127.0.0.1)) {
864                 # close connection only for xmlrpclib user agents (there is a bug in
865                 # xmlrpclib: it waits for EOF before interpreting the response).
866                 if ($hdr(User-Agent) =~ "xmlrpclib")
867                         set_reply_close();
868                 set_reply_no_connect();
869                 dispatch_rpc();
870                 exit;
871         }
872         send_reply("403", "Forbidden");
873         exit;
874 }
875 #!endif
876
877 # Routing to voicemail server
878 route[TOVOICEMAIL] {
879 #!ifdef WITH_VOICEMAIL
880         if(!is_method("INVITE|SUBSCRIBE"))
881                 return;
882
883         # check if VoiceMail server IP is defined
884         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
885                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
886                 return;
887         }
888         if(is_method("INVITE")) {
889                 if($avp(oexten)==$null)
890                         return;
891                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
892                                 + ":" + $sel(cfg_get.voicemail.srv_port);
893         } else {
894                 if($rU==$null)
895                         return;
896                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
897                                 + ":" + $sel(cfg_get.voicemail.srv_port);
898         }
899         route(RELAY);
900         exit;
901 #!endif
902
903         return;
904 }
905
906 # Manage outgoing branches
907 branch_route[MANAGE_BRANCH] {
908         xdbg("new branch [$T_branch_idx] to $ru\n");
909         route(NATMANAGE);
910 }
911
912 # Manage incoming replies
913 onreply_route[MANAGE_REPLY] {
914         xdbg("incoming reply\n");
915         if(status=~"[12][0-9][0-9]")
916                 route(NATMANAGE);
917 }
918
919 # Manage failure routing cases
920 failure_route[MANAGE_FAILURE] {
921         route(NATMANAGE);
922
923         if (t_is_canceled()) {
924                 exit;
925         }
926
927 #!ifdef WITH_BLOCK3XX
928         # block call redirect based on 3xx replies.
929         if (t_check_status("3[0-9][0-9]")) {
930                 t_reply("404","Not found");
931                 exit;
932         }
933 #!endif
934
935 #!ifdef WITH_VOICEMAIL
936         # serial forking
937         # - route to voicemail on busy or no answer (timeout)
938         if (t_check_status("486|408")) {
939                 $du = $null;
940                 route(TOVOICEMAIL);
941                 exit;
942         }
943 #!endif
944 }