|
@@ -1,117 +1,132 @@
|
|
|
|
+#!KAMAILIO
|
|
#
|
|
#
|
|
# $Id$
|
|
# $Id$
|
|
#
|
|
#
|
|
-# Kamailio (OpenSER) SIP Server - basic configuration script
|
|
|
|
|
|
+# Kamailio (OpenSER) SIP Server v3.0 - basic configuration script
|
|
# - web: http://www.kamailio.org
|
|
# - web: http://www.kamailio.org
|
|
-# - svn: http://openser.svn.sourceforge.net/viewvc/openser/
|
|
|
|
|
|
+# - git: http://sip-router.org
|
|
#
|
|
#
|
|
# Direct your questions about this file to: <[email protected]>
|
|
# Direct your questions about this file to: <[email protected]>
|
|
#
|
|
#
|
|
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
|
|
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php
|
|
# for an explanation of possible statements, functions and parameters.
|
|
# for an explanation of possible statements, functions and parameters.
|
|
#
|
|
#
|
|
-# There are comments showing how to enable different features in th econfig
|
|
|
|
-# file. Such commented code starts with #X# where X is a letter to identify
|
|
|
|
-# a feature. Delete entire #X# if you want to enable that feature. Next are
|
|
|
|
-# sed commands that help you enable such features.
|
|
|
|
|
|
+# Several features can be enabled using '#!define WITH_FEATURE' directives:
|
|
#
|
|
#
|
|
-# *** To enamble mysql execute:
|
|
|
|
-# sed -i 's/#m#//g' kamailio.cfg
|
|
|
|
|
|
+# *** To run in debug mode:
|
|
|
|
+# - define WITH_DEBUG
|
|
#
|
|
#
|
|
-# *** To enamble authentication execute:
|
|
|
|
|
|
+# *** To enable mysql:
|
|
|
|
+# - define WITH_MYSQL
|
|
|
|
+#
|
|
|
|
+# *** To enable authentication execute:
|
|
# - enable mysql
|
|
# - enable mysql
|
|
-# sed -i 's/#a#//g' kamailio.cfg
|
|
|
|
|
|
+# - define WITH_AUTH
|
|
# - add users using 'kamctl'
|
|
# - add users using 'kamctl'
|
|
#
|
|
#
|
|
-# *** To enamble persistent user location execute:
|
|
|
|
|
|
+# *** To enable persistent user location execute:
|
|
# - enable mysql
|
|
# - enable mysql
|
|
-# sed -i 's/#u#//g' kamailio.cfg
|
|
|
|
|
|
+# - define WITH_USRLOCDB
|
|
#
|
|
#
|
|
-# *** To enamble presence server execute:
|
|
|
|
|
|
+# *** To enable presence server execute:
|
|
# - enable mysql
|
|
# - enable mysql
|
|
-# sed -i 's/#p#//g' kamailio.cfg
|
|
|
|
|
|
+# - define WITH_PRESENCE
|
|
#
|
|
#
|
|
-# *** To enamble nat traversal execute:
|
|
|
|
-# sed -i 's/#n#//g' kamailio.cfg
|
|
|
|
|
|
+# *** To enable nat traversal execute:
|
|
|
|
+# - define WITH_NAT
|
|
# - install RTPProxy: http://www.rtpproxy.org
|
|
# - install RTPProxy: http://www.rtpproxy.org
|
|
# - start RTPProxy:
|
|
# - start RTPProxy:
|
|
# rtpproxy -l _your_public_ip_ -s udp:localhost:7722
|
|
# rtpproxy -l _your_public_ip_ -s udp:localhost:7722
|
|
#
|
|
#
|
|
|
|
+# *** To enable PSTN gateway routing execute:
|
|
|
|
+# - define WITH_PSTN
|
|
|
|
+# - set the value of pstn.gw_ip
|
|
|
|
+# - check route[PSTN] for regexp routing condition
|
|
|
|
+#
|
|
# *** To enhance accounting execute:
|
|
# *** To enhance accounting execute:
|
|
# - enable mysql
|
|
# - enable mysql
|
|
-# sed -i 's/#c#//g' kamailio.cfg
|
|
|
|
|
|
+# - define WITH_ACCDB
|
|
# - add following columns to database
|
|
# - add following columns to database
|
|
-# ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE missed_call ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
-# ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
-#
|
|
|
|
|
|
+#!ifdef ACCDB_COMMENT
|
|
|
|
+ ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE missed_call ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
|
|
|
|
+ ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
|
|
|
|
+#!endif
|
|
|
|
|
|
|
|
|
|
####### Global Parameters #########
|
|
####### Global Parameters #########
|
|
|
|
|
|
-debug=3
|
|
|
|
|
|
+#!ifdef WITH_DEBUG
|
|
|
|
+debug=4
|
|
|
|
+log_stderror=yes
|
|
|
|
+#!else
|
|
|
|
+debug=2
|
|
log_stderror=no
|
|
log_stderror=no
|
|
|
|
+#!endif
|
|
|
|
+
|
|
|
|
+memdbg=5
|
|
|
|
+memlog=5
|
|
|
|
+
|
|
log_facility=LOG_LOCAL0
|
|
log_facility=LOG_LOCAL0
|
|
|
|
|
|
fork=yes
|
|
fork=yes
|
|
children=4
|
|
children=4
|
|
|
|
|
|
-/* uncomment the following lines to enable debugging */
|
|
|
|
-#debug=6
|
|
|
|
-#fork=no
|
|
|
|
-#log_stderror=yes
|
|
|
|
-
|
|
|
|
/* uncomment the next line to disable TCP (default on) */
|
|
/* uncomment the next line to disable TCP (default on) */
|
|
#disable_tcp=yes
|
|
#disable_tcp=yes
|
|
|
|
|
|
-/* uncomment the next line to enable the auto temporary blacklisting of
|
|
|
|
- not available destinations (default disabled) */
|
|
|
|
-#disable_dns_blacklist=no
|
|
|
|
-
|
|
|
|
-/* uncomment the next line to enable IPv6 lookup after IPv4 dns
|
|
|
|
- lookup failures (default disabled) */
|
|
|
|
-#dns_try_ipv6=yes
|
|
|
|
-
|
|
|
|
/* uncomment the next line to disable the auto discovery of local aliases
|
|
/* uncomment the next line to disable the auto discovery of local aliases
|
|
based on revers DNS on IPs (default on) */
|
|
based on revers DNS on IPs (default on) */
|
|
#auto_aliases=no
|
|
#auto_aliases=no
|
|
|
|
|
|
-/* uncomment the following lines to enable TLS support (default off) */
|
|
|
|
-#disable_tls = no
|
|
|
|
-#listen = tls:your_IP:5061
|
|
|
|
-#tls_verify_server = 1
|
|
|
|
-#tls_verify_client = 1
|
|
|
|
-#tls_require_client_certificate = 0
|
|
|
|
-#tls_method = TLSv1
|
|
|
|
-#tls_certificate = "/usr/local/etc/kamailio/tls/user/user-cert.pem"
|
|
|
|
-#tls_private_key = "/usr/local/etc/kamailio/tls/user/user-privkey.pem"
|
|
|
|
-#tls_ca_list = "/usr/local/etc/kamailio/tls/user/user-calist.pem"
|
|
|
|
-
|
|
|
|
-
|
|
|
|
port=5060
|
|
port=5060
|
|
|
|
|
|
/* uncomment and configure the following line if you want Kamailio to
|
|
/* uncomment and configure the following line if you want Kamailio to
|
|
bind on a specific interface/port/proto (default bind on all available) */
|
|
bind on a specific interface/port/proto (default bind on all available) */
|
|
-#listen=udp:192.168.1.2:5060
|
|
|
|
|
|
+#listen=udp:10.0.0.10:5060
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+####### Custom Parameters #########
|
|
|
|
+
|
|
|
|
+# These parameters can be modified runtime via RPC interface
|
|
|
|
+# - see the documentation of 'cfg_rpc' module.
|
|
|
|
+#
|
|
|
|
+# Format: group.id = value 'desc' description
|
|
|
|
+# Access: $sel(cfg_get.group.id) or @cfg_get.group.id
|
|
|
|
+#
|
|
|
|
+
|
|
|
|
+#!ifdef WITH_PSTN
|
|
|
|
+# PSTN GW Routing
|
|
|
|
+#
|
|
|
|
+# - pstn.gw_ip: valid IP or hostname as string value, example:
|
|
|
|
+# pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
|
|
|
|
+#
|
|
|
|
+# - by default is empty to avoid misrouting
|
|
|
|
+pstn.gw_ip = "" desc "PSTN GW Address"
|
|
|
|
+#!endif
|
|
|
|
|
|
|
|
|
|
####### Modules Section ########
|
|
####### Modules Section ########
|
|
|
|
|
|
#set module path
|
|
#set module path
|
|
-mpath="/usr/local/lib/kamailio/modules/"
|
|
|
|
|
|
+mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
|
|
|
|
|
|
/* uncomment next line for MySQL DB support */
|
|
/* uncomment next line for MySQL DB support */
|
|
-#m#loadmodule "db_mysql.so"
|
|
|
|
|
|
+#!ifdef WITH_MYSQL
|
|
|
|
+loadmodule "db_mysql.so"
|
|
|
|
+#!endif
|
|
loadmodule "mi_fifo.so"
|
|
loadmodule "mi_fifo.so"
|
|
-loadmodule "sl.so"
|
|
|
|
|
|
+loadmodule "kex.so"
|
|
loadmodule "tm.so"
|
|
loadmodule "tm.so"
|
|
|
|
+loadmodule "tmx.so"
|
|
|
|
+loadmodule "sl.so"
|
|
loadmodule "rr.so"
|
|
loadmodule "rr.so"
|
|
loadmodule "pv.so"
|
|
loadmodule "pv.so"
|
|
loadmodule "maxfwd.so"
|
|
loadmodule "maxfwd.so"
|
|
@@ -121,11 +136,14 @@ loadmodule "textops.so"
|
|
loadmodule "uri_db.so"
|
|
loadmodule "uri_db.so"
|
|
loadmodule "siputils.so"
|
|
loadmodule "siputils.so"
|
|
loadmodule "xlog.so"
|
|
loadmodule "xlog.so"
|
|
|
|
+loadmodule "sanity.so"
|
|
|
|
+loadmodule "ctl.so"
|
|
|
|
+loadmodule "mi_rpc.so"
|
|
loadmodule "acc.so"
|
|
loadmodule "acc.so"
|
|
-/* uncomment next lines for MySQL based authentication support
|
|
|
|
- NOTE: a DB (like db_mysql) module must be also loaded */
|
|
|
|
-#a#loadmodule "auth.so"
|
|
|
|
-#a#loadmodule "auth_db.so"
|
|
|
|
|
|
+#!ifdef WITH_AUTH
|
|
|
|
+loadmodule "auth.so"
|
|
|
|
+loadmodule "auth_db.so"
|
|
|
|
+#!endif
|
|
/* uncomment next line for aliases support
|
|
/* uncomment next line for aliases support
|
|
NOTE: a DB (like db_mysql) module must be also loaded */
|
|
NOTE: a DB (like db_mysql) module must be also loaded */
|
|
#loadmodule "alias_db.so"
|
|
#loadmodule "alias_db.so"
|
|
@@ -134,12 +152,14 @@ loadmodule "acc.so"
|
|
NOTE: be sure and enable multi-domain support in all used modules
|
|
NOTE: be sure and enable multi-domain support in all used modules
|
|
(see "multi-module params" section ) */
|
|
(see "multi-module params" section ) */
|
|
#loadmodule "domain.so"
|
|
#loadmodule "domain.so"
|
|
-/* uncomment the next two lines for presence server support
|
|
|
|
- NOTE: a DB (like db_mysql) module must be also loaded */
|
|
|
|
-#p#loadmodule "presence.so"
|
|
|
|
-#p#loadmodule "presence_xml.so"
|
|
|
|
|
|
+#!ifdef WITH_PRESENCE
|
|
|
|
+loadmodule "presence.so"
|
|
|
|
+loadmodule "presence_xml.so"
|
|
|
|
+#!endif
|
|
|
|
|
|
-#n#loadmodule "nathelper.so"
|
|
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+loadmodule "nathelper.so"
|
|
|
|
+#!endif
|
|
|
|
|
|
# ----------------- setting module-specific parameters ---------------
|
|
# ----------------- setting module-specific parameters ---------------
|
|
|
|
|
|
@@ -185,31 +205,33 @@ modparam("acc", "log_flag", 1)
|
|
modparam("acc", "log_missed_flag", 2)
|
|
modparam("acc", "log_missed_flag", 2)
|
|
modparam("acc", "log_extra",
|
|
modparam("acc", "log_extra",
|
|
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
|
|
"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
|
|
-/* uncomment the following lines to enable DB accounting also */
|
|
|
|
-#c#modparam("acc", "db_flag", 1)
|
|
|
|
-#c#modparam("acc", "db_missed_flag", 2)
|
|
|
|
-#c#modparam("acc", "db_url",
|
|
|
|
-#c# "mysql://openser:openserrw@localhost/openser")
|
|
|
|
-#c#modparam("acc", "db_extra",
|
|
|
|
-#c# "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
|
|
|
|
-
|
|
|
|
|
|
+/* enhanced DB accounting */
|
|
|
|
+#!ifdef WITH_ACCDB
|
|
|
|
+modparam("acc", "db_flag", 1)
|
|
|
|
+modparam("acc", "db_missed_flag", 2)
|
|
|
|
+modparam("acc", "db_url",
|
|
|
|
+ "mysql://openser:openserrw@localhost/openser")
|
|
|
|
+modparam("acc", "db_extra",
|
|
|
|
+ "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
|
|
|
|
+#!endif
|
|
|
|
|
|
# ----- usrloc params -----
|
|
# ----- usrloc params -----
|
|
-/* uncomment the following lines if you want to enable DB persistency
|
|
|
|
- for location entries */
|
|
|
|
-#u#modparam("usrloc", "db_mode", 2)
|
|
|
|
-#u#modparam("usrloc", "db_url",
|
|
|
|
-#u# "mysql://openser:openserrw@localhost/openser")
|
|
|
|
|
|
+/* enable DB persistency for location entries */
|
|
|
|
+#!ifdef WITH_USRLOCDB
|
|
|
|
+modparam("usrloc", "db_mode", 2)
|
|
|
|
+modparam("usrloc", "db_url",
|
|
|
|
+ "mysql://openser:openserrw@localhost/openser")
|
|
|
|
+#!endif
|
|
|
|
|
|
# ----- auth_db params -----
|
|
# ----- auth_db params -----
|
|
-/* uncomment the following lines if you want to enable the DB based
|
|
|
|
- authentication */
|
|
|
|
-#a#modparam("auth_db", "calculate_ha1", yes)
|
|
|
|
-#a#modparam("auth_db", "password_column", "password")
|
|
|
|
-#a#modparam("auth_db", "db_url",
|
|
|
|
-#a# "mysql://openser:openserrw@localhost/openser")
|
|
|
|
-#a#modparam("auth_db", "load_credentials", "")
|
|
|
|
-
|
|
|
|
|
|
+/* enable the DB based authentication */
|
|
|
|
+#!ifdef WITH_AUTH
|
|
|
|
+modparam("auth_db", "calculate_ha1", yes)
|
|
|
|
+modparam("auth_db", "password_column", "password")
|
|
|
|
+modparam("auth_db", "db_url",
|
|
|
|
+ "mysql://openser:openserrw@localhost/openser")
|
|
|
|
+modparam("auth_db", "load_credentials", "")
|
|
|
|
+#!endif
|
|
|
|
|
|
# ----- alias_db params -----
|
|
# ----- alias_db params -----
|
|
/* uncomment the following lines if you want to enable the DB based
|
|
/* uncomment the following lines if you want to enable the DB based
|
|
@@ -233,20 +255,24 @@ modparam("acc", "log_extra",
|
|
|
|
|
|
|
|
|
|
# ----- presence params -----
|
|
# ----- presence params -----
|
|
-/* uncomment the following lines if you want to enable presence */
|
|
|
|
-#p#modparam("presence|presence_xml", "db_url",
|
|
|
|
-#p# "mysql://openser:openserrw@localhost/openser")
|
|
|
|
-#p#modparam("presence_xml", "force_active", 1)
|
|
|
|
-#p#modparam("presence", "server_address", "sip:192.168.1.2:5060")
|
|
|
|
-
|
|
|
|
-# -- nathelper
|
|
|
|
-#n#modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:7722")
|
|
|
|
-#n#modparam("nathelper", "natping_interval", 30)
|
|
|
|
-#n#modparam("nathelper", "ping_nated_only", 1)
|
|
|
|
-#n#modparam("nathelper", "sipping_bflag", 7)
|
|
|
|
-#n#modparam("nathelper", "sipping_from", "sip:[email protected]")
|
|
|
|
-#n#modparam("registrar|nathelper", "received_avp", "$avp(i:80)")
|
|
|
|
-#n#modparam("usrloc", "nat_bflag", 6)
|
|
|
|
|
|
+/* enable presence server support */
|
|
|
|
+#!ifdef WITH_PRESENCE
|
|
|
|
+modparam("presence|presence_xml", "db_url",
|
|
|
|
+ "mysql://openser:openserrw@localhost/openser")
|
|
|
|
+modparam("presence_xml", "force_active", 1)
|
|
|
|
+modparam("presence", "server_address", "sip:10.0.0.10:5060")
|
|
|
|
+#!endif
|
|
|
|
+
|
|
|
|
+# ----- nathelper -----
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:7722")
|
|
|
|
+modparam("nathelper", "natping_interval", 30)
|
|
|
|
+modparam("nathelper", "ping_nated_only", 1)
|
|
|
|
+modparam("nathelper", "sipping_bflag", 7)
|
|
|
|
+modparam("nathelper", "sipping_from", "sip:[email protected]")
|
|
|
|
+modparam("registrar|nathelper", "received_avp", "$avp(i:80)")
|
|
|
|
+modparam("usrloc", "nat_bflag", 6)
|
|
|
|
+#!endif
|
|
|
|
|
|
####### Routing Logic ########
|
|
####### Routing Logic ########
|
|
|
|
|
|
@@ -260,8 +286,14 @@ route{
|
|
exit;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(!sanity_check("1511", "7"))
|
|
|
|
+ {
|
|
|
|
+ xlog("Malformed SIP message from $si:$sp\n");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+
|
|
# NAT detection
|
|
# NAT detection
|
|
- route(4);
|
|
|
|
|
|
+ route(NAT);
|
|
|
|
|
|
if (has_totag()) {
|
|
if (has_totag()) {
|
|
# sequential request withing a dialog should
|
|
# sequential request withing a dialog should
|
|
@@ -271,11 +303,11 @@ route{
|
|
setflag(1); # do accounting ...
|
|
setflag(1); # do accounting ...
|
|
setflag(3); # ... even if the transaction fails
|
|
setflag(3); # ... even if the transaction fails
|
|
}
|
|
}
|
|
- route(1);
|
|
|
|
|
|
+ route(RELAY);
|
|
} else {
|
|
} else {
|
|
if (is_method("SUBSCRIBE") && uri == myself) {
|
|
if (is_method("SUBSCRIBE") && uri == myself) {
|
|
# in-dialog subscribe requests
|
|
# in-dialog subscribe requests
|
|
- route(2);
|
|
|
|
|
|
+ route(PRESENCE);
|
|
exit;
|
|
exit;
|
|
}
|
|
}
|
|
if ( is_method("ACK") ) {
|
|
if ( is_method("ACK") ) {
|
|
@@ -306,9 +338,11 @@ route{
|
|
t_check_trans();
|
|
t_check_trans();
|
|
|
|
|
|
# authentication
|
|
# authentication
|
|
- route(3);
|
|
|
|
|
|
+ route(AUTH);
|
|
|
|
|
|
# record routing for dialog forming requests (in case they are routed)
|
|
# record routing for dialog forming requests (in case they are routed)
|
|
|
|
+ # - remove preloaded route headers
|
|
|
|
+ remove_hf("Route");
|
|
if (is_method("INVITE|SUBSCRIBE"))
|
|
if (is_method("INVITE|SUBSCRIBE"))
|
|
record_route();
|
|
record_route();
|
|
|
|
|
|
@@ -321,41 +355,41 @@ route{
|
|
##if (!is_uri_host_local())
|
|
##if (!is_uri_host_local())
|
|
{
|
|
{
|
|
append_hf("P-hint: outbound\r\n");
|
|
append_hf("P-hint: outbound\r\n");
|
|
- # if you have some interdomain connections via TLS
|
|
|
|
- ##if($rd=="tls_domain1.net") {
|
|
|
|
- ## t_relay("tls:domain1.net");
|
|
|
|
- ## exit;
|
|
|
|
- ##} else if($rd=="tls_domain2.net") {
|
|
|
|
- ## t_relay("tls:domain2.net");
|
|
|
|
- ## exit;
|
|
|
|
- ##}
|
|
|
|
- route(1);
|
|
|
|
|
|
+ route(RELAY);
|
|
}
|
|
}
|
|
|
|
|
|
# requests for my domain
|
|
# requests for my domain
|
|
|
|
|
|
if( is_method("PUBLISH|SUBSCRIBE"))
|
|
if( is_method("PUBLISH|SUBSCRIBE"))
|
|
- route(2);
|
|
|
|
|
|
+ route(PRESENCE);
|
|
|
|
|
|
if (is_method("REGISTER"))
|
|
if (is_method("REGISTER"))
|
|
{
|
|
{
|
|
|
|
+ if(isflagset(5))
|
|
|
|
+ {
|
|
|
|
+ setbflag("6");
|
|
|
|
+ # uncomment next line to do SIP NAT pinging
|
|
|
|
+ ## setbflag("7");
|
|
|
|
+ }
|
|
if (!save("location"))
|
|
if (!save("location"))
|
|
sl_reply_error();
|
|
sl_reply_error();
|
|
|
|
|
|
exit;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|
|
- if ($rU==NULL) {
|
|
|
|
|
|
+ if ($rU==$null) {
|
|
# request with no Username in RURI
|
|
# request with no Username in RURI
|
|
sl_send_reply("484","Address Incomplete");
|
|
sl_send_reply("484","Address Incomplete");
|
|
exit;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ route(PSTN);
|
|
|
|
+
|
|
# apply DB based aliases (uncomment to enable)
|
|
# apply DB based aliases (uncomment to enable)
|
|
##alias_db_lookup("dbaliases");
|
|
##alias_db_lookup("dbaliases");
|
|
|
|
|
|
if (!lookup("location")) {
|
|
if (!lookup("location")) {
|
|
- switch ($retcode) {
|
|
|
|
|
|
+ switch ($rc) {
|
|
case -1:
|
|
case -1:
|
|
case -3:
|
|
case -3:
|
|
t_newtran();
|
|
t_newtran();
|
|
@@ -370,23 +404,25 @@ route{
|
|
# when routing via usrloc, log the missed calls also
|
|
# when routing via usrloc, log the missed calls also
|
|
setflag(2);
|
|
setflag(2);
|
|
|
|
|
|
- route(1);
|
|
|
|
|
|
+ route(RELAY);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-route[1] {
|
|
|
|
-#n# if (check_route_param("nat=yes")) {
|
|
|
|
-#n# setbflag(6);
|
|
|
|
-#n# }
|
|
|
|
-#n# if (isflagset(5) || isbflagset(6)) {
|
|
|
|
-#n# route(5);
|
|
|
|
-#n# }
|
|
|
|
|
|
+route[RELAY] {
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+ if (check_route_param("nat=yes")) {
|
|
|
|
+ setbflag("6");
|
|
|
|
+ }
|
|
|
|
+ if (isflagset(5) || isbflagset("6")) {
|
|
|
|
+ route(RTPPROXY);
|
|
|
|
+ }
|
|
|
|
+#!endif
|
|
|
|
|
|
/* example how to enable some additional event routes */
|
|
/* example how to enable some additional event routes */
|
|
if (is_method("INVITE")) {
|
|
if (is_method("INVITE")) {
|
|
- #t_on_branch("1");
|
|
|
|
- t_on_reply("1");
|
|
|
|
- t_on_failure("1");
|
|
|
|
|
|
+ #t_on_branch("BRANCH_ONE");
|
|
|
|
+ t_on_reply("REPLY_ONE");
|
|
|
|
+ t_on_failure("FAIL_ONE");
|
|
}
|
|
}
|
|
|
|
|
|
if (!t_relay()) {
|
|
if (!t_relay()) {
|
|
@@ -396,31 +432,32 @@ route[1] {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-# Presence route
|
|
|
|
-/* uncomment the whole following route for enabling presence server */
|
|
|
|
-route[2]
|
|
|
|
|
|
+# Presence server route
|
|
|
|
+route[PRESENCE]
|
|
{
|
|
{
|
|
-#p# if (!t_newtran())
|
|
|
|
-#p# {
|
|
|
|
-#p# sl_reply_error();
|
|
|
|
-#p# exit;
|
|
|
|
-#p# };
|
|
|
|
-#p#
|
|
|
|
-#p# if(is_method("PUBLISH"))
|
|
|
|
-#p# {
|
|
|
|
-#p# handle_publish();
|
|
|
|
-#p# t_release();
|
|
|
|
-#p# }
|
|
|
|
-#p# else
|
|
|
|
-#p# if( is_method("SUBSCRIBE"))
|
|
|
|
-#p# {
|
|
|
|
-#p# handle_subscribe();
|
|
|
|
-#p# t_release();
|
|
|
|
-#p# }
|
|
|
|
-#p# exit;
|
|
|
|
|
|
+#!ifdef WITH_PRESENCE
|
|
|
|
+ if (!t_newtran())
|
|
|
|
+ {
|
|
|
|
+ sl_reply_error();
|
|
|
|
+ exit;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ if(is_method("PUBLISH"))
|
|
|
|
+ {
|
|
|
|
+ handle_publish();
|
|
|
|
+ t_release();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ if( is_method("SUBSCRIBE"))
|
|
|
|
+ {
|
|
|
|
+ handle_subscribe();
|
|
|
|
+ t_release();
|
|
|
|
+ }
|
|
|
|
+ exit;
|
|
|
|
+#!endif
|
|
|
|
|
|
# if presence enabled, this part will not be executed
|
|
# if presence enabled, this part will not be executed
|
|
- if (is_method("PUBLISH") || $rU==null)
|
|
|
|
|
|
+ if (is_method("PUBLISH") || $rU==$null)
|
|
{
|
|
{
|
|
sl_send_reply("404", "Not here");
|
|
sl_send_reply("404", "Not here");
|
|
exit;
|
|
exit;
|
|
@@ -429,101 +466,138 @@ route[2]
|
|
}
|
|
}
|
|
|
|
|
|
# Authentication route
|
|
# Authentication route
|
|
-/* uncomment the whole following route for enabling authentication */
|
|
|
|
-route[3] {
|
|
|
|
-#a# if (is_method("REGISTER"))
|
|
|
|
-#a# {
|
|
|
|
-#a# # authenticate the REGISTER requests (uncomment to enable auth)
|
|
|
|
-#a# if (!www_authorize("", "subscriber"))
|
|
|
|
-#a# {
|
|
|
|
-#a# www_challenge("", "0");
|
|
|
|
-#a# exit;
|
|
|
|
-#a# }
|
|
|
|
-#a#
|
|
|
|
-#a# if ($au!=$tU)
|
|
|
|
-#a# {
|
|
|
|
-#a# sl_send_reply("403","Forbidden auth ID");
|
|
|
|
-#a# exit;
|
|
|
|
-#a# }
|
|
|
|
-#a# } else {
|
|
|
|
-#a# # authenticate if from local subscriber (uncomment to enable auth)
|
|
|
|
-#a# if (from_uri==myself)
|
|
|
|
-#a# {
|
|
|
|
-#a# if (!proxy_authorize("", "subscriber")) {
|
|
|
|
-#a# proxy_challenge("", "0");
|
|
|
|
-#a# exit;
|
|
|
|
-#a# }
|
|
|
|
-#a# if (is_method("PUBLISH"))
|
|
|
|
-#a# {
|
|
|
|
-#a# if ($au!=$tU) {
|
|
|
|
-#a# sl_send_reply("403","Forbidden auth ID");
|
|
|
|
-#a# exit;
|
|
|
|
-#a# }
|
|
|
|
-#a# } else {
|
|
|
|
-#a# if ($au!=$fU) {
|
|
|
|
-#a# sl_send_reply("403","Forbidden auth ID");
|
|
|
|
-#a# exit;
|
|
|
|
-#a# }
|
|
|
|
-#a# }
|
|
|
|
-#a#
|
|
|
|
-#a# consume_credentials();
|
|
|
|
-#a# # caller authenticated
|
|
|
|
-#a# }
|
|
|
|
-#a# }
|
|
|
|
|
|
+route[AUTH] {
|
|
|
|
+#!ifdef WITH_AUTH
|
|
|
|
+ if (is_method("REGISTER"))
|
|
|
|
+ {
|
|
|
|
+ # authenticate the REGISTER requests (uncomment to enable auth)
|
|
|
|
+ if (!www_authorize("", "subscriber"))
|
|
|
|
+ {
|
|
|
|
+ www_challenge("", "0");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ($au!=$tU)
|
|
|
|
+ {
|
|
|
|
+ sl_send_reply("403","Forbidden auth ID");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ # authenticate if from local subscriber (uncomment to enable auth)
|
|
|
|
+ if (from_uri==myself)
|
|
|
|
+ {
|
|
|
|
+ if (!proxy_authorize("", "subscriber")) {
|
|
|
|
+ proxy_challenge("", "0");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+ if (is_method("PUBLISH"))
|
|
|
|
+ {
|
|
|
|
+ if ($au!=$tU) {
|
|
|
|
+ sl_send_reply("403","Forbidden auth ID");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if ($au!=$fU) {
|
|
|
|
+ sl_send_reply("403","Forbidden auth ID");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ consume_credentials();
|
|
|
|
+ # caller authenticated
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+#!endif
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
# Caller NAT detection route
|
|
# Caller NAT detection route
|
|
-/* uncomment the whole following route for enabling Caller NAT Detection */
|
|
|
|
-route[4]{
|
|
|
|
-#n# force_rport();
|
|
|
|
-#n# if (nat_uac_test("19")) {
|
|
|
|
-#n# if (method=="REGISTER") {
|
|
|
|
-#n# fix_nated_register();
|
|
|
|
-#n# } else {
|
|
|
|
-#n# fix_nated_contact();
|
|
|
|
-#n# }
|
|
|
|
-#n# setflag(5);
|
|
|
|
-#n# }
|
|
|
|
|
|
+route[NAT]{
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+ force_rport();
|
|
|
|
+ if (nat_uac_test("19")) {
|
|
|
|
+ if (method=="REGISTER") {
|
|
|
|
+ fix_nated_register();
|
|
|
|
+ } else {
|
|
|
|
+ fix_nated_contact();
|
|
|
|
+ }
|
|
|
|
+ setflag(5);
|
|
|
|
+ }
|
|
|
|
+#!endif
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
# RTPProxy control
|
|
# RTPProxy control
|
|
-/* uncomment the whole following route for enabling RTPProxy Control */
|
|
|
|
-route[5] {
|
|
|
|
-#n# if (is_method("BYE")) {
|
|
|
|
-#n# unforce_rtp_proxy();
|
|
|
|
-#n# } else if (is_method("INVITE")){
|
|
|
|
-#n# force_rtp_proxy();
|
|
|
|
-#n# }
|
|
|
|
-#n# if (!has_totag()) add_rr_param(";nat=yes");
|
|
|
|
|
|
+route[RTPPROXY] {
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+ if (is_method("BYE")) {
|
|
|
|
+ unforce_rtp_proxy();
|
|
|
|
+ } else if (is_method("INVITE")){
|
|
|
|
+ force_rtp_proxy();
|
|
|
|
+ }
|
|
|
|
+ if (!has_totag()) add_rr_param(";nat=yes");
|
|
|
|
+#!endif
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
-branch_route[1] {
|
|
|
|
- xdbg("new branch at $ru\n");
|
|
|
|
-}
|
|
|
|
|
|
+# PSTN GW routing
|
|
|
|
+route[PSTN] {
|
|
|
|
+#!ifdef WITH_PSTN
|
|
|
|
+ # check if PSTN GW IP is defined
|
|
|
|
+ if (strempty($sel(cfg_get.pstn.gw_ip))) {
|
|
|
|
+ xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ # route to PSTN dialed numbers starting with '+' or '00'
|
|
|
|
+ # (international format)
|
|
|
|
+ # - update the condition to match your dialing rules for PSTN routing
|
|
|
|
+ if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
|
|
|
|
+ return;
|
|
|
|
|
|
-onreply_route[1] {
|
|
|
|
- xdbg("incoming reply\n");
|
|
|
|
|
|
+ # only local users allowed to call
|
|
|
|
+ if(from_uri!=myself) {
|
|
|
|
+ sl_send_reply("403", "Not Allowed");
|
|
|
|
+ exit;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
|
|
|
|
+
|
|
|
|
+ route(RELAY);
|
|
|
|
+ exit;
|
|
|
|
+#!endif
|
|
|
|
|
|
-#n# if ((isflagset(5) || isbflagset(6)) && status=~"(183)|(2[0-9][0-9])") {
|
|
|
|
-#n# force_rtp_proxy();
|
|
|
|
-#n# }
|
|
|
|
-#n# if (isbflagset(6)) {
|
|
|
|
-#n# fix_nated_contact();
|
|
|
|
-#n# }
|
|
|
|
|
|
+ return;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+# Sample branch router
|
|
|
|
+branch_route[BRANCH_ONE] {
|
|
|
|
+ xdbg("new branch at $ru\n");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+# Sample onreply route
|
|
|
|
+onreply_route[REPLY_ONE] {
|
|
|
|
+ xdbg("incoming reply\n");
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+ if ((isflagset(5) || isbflagset("6")) && status=~"(183)|(2[0-9][0-9])") {
|
|
|
|
+ force_rtp_proxy();
|
|
|
|
+ }
|
|
|
|
+ if (isbflagset("6")) {
|
|
|
|
+ fix_nated_contact();
|
|
|
|
+ }
|
|
|
|
+#!endif
|
|
|
|
+}
|
|
|
|
|
|
-failure_route[1] {
|
|
|
|
-#n# if (is_method("INVITE")
|
|
|
|
-#n# && (isbflagset(6) || isflagset(5))) {
|
|
|
|
-#n# unforce_rtp_proxy();
|
|
|
|
-#n# }
|
|
|
|
|
|
+# Sample failure route
|
|
|
|
+failure_route[FAIL_ONE] {
|
|
|
|
+#!ifdef WITH_NAT
|
|
|
|
+ if (is_method("INVITE")
|
|
|
|
+ && (isbflagset("6") || isflagset(5))) {
|
|
|
|
+ unforce_rtp_proxy();
|
|
|
|
+ }
|
|
|
|
+#!endif
|
|
|
|
|
|
- if (t_was_cancelled()) {
|
|
|
|
|
|
+ if (t_is_canceled()) {
|
|
exit;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|