dialog(k): Register dlg_tmcb_dummy in dialog_new_dlg() even when
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # $Id$
4 #
5 # Kamailio (OpenSER) SIP Server v3.0 - basic configuration script
6 #     - web: http://www.kamailio.org
7 #     - git: http://sip-router.org
8 #
9 # Direct your questions about this file to: <users@lists.kamailio.org>
10 #
11 # Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
12 # for an explanation of possible statements, functions and parameters.
13 #
14 # Several features can be enabled using '#!define WITH_FEATURE' directives:
15 #
16 # *** To run in debug mode: 
17 #     - define WITH_DEBUG
18 #
19 # *** To enable mysql: 
20 #     - define WITH_MYSQL
21 #
22 # *** To enable authentication execute:
23 #     - enable mysql
24 #     - define WITH_AUTH
25 #     - add users using 'kamctl'
26 #
27 # *** To enable persistent user location execute:
28 #     - enable mysql
29 #     - define WITH_USRLOCDB
30 #
31 # *** To enable presence server execute:
32 #     - enable mysql
33 #     - define WITH_PRESENCE
34 #
35 # *** To enable nat traversal execute:
36 #     - define WITH_NAT
37 #     - install RTPProxy: http://www.rtpproxy.org
38 #     - start RTPProxy:
39 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
40 #
41 # *** To enable PSTN gateway routing execute:
42 #     - define WITH_PSTN
43 #     - set the value of pstn.gw_ip
44 #     - check route[PSTN] for regexp routing condition
45 #
46 # *** To enhance accounting execute:
47 #     - enable mysql
48 #     - define WITH_ACCDB
49 #     - add following columns to database
50 #!ifdef ACCDB_COMMENT
51   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
52   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
53   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
54   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
55   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
56   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
57   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
58   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
59   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
60   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
61 #!endif
62
63
64 ####### Global Parameters #########
65
66 #!ifdef WITH_DEBUG
67 debug=4
68 log_stderror=yes
69 #!else
70 debug=2
71 log_stderror=no
72 #!endif
73
74 memdbg=5
75 memlog=5
76
77 log_facility=LOG_LOCAL0
78
79 fork=yes
80 children=4
81
82 /* uncomment the next line to disable TCP (default on) */
83 #disable_tcp=yes
84
85 /* uncomment the next line to disable the auto discovery of local aliases
86    based on revers DNS on IPs (default on) */
87 #auto_aliases=no
88
89 port=5060
90
91 /* uncomment and configure the following line if you want Kamailio to 
92    bind on a specific interface/port/proto (default bind on all available) */
93 #listen=udp:10.0.0.10:5060
94
95
96 ####### Custom Parameters #########
97
98 # These parameters can be modified runtime via RPC interface
99 # - see the documentation of 'cfg_rpc' module.
100 #
101 # Format: group.id = value 'desc' description
102 # Access: $sel(cfg_get.group.id) or @cfg_get.group.id
103 #
104
105 #!ifdef WITH_PSTN
106 # PSTN GW Routing
107 #
108 # - pstn.gw_ip: valid IP or hostname as string value, example:
109 # pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
110 #
111 # - by default is empty to avoid misrouting
112 pstn.gw_ip = "" desc "PSTN GW Address"
113 #!endif
114
115
116 ####### Modules Section ########
117
118 #set module path
119 mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
120
121 /* uncomment next line for MySQL DB support */
122 #!ifdef WITH_MYSQL
123 loadmodule "db_mysql.so"
124 #!endif
125 loadmodule "mi_fifo.so"
126 loadmodule "kex.so"
127 loadmodule "tm.so"
128 loadmodule "tmx.so"
129 loadmodule "sl.so"
130 loadmodule "rr.so"
131 loadmodule "pv.so"
132 loadmodule "maxfwd.so"
133 loadmodule "usrloc.so"
134 loadmodule "registrar.so"
135 loadmodule "textops.so"
136 loadmodule "uri_db.so"
137 loadmodule "siputils.so"
138 loadmodule "xlog.so"
139 loadmodule "sanity.so"
140 loadmodule "ctl.so"
141 loadmodule "mi_rpc.so"
142 loadmodule "acc.so"
143 #!ifdef WITH_AUTH
144 loadmodule "auth.so"
145 loadmodule "auth_db.so"
146 #!endif
147 /* uncomment next line for aliases support
148    NOTE: a DB (like db_mysql) module must be also loaded */
149 #loadmodule "alias_db.so"
150 /* uncomment next line for multi-domain support
151    NOTE: a DB (like db_mysql) module must be also loaded
152    NOTE: be sure and enable multi-domain support in all used modules
153          (see "multi-module params" section ) */
154 #loadmodule "domain.so"
155 #!ifdef WITH_PRESENCE
156 loadmodule "presence.so"
157 loadmodule "presence_xml.so"
158 #!endif
159
160 #!ifdef WITH_NAT
161 loadmodule "nathelper.so"
162 #!endif
163
164 # ----------------- setting module-specific parameters ---------------
165
166
167 # ----- mi_fifo params -----
168 modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
169
170
171 # ----- rr params -----
172 # add value to ;lr param to cope with most of the UAs
173 modparam("rr", "enable_full_lr", 1)
174 # do not append from tag to the RR (no need for this script)
175 modparam("rr", "append_fromtag", 0)
176
177
178 # ----- rr params -----
179 modparam("registrar", "method_filtering", 1)
180 /* uncomment the next line to disable parallel forking via location */
181 # modparam("registrar", "append_branches", 0)
182 /* uncomment the next line not to allow more than 10 contacts per AOR */
183 #modparam("registrar", "max_contacts", 10)
184
185
186 # ----- uri_db params -----
187 /* by default we disable the DB support in the module as we do not need it
188    in this configuration */
189 modparam("uri_db", "use_uri_table", 0)
190 modparam("uri_db", "db_url", "")
191
192
193 # ----- acc params -----
194 /* what sepcial events should be accounted ? */
195 modparam("acc", "early_media", 1)
196 modparam("acc", "report_ack", 1)
197 modparam("acc", "report_cancels", 1)
198 /* by default ww do not adjust the direct of the sequential requests.
199    if you enable this parameter, be sure the enable "append_fromtag"
200    in "rr" module */
201 modparam("acc", "detect_direction", 0)
202 /* account triggers (flags) */
203 modparam("acc", "failed_transaction_flag", 3)
204 modparam("acc", "log_flag", 1)
205 modparam("acc", "log_missed_flag", 2)
206 modparam("acc", "log_extra", 
207         "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
208 /* enhanced DB accounting */
209 #!ifdef WITH_ACCDB
210 modparam("acc", "db_flag", 1)
211 modparam("acc", "db_missed_flag", 2)
212 modparam("acc", "db_url",
213         "mysql://openser:openserrw@localhost/openser")
214 modparam("acc", "db_extra",
215         "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
216 #!endif
217
218 # ----- usrloc params -----
219 /* enable DB persistency for location entries */
220 #!ifdef WITH_USRLOCDB
221 modparam("usrloc", "db_mode",   2)
222 modparam("usrloc", "db_url",
223         "mysql://openser:openserrw@localhost/openser")
224 #!endif
225
226 # ----- auth_db params -----
227 /* enable the DB based authentication */
228 #!ifdef WITH_AUTH
229 modparam("auth_db", "calculate_ha1", yes)
230 modparam("auth_db", "password_column", "password")
231 modparam("auth_db", "db_url",
232         "mysql://openser:openserrw@localhost/openser")
233 modparam("auth_db", "load_credentials", "")
234 #!endif
235
236 # ----- alias_db params -----
237 /* uncomment the following lines if you want to enable the DB based
238    aliases */
239 #modparam("alias_db", "db_url",
240 #       "mysql://openser:openserrw@localhost/openser")
241
242
243 # ----- domain params -----
244 /* uncomment the following lines to enable multi-domain detection
245    support */
246 #modparam("domain", "db_url",
247 #       "mysql://openser:openserrw@localhost/openser")
248 #modparam("domain", "db_mode", 1)   # Use caching
249
250
251 # ----- multi-module params -----
252 /* uncomment the following line if you want to enable multi-domain support
253    in the modules (dafault off) */
254 #modparam("alias_db|auth_db|usrloc|uri_db", "use_domain", 1)
255
256
257 # ----- presence params -----
258 /* enable presence server support */
259 #!ifdef WITH_PRESENCE
260 modparam("presence|presence_xml", "db_url",
261         "mysql://openser:openserrw@localhost/openser")
262 modparam("presence_xml", "force_active", 1)
263 modparam("presence", "server_address", "sip:10.0.0.10:5060")
264 #!endif
265
266 # ----- nathelper -----
267 #!ifdef WITH_NAT
268 modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:7722")
269 modparam("nathelper", "natping_interval", 30)
270 modparam("nathelper", "ping_nated_only", 1)
271 modparam("nathelper", "sipping_bflag", 7)
272 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
273 modparam("registrar|nathelper", "received_avp", "$avp(i:80)")
274 modparam("usrloc", "nat_bflag", 6)
275 #!endif
276
277 ####### Routing Logic ########
278
279
280 # main request routing logic
281
282 route{
283
284         if (!mf_process_maxfwd_header("10")) {
285                 sl_send_reply("483","Too Many Hops");
286                 exit;
287         }
288
289         if(!sanity_check("1511", "7"))
290         {
291                 xlog("Malformed SIP message from $si:$sp\n");
292                 exit;
293         }
294
295         # NAT detection
296         route(NAT);
297
298         if (has_totag()) {
299                 # sequential request withing a dialog should
300                 # take the path determined by record-routing
301                 if (loose_route()) {
302                         if (is_method("BYE")) {
303                                 setflag(1); # do accounting ...
304                                 setflag(3); # ... even if the transaction fails
305                         }
306                         route(RELAY);
307                 } else {
308                         if (is_method("SUBSCRIBE") && uri == myself) {
309                                 # in-dialog subscribe requests
310                                 route(PRESENCE);
311                                 exit;
312                         }
313                         if ( is_method("ACK") ) {
314                                 if ( t_check_trans() ) {
315                                         # non loose-route, but stateful ACK; must be an ACK after a 487 or e.g. 404 from upstream server
316                                         t_relay();
317                                         exit;
318                                 } else {
319                                         # ACK without matching transaction ... ignore and discard.\n");
320                                         exit;
321                                 }
322                         }
323                         sl_send_reply("404","Not here");
324                 }
325                 exit;
326         }
327
328         #initial requests
329
330         # CANCEL processing
331         if (is_method("CANCEL"))
332         {
333                 if (t_check_trans())
334                         t_relay();
335                 exit;
336         }
337
338         t_check_trans();
339
340         # authentication
341         route(AUTH);
342
343         # record routing for dialog forming requests (in case they are routed)
344         # - remove preloaded route headers
345         remove_hf("Route");
346         if (is_method("INVITE|SUBSCRIBE"))
347                 record_route();
348
349         # account only INVITEs
350         if (is_method("INVITE")) {
351                 setflag(1); # do accounting
352         }
353         if (!uri==myself)
354         /* replace with following line if multi-domain support is used */
355         ##if (!is_uri_host_local())
356         {
357                 append_hf("P-hint: outbound\r\n"); 
358                 route(RELAY);
359         }
360
361         # requests for my domain
362
363         if( is_method("PUBLISH|SUBSCRIBE"))
364                 route(PRESENCE);
365
366         if (is_method("REGISTER"))
367         {
368                 if(isflagset(5))
369                 {
370                         setbflag("6");
371                         # uncomment next line to do SIP NAT pinging 
372                         ## setbflag("7");
373                 }
374                 if (!save("location"))
375                         sl_reply_error();
376
377                 exit;
378         }
379
380         if ($rU==$null) {
381                 # request with no Username in RURI
382                 sl_send_reply("484","Address Incomplete");
383                 exit;
384         }
385
386         route(PSTN);
387
388         # apply DB based aliases (uncomment to enable)
389         ##alias_db_lookup("dbaliases");
390
391         if (!lookup("location")) {
392                 switch ($rc) {
393                         case -1:
394                         case -3:
395                                 t_newtran();
396                                 t_reply("404", "Not Found");
397                                 exit;
398                         case -2:
399                                 sl_send_reply("405", "Method Not Allowed");
400                                 exit;
401                 }
402         }
403
404         # when routing via usrloc, log the missed calls also
405         setflag(2);
406
407         route(RELAY);
408 }
409
410
411 route[RELAY] {
412 #!ifdef WITH_NAT
413         if (check_route_param("nat=yes")) {
414                 setbflag("6");
415         }
416         if (isflagset(5) || isbflagset("6")) {
417                 route(RTPPROXY);
418         }
419 #!endif
420
421         /* example how to enable some additional event routes */
422         if (is_method("INVITE")) {
423                 #t_on_branch("BRANCH_ONE");
424                 t_on_reply("REPLY_ONE");
425                 t_on_failure("FAIL_ONE");
426         }
427
428         if (!t_relay()) {
429                 sl_reply_error();
430         }
431         exit;
432 }
433
434
435 # Presence server route
436 route[PRESENCE]
437 {
438 #!ifdef WITH_PRESENCE
439         if (!t_newtran())
440         {
441                 sl_reply_error();
442                 exit;
443         };
444
445         if(is_method("PUBLISH"))
446         {
447                 handle_publish();
448                 t_release();
449         }
450         else
451         if( is_method("SUBSCRIBE"))
452         {
453                 handle_subscribe();
454                 t_release();
455         }
456         exit;
457 #!endif
458         
459         # if presence enabled, this part will not be executed
460         if (is_method("PUBLISH") || $rU==$null)
461         {
462                 sl_send_reply("404", "Not here");
463                 exit;
464         }
465         return;
466 }
467
468 # Authentication route
469 route[AUTH] {
470 #!ifdef WITH_AUTH
471         if (is_method("REGISTER"))
472         {
473                 # authenticate the REGISTER requests (uncomment to enable auth)
474                 if (!www_authorize("", "subscriber"))
475                 {
476                         www_challenge("", "0");
477                         exit;
478                 }
479
480                 if ($au!=$tU)
481                 {
482                         sl_send_reply("403","Forbidden auth ID");
483                         exit;
484                 }
485         } else {
486                 # authenticate if from local subscriber (uncomment to enable auth)
487                 if (from_uri==myself)
488                 {
489                         if (!proxy_authorize("", "subscriber")) {
490                                 proxy_challenge("", "0");
491                                 exit;
492                         }
493                         if (is_method("PUBLISH"))
494                         {
495                                 if ($au!=$tU) {
496                                         sl_send_reply("403","Forbidden auth ID");
497                                         exit;
498                                 }
499                         } else {
500                                 if ($au!=$fU) {
501                                         sl_send_reply("403","Forbidden auth ID");
502                                         exit;
503                                 }
504                         }
505
506                         consume_credentials();
507                         # caller authenticated
508                 }
509         }
510 #!endif
511         return;
512 }
513
514 # Caller NAT detection route
515 route[NAT]{
516 #!ifdef WITH_NAT
517         force_rport();
518         if (nat_uac_test("19")) {
519                 if (method=="REGISTER") {
520                         fix_nated_register();
521                 } else {
522                         fix_nated_contact();
523                 }
524                 setflag(5);
525         }
526 #!endif
527         return;
528 }
529
530 # RTPProxy control
531 route[RTPPROXY] {
532 #!ifdef WITH_NAT
533         if (is_method("BYE")) {
534                 unforce_rtp_proxy();
535         } else if (is_method("INVITE")){
536                 force_rtp_proxy();
537         }
538         if (!has_totag()) add_rr_param(";nat=yes");
539 #!endif
540         return;
541 }
542
543 # PSTN GW routing
544 route[PSTN] {
545 #!ifdef WITH_PSTN
546         # check if PSTN GW IP is defined
547         if (strempty($sel(cfg_get.pstn.gw_ip))) {
548                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
549                 return;
550         }
551
552         # route to PSTN dialed numbers starting with '+' or '00'
553         #     (international format)
554         # - update the condition to match your dialing rules for PSTN routing
555         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
556                 return;
557
558         # only local users allowed to call
559         if(from_uri!=myself) {
560                 sl_send_reply("403", "Not Allowed");
561                 exit;
562         }
563
564         $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
565
566         route(RELAY);
567         exit;
568 #!endif
569
570         return;
571 }
572
573 # Sample branch router
574 branch_route[BRANCH_ONE] {
575         xdbg("new branch at $ru\n");
576 }
577
578 # Sample onreply route
579 onreply_route[REPLY_ONE] {
580         xdbg("incoming reply\n");
581 #!ifdef WITH_NAT
582         if ((isflagset(5) || isbflagset("6")) && status=~"(183)|(2[0-9][0-9])") {
583                 force_rtp_proxy();
584         }
585         if (isbflagset("6")) {
586                 fix_nated_contact();
587         }
588 #!endif
589 }
590
591 # Sample failure route
592 failure_route[FAIL_ONE] {
593 #!ifdef WITH_NAT
594         if (is_method("INVITE")
595                         && (isbflagset("6") || isflagset(5))) {
596                 unforce_rtp_proxy();
597         }
598 #!endif
599
600         if (t_is_canceled()) {
601                 exit;
602         }
603
604         # uncomment the following lines if you want to block client 
605         # redirect based on 3xx replies.
606         ##if (t_check_status("3[0-9][0-9]")) {
607         ##t_reply("404","Not found");
608         ##      exit;
609         ##}
610
611         # uncomment the following lines if you want to redirect the failed 
612         # calls to a different new destination
613         ##if (t_check_status("486|408")) {
614         ##      sethostport("192.168.2.100:5060");
615         ##      append_branch();
616         ##      # do not set the missed call flag again
617         ##      t_relay();
618         ##}
619 }