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