kamailio.cfg: use add_contact_alias()/handle_uri_alias() for NATed calls
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v3.4 - 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 # ----- speedial 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 # use caching
384 modparam("domain", "db_mode", 1)
385 # register callback to match myself condition with domains list
386 modparam("domain", "register_myself", 1)
387 #!endif
388
389
390 #!ifdef WITH_PRESENCE
391 # ----- presence params -----
392 modparam("presence", "db_url", DBURL)
393
394 # ----- presence_xml params -----
395 modparam("presence_xml", "db_url", DBURL)
396 modparam("presence_xml", "force_active", 1)
397 #!endif
398
399
400 #!ifdef WITH_NAT
401 # ----- rtpproxy params -----
402 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
403
404 # ----- nathelper params -----
405 modparam("nathelper", "natping_interval", 30)
406 modparam("nathelper", "ping_nated_only", 1)
407 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
408 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
409
410 # params needed for NAT traversal in other modules
411 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
412 modparam("usrloc", "nat_bflag", FLB_NATB)
413 #!endif
414
415
416 #!ifdef WITH_TLS
417 # ----- tls params -----
418 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
419 #!endif
420
421 #!ifdef WITH_ANTIFLOOD
422 # ----- pike params -----
423 modparam("pike", "sampling_time_unit", 2)
424 modparam("pike", "reqs_density_per_unit", 16)
425 modparam("pike", "remove_latency", 4)
426
427 # ----- htable params -----
428 # ip ban htable with autoexpire after 5 minutes
429 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
430 #!endif
431
432 #!ifdef WITH_XMLRPC
433 # ----- xmlrpc params -----
434 modparam("xmlrpc", "route", "XMLRPC");
435 modparam("xmlrpc", "url_match", "^/RPC")
436 #!endif
437
438 #!ifdef WITH_DEBUG
439 # ----- debugger params -----
440 modparam("debugger", "cfgtrace", 1)
441 #!endif
442
443 ####### Routing Logic ########
444
445
446 # Main SIP request routing logic
447 # - processing of any incoming SIP request starts with this route
448 # - note: this is the same as route { ... }
449 request_route {
450
451         # per request initial checks
452         route(REQINIT);
453
454         # NAT detection
455         route(NATDETECT);
456
457         # handle requests within SIP dialogs
458         route(WITHINDLG);
459
460         ### only initial requests (no To tag)
461
462         # CANCEL processing
463         if (is_method("CANCEL"))
464         {
465                 if (t_check_trans())
466                         t_relay();
467                 exit;
468         }
469
470         t_check_trans();
471
472         # authentication
473         route(AUTH);
474
475         # record routing for dialog forming requests (in case they are routed)
476         # - remove preloaded route headers
477         remove_hf("Route");
478         if (is_method("INVITE|SUBSCRIBE"))
479                 record_route();
480
481         # account only INVITEs
482         if (is_method("INVITE"))
483         {
484                 setflag(FLT_ACC); # do accounting
485         }
486
487         # dispatch requests to foreign domains
488         route(SIPOUT);
489
490         ### requests for my local domains
491
492         # handle presence related requests
493         route(PRESENCE);
494
495         # handle registrations
496         route(REGISTRAR);
497
498         if ($rU==$null)
499         {
500                 # request with no Username in RURI
501                 sl_send_reply("484","Address Incomplete");
502                 exit;
503         }
504
505         # dispatch destinations to PSTN
506         route(PSTN);
507
508         # user location service
509         route(LOCATION);
510
511         route(RELAY);
512 }
513
514
515 route[RELAY] {
516
517         # enable additional event routes for forwarded requests
518         # - serial forking, RTP relaying handling, a.s.o.
519         if (is_method("INVITE|SUBSCRIBE")) {
520                 t_on_branch("MANAGE_BRANCH");
521                 t_on_reply("MANAGE_REPLY");
522         }
523         if (is_method("INVITE")) {
524                 t_on_failure("MANAGE_FAILURE");
525         }
526
527         if (!t_relay()) {
528                 sl_reply_error();
529         }
530         exit;
531 }
532
533 # Per SIP request initial checks
534 route[REQINIT] {
535 #!ifdef WITH_ANTIFLOOD
536         # flood dection from same IP and traffic ban for a while
537         # be sure you exclude checking trusted peers, such as pstn gateways
538         # - local host excluded (e.g., loop to self)
539         if(src_ip!=myself)
540         {
541                 if($sht(ipban=>$si)!=$null)
542                 {
543                         # ip is already blocked
544                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
545                         exit;
546                 }
547                 if (!pike_check_req())
548                 {
549                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
550                         $sht(ipban=>$si) = 1;
551                         exit;
552                 }
553         }
554 #!endif
555
556         if (!mf_process_maxfwd_header("10")) {
557                 sl_send_reply("483","Too Many Hops");
558                 exit;
559         }
560
561         if(!sanity_check("1511", "7"))
562         {
563                 xlog("Malformed SIP message from $si:$sp\n");
564                 exit;
565         }
566 }
567
568 # Handle requests within SIP dialogs
569 route[WITHINDLG] {
570         if (has_totag()) {
571                 # sequential request withing a dialog should
572                 # take the path determined by record-routing
573                 if (loose_route()) {
574                         route(DLGURI);
575                         if (is_method("BYE")) {
576                                 setflag(FLT_ACC); # do accounting ...
577                                 setflag(FLT_ACCFAILED); # ... even if the transaction fails
578                         }
579                         if ( is_method("ACK") ) {
580                                 # ACK is forwarded statelessy
581                                 route(NATMANAGE);
582                         }
583                         route(RELAY);
584                 } else {
585                         if (is_method("SUBSCRIBE") && uri == myself) {
586                                 # in-dialog subscribe requests
587                                 route(PRESENCE);
588                                 exit;
589                         }
590                         if ( is_method("ACK") ) {
591                                 if ( t_check_trans() ) {
592                                         # no loose-route, but stateful ACK;
593                                         # must be an ACK after a 487
594                                         # or e.g. 404 from upstream server
595                                         t_relay();
596                                         exit;
597                                 } else {
598                                         # ACK without matching transaction ... ignore and discard
599                                         exit;
600                                 }
601                         }
602                         sl_send_reply("404","Not here");
603                 }
604                 exit;
605         }
606 }
607
608 # Handle SIP registrations
609 route[REGISTRAR] {
610         if (is_method("REGISTER"))
611         {
612                 if(isflagset(FLT_NATS))
613                 {
614                         setbflag(FLB_NATB);
615                         # uncomment next line to do SIP NAT pinging 
616                         ## setbflag(FLB_NATSIPPING);
617                 }
618                 if (!save("location"))
619                         sl_reply_error();
620
621                 exit;
622         }
623 }
624
625 # USER location service
626 route[LOCATION] {
627
628 #!ifdef WITH_SPEEDIAL
629         # search for short dialing - 2-digit extension
630         if($rU=~"^[0-9][0-9]$")
631                 if(sd_lookup("speed_dial"))
632                         route(SIPOUT);
633 #!endif
634
635 #!ifdef WITH_ALIASDB
636         # search in DB-based aliases
637         if(alias_db_lookup("dbaliases"))
638                 route(SIPOUT);
639 #!endif
640
641         $avp(oexten) = $rU;
642         if (!lookup("location")) {
643                 $var(rc) = $rc;
644                 route(TOVOICEMAIL);
645                 t_newtran();
646                 switch ($var(rc)) {
647                         case -1:
648                         case -3:
649                                 send_reply("404", "Not Found");
650                                 exit;
651                         case -2:
652                                 send_reply("405", "Method Not Allowed");
653                                 exit;
654                 }
655         }
656
657         # when routing via usrloc, log the missed calls also
658         if (is_method("INVITE"))
659         {
660                 setflag(FLT_ACCMISSED);
661         }
662 }
663
664 # Presence server route
665 route[PRESENCE] {
666         if(!is_method("PUBLISH|SUBSCRIBE"))
667                 return;
668
669 #!ifdef WITH_PRESENCE
670         if (!t_newtran())
671         {
672                 sl_reply_error();
673                 exit;
674         };
675
676         if(is_method("PUBLISH"))
677         {
678                 handle_publish();
679                 t_release();
680         }
681         else
682         if( is_method("SUBSCRIBE"))
683         {
684                 handle_subscribe();
685                 t_release();
686         }
687         exit;
688 #!endif
689         
690         # if presence enabled, this part will not be executed
691         if (is_method("PUBLISH") || $rU==$null)
692         {
693                 sl_send_reply("404", "Not here");
694                 exit;
695         }
696         return;
697 }
698
699 # Authentication route
700 route[AUTH] {
701 #!ifdef WITH_AUTH
702
703 #!ifdef WITH_IPAUTH
704         if((!is_method("REGISTER")) && allow_source_address())
705         {
706                 # source IP allowed
707                 return;
708         }
709 #!endif
710
711         if (is_method("REGISTER") || from_uri==myself)
712         {
713                 # authenticate requests
714                 if (!auth_check("$fd", "subscriber", "1")) {
715                         auth_challenge("$fd", "0");
716                         exit;
717                 }
718                 # user authenticated - remove auth header
719                 if(!is_method("REGISTER|PUBLISH"))
720                         consume_credentials();
721         }
722         # if caller is not local subscriber, then check if it calls
723         # a local destination, otherwise deny, not an open relay here
724         if (from_uri!=myself && uri!=myself)
725         {
726                 sl_send_reply("403","Not relaying");
727                 exit;
728         }
729
730 #!endif
731         return;
732 }
733
734 # Caller NAT detection route
735 route[NATDETECT] {
736 #!ifdef WITH_NAT
737         force_rport();
738         if (nat_uac_test("19")) {
739                 if (is_method("REGISTER")) {
740                         fix_nated_register();
741                 } else {
742                         add_contact_alias();
743                 }
744                 setflag(FLT_NATS);
745         }
746 #!endif
747         return;
748 }
749
750 # RTPProxy control
751 route[NATMANAGE] {
752 #!ifdef WITH_NAT
753         if (is_request()) {
754                 if(has_totag()) {
755                         if(check_route_param("nat=yes")) {
756                                 setbflag(FLB_NATB);
757                         }
758                 }
759         }
760         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
761                 return;
762
763         rtpproxy_manage();
764
765         if (is_request()) {
766                 if (!has_totag()) {
767                         add_rr_param(";nat=yes");
768                 }
769         }
770         if (is_reply()) {
771                 if(isbflagset(FLB_NATB)) {
772                         add_contact_alias();
773                 }
774         }
775 #!endif
776         return;
777 }
778
779 # URI update for dialog requests
780 route[DLGURI] {
781 #!ifdef WITH_NAT
782         if(!isdsturiset()) {
783                 handle_ruri_alias();
784         }
785 #!endif
786         return;
787 }
788
789 # Routing to foreign domains
790 route[SIPOUT] {
791         if (!uri==myself)
792         {
793                 append_hf("P-hint: outbound\r\n");
794                 route(RELAY);
795         }
796 }
797
798 # PSTN GW routing
799 route[PSTN] {
800 #!ifdef WITH_PSTN
801         # check if PSTN GW IP is defined
802         if (strempty($sel(cfg_get.pstn.gw_ip))) {
803                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
804                 return;
805         }
806
807         # route to PSTN dialed numbers starting with '+' or '00'
808         #     (international format)
809         # - update the condition to match your dialing rules for PSTN routing
810         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
811                 return;
812
813         # only local users allowed to call
814         if(from_uri!=myself) {
815                 sl_send_reply("403", "Not Allowed");
816                 exit;
817         }
818
819         $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
820
821         route(RELAY);
822         exit;
823 #!endif
824
825         return;
826 }
827
828 # XMLRPC routing
829 #!ifdef WITH_XMLRPC
830 route[XMLRPC] {
831         # allow XMLRPC from localhost
832         if ((method=="POST" || method=="GET")
833                         && (src_ip==127.0.0.1)) {
834                 # close connection only for xmlrpclib user agents (there is a bug in
835                 # xmlrpclib: it waits for EOF before interpreting the response).
836                 if ($hdr(User-Agent) =~ "xmlrpclib")
837                         set_reply_close();
838                 set_reply_no_connect();
839                 dispatch_rpc();
840                 exit;
841         }
842         send_reply("403", "Forbidden");
843         exit;
844 }
845 #!endif
846
847 # route to voicemail server
848 route[TOVOICEMAIL] {
849 #!ifdef WITH_VOICEMAIL
850         if(!is_method("INVITE"))
851                 return;
852
853         # check if VoiceMail server IP is defined
854         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
855                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
856                 return;
857         }
858         if($avp(oexten)==$null)
859                 return;
860
861         $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
862                                 + ":" + $sel(cfg_get.voicemail.srv_port);
863         route(RELAY);
864         exit;
865 #!endif
866
867         return;
868 }
869
870 # manage outgoing branches
871 branch_route[MANAGE_BRANCH] {
872         xdbg("new branch [$T_branch_idx] to $ru\n");
873         route(NATMANAGE);
874 }
875
876 # manage incoming replies
877 onreply_route[MANAGE_REPLY] {
878         xdbg("incoming reply\n");
879         if(status=~"[12][0-9][0-9]")
880                 route(NATMANAGE);
881 }
882
883 # manage failure routing cases
884 failure_route[MANAGE_FAILURE] {
885         route(NATMANAGE);
886
887         if (t_is_canceled()) {
888                 exit;
889         }
890
891 #!ifdef WITH_BLOCK3XX
892         # block call redirect based on 3xx replies.
893         if (t_check_status("3[0-9][0-9]")) {
894                 t_reply("404","Not found");
895                 exit;
896         }
897 #!endif
898
899 #!ifdef WITH_VOICEMAIL
900         # serial forking
901         # - route to voicemail on busy or no answer (timeout)
902         if (t_check_status("486|408")) {
903                 route(TOVOICEMAIL);
904                 exit;
905         }
906 #!endif
907 }