17d7bcba596886db0764b17632b4b1a8f85388c3
[sip-router] / etc / kamailio-basic.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 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 #     - option for NAT SIP OPTIONS keepalives: WITH_NATSIPPING
41 #
42 # *** To enable TLS support execute:
43 #     - adjust CFGDIR/tls.cfg as needed
44 #     - define WITH_TLS
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 src_ip varchar(64) NOT NULL default '';
54   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
55   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
56   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
57   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
58   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
59   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
60   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
61   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
62   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
63 #!endif
64
65 ####### Include Local Config If Exists #########
66 import_file "kamailio-local.cfg"
67
68 ####### Defined Values #########
69
70 # *** Value defines - IDs used later in config
71 #!ifdef WITH_MYSQL
72 # - database URL - used to connect to database server by modules such
73 #       as: auth_db, acc, usrloc, a.s.o.
74 #!ifndef DBURL
75 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
76 #!endif
77 #!endif
78 #!define MULTIDOMAIN 0
79
80 # - flags
81 #   FLT_ - per transaction (message) flags
82 #       FLB_ - per branch flags
83 #!define FLT_ACC 1
84 #!define FLT_ACCMISSED 2
85 #!define FLT_ACCFAILED 3
86 #!define FLT_NATS 5
87
88 #!define FLB_NATB 6
89 #!define FLB_NATSIPPING 7
90
91 ####### Global Parameters #########
92
93 ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
94 #!ifdef WITH_DEBUG
95 debug=4
96 log_stderror=yes
97 #!else
98 debug=2
99 log_stderror=no
100 #!endif
101
102 memdbg=5
103 memlog=5
104
105 log_facility=LOG_LOCAL0
106
107 fork=yes
108 children=4
109
110 /* uncomment the next line to disable TCP (default on) */
111 #disable_tcp=yes
112
113 /* uncomment the next line to disable the auto discovery of local aliases
114    based on reverse DNS on IPs (default on) */
115 #auto_aliases=no
116
117 /* add local domain aliases */
118 #alias="sip.mydomain.com"
119
120 /* uncomment and configure the following line if you want Kamailio to 
121    bind on a specific interface/port/proto (default bind on all available) */
122 #listen=udp:10.0.0.10:5060
123
124 /* port to listen to
125  * - can be specified more than once if needed to listen on many ports */
126 port=5060
127
128 #!ifdef WITH_TLS
129 enable_tls=yes
130 #!endif
131
132 # life time of TCP connection when there is no traffic
133 # - a bit higher than registration expires to cope with UA behind NAT
134 tcp_connection_lifetime=3605
135
136 ####### Modules Section ########
137
138 # set paths to location of modules (to sources or installation folders)
139 #!ifdef WITH_SRCPATH
140 mpath="modules"
141 #!else
142 mpath="/usr/local/lib/kamailio/modules/"
143 #!endif
144
145 #!ifdef WITH_MYSQL
146 loadmodule "db_mysql.so"
147 #!endif
148
149 loadmodule "mi_fifo.so"
150 loadmodule "kex.so"
151 loadmodule "corex.so"
152 loadmodule "tm.so"
153 loadmodule "tmx.so"
154 loadmodule "sl.so"
155 loadmodule "rr.so"
156 loadmodule "pv.so"
157 loadmodule "maxfwd.so"
158 loadmodule "usrloc.so"
159 loadmodule "registrar.so"
160 loadmodule "textops.so"
161 loadmodule "siputils.so"
162 loadmodule "xlog.so"
163 loadmodule "sanity.so"
164 loadmodule "ctl.so"
165 loadmodule "cfg_rpc.so"
166 loadmodule "mi_rpc.so"
167 loadmodule "acc.so"
168
169 #!ifdef WITH_AUTH
170 loadmodule "auth.so"
171 loadmodule "auth_db.so"
172 #!ifdef WITH_IPAUTH
173 loadmodule "permissions.so"
174 #!endif
175 #!endif
176
177 #!ifdef WITH_NAT
178 loadmodule "nathelper.so"
179 loadmodule "rtpproxy.so"
180 #!endif
181
182 #!ifdef WITH_TLS
183 loadmodule "tls.so"
184 #!endif
185
186 #!ifdef WITH_DEBUG
187 loadmodule "debugger.so"
188 #!endif
189
190 # ----------------- setting module-specific parameters ---------------
191
192
193 # ----- mi_fifo params -----
194 modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
195
196
197 # ----- tm params -----
198 # auto-discard branches from previous serial forking leg
199 modparam("tm", "failure_reply_mode", 3)
200 # default retransmission timeout: 30sec
201 modparam("tm", "fr_timer", 30000)
202 # default invite retransmission timeout after 1xx: 120sec
203 modparam("tm", "fr_inv_timer", 120000)
204
205
206 # ----- rr params -----
207 # add value to ;lr param to cope with most of the UAs
208 modparam("rr", "enable_full_lr", 1)
209 # do not append from tag to the RR (no need for this script)
210 modparam("rr", "append_fromtag", 0)
211
212
213 # ----- registrar params -----
214 modparam("registrar", "method_filtering", 1)
215 /* uncomment the next line to disable parallel forking via location */
216 # modparam("registrar", "append_branches", 0)
217 /* uncomment the next line not to allow more than 10 contacts per AOR */
218 #modparam("registrar", "max_contacts", 10)
219 # max value for expires of registrations
220 modparam("registrar", "max_expires", 3600)
221 # set it to 1 to enable GRUU
222 modparam("registrar", "gruu_enabled", 0)
223
224
225 # ----- acc params -----
226 /* what special events should be accounted ? */
227 modparam("acc", "early_media", 0)
228 modparam("acc", "report_ack", 0)
229 modparam("acc", "report_cancels", 0)
230 /* by default ww do not adjust the direct of the sequential requests.
231    if you enable this parameter, be sure the enable "append_fromtag"
232    in "rr" module */
233 modparam("acc", "detect_direction", 0)
234 /* account triggers (flags) */
235 modparam("acc", "log_flag", FLT_ACC)
236 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
237 modparam("acc", "log_extra", 
238         "src_user=$fU;src_domain=$fd;src_ip=$si;"
239         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
240 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
241 /* enhanced DB accounting */
242 #!ifdef WITH_ACCDB
243 modparam("acc", "db_flag", FLT_ACC)
244 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
245 modparam("acc", "db_url", DBURL)
246 modparam("acc", "db_extra",
247         "src_user=$fU;src_domain=$fd;src_ip=$si;"
248         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
249 #!endif
250
251
252 # ----- usrloc params -----
253 /* enable DB persistency for location entries */
254 #!ifdef WITH_USRLOCDB
255 modparam("usrloc", "db_url", DBURL)
256 modparam("usrloc", "db_mode", 2)
257 modparam("usrloc", "use_domain", MULTIDOMAIN)
258 #!endif
259
260
261 # ----- auth_db params -----
262 #!ifdef WITH_AUTH
263 modparam("auth_db", "db_url", DBURL)
264 modparam("auth_db", "calculate_ha1", yes)
265 modparam("auth_db", "password_column", "password")
266 modparam("auth_db", "load_credentials", "")
267 modparam("auth_db", "use_domain", MULTIDOMAIN)
268
269 # ----- permissions params -----
270 #!ifdef WITH_IPAUTH
271 modparam("permissions", "db_url", DBURL)
272 modparam("permissions", "db_mode", 1)
273 #!endif
274
275 #!endif
276
277
278 #!ifdef WITH_NAT
279 # ----- rtpproxy params -----
280 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
281
282 # ----- nathelper params -----
283 modparam("nathelper", "natping_interval", 30)
284 modparam("nathelper", "ping_nated_only", 1)
285 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
286 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
287
288 # params needed for NAT traversal in other modules
289 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
290 modparam("usrloc", "nat_bflag", FLB_NATB)
291 #!endif
292
293
294 #!ifdef WITH_TLS
295 # ----- tls params -----
296 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
297 #!endif
298
299 #!ifdef WITH_DEBUG
300 # ----- debugger params -----
301 modparam("debugger", "cfgtrace", 1)
302 #!endif
303
304 ####### Routing Logic ########
305
306
307 # Main SIP request routing logic
308 # - processing of any incoming SIP request starts with this route
309 # - note: this is the same as route { ... }
310 request_route {
311
312         # per request initial checks
313         route(REQINIT);
314
315         # NAT detection
316         route(NATDETECT);
317
318         # CANCEL processing
319         if (is_method("CANCEL")) {
320                 if (t_check_trans()) {
321                         route(RELAY);
322                 }
323                 exit;
324         }
325
326         # handle requests within SIP dialogs
327         route(WITHINDLG);
328
329         ### only initial requests (no To tag)
330
331         # handle retransmissions
332         if(t_precheck_trans()) {
333                 t_check_trans();
334                 exit;
335         }
336         t_check_trans();
337
338         # authentication
339         route(AUTH);
340
341         # record routing for dialog forming requests (in case they are routed)
342         # - remove preloaded route headers
343         remove_hf("Route");
344         if (is_method("INVITE|SUBSCRIBE"))
345                 record_route();
346
347         # account only INVITEs
348         if (is_method("INVITE")) {
349                 setflag(FLT_ACC); # do accounting
350         }
351
352         # dispatch requests to foreign domains
353         route(SIPOUT);
354
355         ### requests for my local domains
356
357         # handle registrations
358         route(REGISTRAR);
359
360         if ($rU==$null) {
361                 # request with no Username in RURI
362                 sl_send_reply("484","Address Incomplete");
363                 exit;
364         }
365
366         # user location service
367         route(LOCATION);
368 }
369
370
371 route[RELAY] {
372         # enable additional event routes for forwarded requests
373         # - serial forking, RTP relaying handling, a.s.o.
374         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
375                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
376         }
377         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
378                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
379         }
380         if (is_method("INVITE")) {
381                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
382         }
383
384         if (!t_relay()) {
385                 sl_reply_error();
386         }
387         exit;
388 }
389
390 # Per SIP request initial checks
391 route[REQINIT] {
392 #!ifdef WITH_ANTIFLOOD
393         # flood dection from same IP and traffic ban for a while
394         # be sure you exclude checking trusted peers, such as pstn gateways
395         # - local host excluded (e.g., loop to self)
396         if(src_ip!=myself) {
397                 if($sht(ipban=>$si)!=$null) {
398                         # ip is already blocked
399                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
400                         exit;
401                 }
402                 if (!pike_check_req()) {
403                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
404                         $sht(ipban=>$si) = 1;
405                         exit;
406                 }
407         }
408         if($ua =~ "friendly-scanner") {
409                 sl_send_reply("200", "OK");
410                 exit;
411         }
412 #!endif
413
414         if (!mf_process_maxfwd_header("10")) {
415                 sl_send_reply("483","Too Many Hops");
416                 exit;
417         }
418
419         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
420                 sl_send_reply("200","Keepalive");
421                 exit;
422         }
423
424         if(!sanity_check("1511", "7")) {
425                 xlog("Malformed SIP message from $si:$sp\n");
426                 exit;
427         }
428 }
429
430 # Handle requests within SIP dialogs
431 route[WITHINDLG] {
432         if (!has_totag()) return;
433
434         # sequential request withing a dialog should
435         # take the path determined by record-routing
436         if (loose_route()) {
437                 route(DLGURI);
438                 if (is_method("BYE")) {
439                         setflag(FLT_ACC); # do accounting ...
440                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
441                 }
442                 else if ( is_method("ACK") ) {
443                         # ACK is forwarded statelessy
444                         route(NATMANAGE);
445                 }
446                 else if ( is_method("NOTIFY") ) {
447                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
448                         record_route();
449                 }
450                 route(RELAY);
451                 exit;
452         }
453         if ( is_method("ACK") ) {
454                 if ( t_check_trans() ) {
455                         # no loose-route, but stateful ACK;
456                         # must be an ACK after a 487
457                         # or e.g. 404 from upstream server
458                         route(RELAY);
459                         exit;
460                 } else {
461                         # ACK without matching transaction ... ignore and discard
462                         exit;
463                 }
464         }
465         sl_send_reply("404", "Not here");
466         exit;
467 }
468
469 # Handle SIP registrations
470 route[REGISTRAR] {
471         if (!is_method("REGISTER")) return;
472         if(isflagset(FLT_NATS)) {
473                 setbflag(FLB_NATB);
474 #!ifdef WITH_NATSIPPING
475                 # do SIP NAT pinging
476                 setbflag(FLB_NATSIPPING);
477 #!endif
478         }
479         if (!save("location"))
480                 sl_reply_error();
481
482         exit;
483 }
484
485 # User location service
486 route[LOCATION] {
487         if (!lookup("location")) {
488                 $var(rc) = $rc;
489                 t_newtran();
490                 switch ($var(rc)) {
491                         case -1:
492                         case -3:
493                                 send_reply("404", "Not Found");
494                                 exit;
495                         case -2:
496                                 send_reply("405", "Method Not Allowed");
497                                 exit;
498                 }
499         }
500
501         # when routing via usrloc, log the missed calls also
502         if (is_method("INVITE")) {
503                 setflag(FLT_ACCMISSED);
504         }
505
506         route(RELAY);
507         exit;
508 }
509
510
511 # IP authorization and user uthentication
512 route[AUTH] {
513 #!ifdef WITH_AUTH
514
515 #!ifdef WITH_IPAUTH
516         if((!is_method("REGISTER")) && allow_source_address()) {
517                 # source IP allowed
518                 return;
519         }
520 #!endif
521
522         if (is_method("REGISTER") || from_uri==myself) {
523                 # authenticate requests
524                 if (!auth_check("$fd", "subscriber", "1")) {
525                         auth_challenge("$fd", "0");
526                         exit;
527                 }
528                 # user authenticated - remove auth header
529                 if(!is_method("REGISTER|PUBLISH"))
530                         consume_credentials();
531         }
532         # if caller is not local subscriber, then check if it calls
533         # a local destination, otherwise deny, not an open relay here
534         if (from_uri!=myself && uri!=myself) {
535                 sl_send_reply("403","Not relaying");
536                 exit;
537         }
538
539 #!endif
540         return;
541 }
542
543 # Caller NAT detection
544 route[NATDETECT] {
545 #!ifdef WITH_NAT
546         force_rport();
547         if (nat_uac_test("19")) {
548                 if (is_method("REGISTER")) {
549                         fix_nated_register();
550                 } else {
551                         if(is_first_hop())
552                                 set_contact_alias();
553                 }
554                 setflag(FLT_NATS);
555         }
556 #!endif
557         return;
558 }
559
560 # RTPProxy control
561 route[NATMANAGE] {
562 #!ifdef WITH_NAT
563         if (is_request()) {
564                 if(has_totag()) {
565                         if(check_route_param("nat=yes")) {
566                                 setbflag(FLB_NATB);
567                         }
568                 }
569         }
570         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
571                 return;
572
573         rtpproxy_manage("co");
574
575         if (is_request()) {
576                 if (!has_totag()) {
577                         if(t_is_branch_route()) {
578                                 add_rr_param(";nat=yes");
579                         }
580                 }
581         }
582         if (is_reply()) {
583                 if(isbflagset(FLB_NATB)) {
584                         set_contact_alias();
585                 }
586         }
587 #!endif
588         return;
589 }
590
591 # URI update for dialog requests
592 route[DLGURI] {
593 #!ifdef WITH_NAT
594         if(!isdsturiset()) {
595                 handle_ruri_alias();
596         }
597 #!endif
598         return;
599 }
600
601 # Routing to foreign domains
602 route[SIPOUT] {
603         if (uri==myself) return;
604
605         append_hf("P-hint: outbound\r\n");
606         route(RELAY);
607         exit;
608 }
609
610 # Manage outgoing branches
611 branch_route[MANAGE_BRANCH] {
612         xdbg("new branch [$T_branch_idx] to $ru\n");
613         route(NATMANAGE);
614 }
615
616 # Manage incoming replies
617 onreply_route[MANAGE_REPLY] {
618         xdbg("incoming reply\n");
619         if(status=~"[12][0-9][0-9]")
620                 route(NATMANAGE);
621 }
622
623 # Manage failure routing cases
624 failure_route[MANAGE_FAILURE] {
625         route(NATMANAGE);
626
627         if (t_is_canceled()) {
628                 exit;
629         }
630 }