====== Basic Kamailio configuration ====== ===== Which configuration file? ===== After [[installing]] Kamailio, there are three configuration templates in **/etc/kamailio**: root@SystemY:/etc/kamailio# ls -l total 72 -rw-r--r-- 1 root root 1745 Jan 19 10:08 dictionary.kamailio -rw-r--r-- 1 root root 22631 Jan 19 10:08 kamailio-advanced.cfg -rw-r--r-- 1 root root 14854 Jan 19 10:08 kamailio-basic.cfg -rw-r--r-- 1 root root 22163 Jan 19 10:08 kamailio.cfg -rw-r--r-- 1 root root 3737 Jan 19 10:08 kamctlrc The file **kamailio.cfg** is very similar to (but slightly unexpectedly different from) **kamailio-advanced.cfg**, so I decided to put that to one side and start from the basic version instead: root@SystemY:/etc/kamailio# mv kamailio.cfg kamailio-dist.cfg root@SystemY:/etc/kamailio# cp kamailio-basic.cfg kamailio.cfg I then edited **kamailio.cfg** (following the guidelines from the [[https://www.kamailio.org/wiki/tutorials/getting-started/main|wiki]]) to add MySQL and Authentication support, by adding the lines: #!define WITH_MYSQL #!define WITH_AUTH A little way below the first line **#!KAMAILIO**, but before any of the examples. My first impression of working with Kamailio is that it was very odd having functional directives in the configuration file which start with the comment lead-in character '#'... ===== Creating the database ===== The next step in the wiki guidelines says "Obviously, for the above to really work, you need to install MySQL server and create the database required by Kamailio (see **kamdbctl** tool). You need also to add subscribers (username/password to subscriber database table). You can use **kamctl** tool for managing subscriber records." So, I tried the **kamdbctl** tool, and got: root@SystemY:/etc/kamailio# kamdbctl ERROR: database engine not specified, please setup one in the config script Two things went through my mind here: - Yes, I have specified a database engine - I've just put "WITH_MYSQL" into /etc/kamailio/kamailio.cfg - Okay, if that's not the configuration file you're complaining about, how about telling me which "config script" needs MySQL specifying in it? Aha! Further down on the wiki page under **kamdbctl** is the comment "It uses the same configuration file like kamctl, respectively the kamctlrc." So, **that's** the configuration file it would have been nice for the error message to tell me needs adjusting... I uncommented the following parameters and set values for them: ## your SIP domain SIP_DOMAIN=my_domain.net ## database type: MYSQL, PGSQL, ORACLE, DB_BERKELEY, DBTEXT, or SQLITE # by default none is loaded # # If you want to setup a database with kamdbctl, you must at least specify # this parameter. DBENGINE=MYSQL ## database host DBHOST=localhost ## database name (for ORACLE this is TNS name) DBNAME=kamailio ## database read/write user DBRWUSER="kamailio" ## password for database read/write user DBRWPW="my_rw_password" ## database read only user DBROUSER="kamailioro" ## password for database read only user DBROPW="my_ro_password" ## database access host (from where is kamctl used) DBACCESSHOST=127.0.0.1 ## database super user (for ORACLE this is 'scheme-creator' user) DBROOTUSER="root" # user name column USERCOL="username" After saving the file, trying the **kamdbctl** command now gives: root@SystemY:/etc/kamailio# kamdbctl /usr/sbin/kamdbctl 4.4.0 usage: kamdbctl create ...(creates a new database) ...etc... So, it's now happy that it knows I want to use a database. Let's try creating one: root@SystemY:/etc/kamailio# kamdbctl create MySQL password for root: INFO: test server charset INFO: creating database kamailio ... INFO: granting privileges to database kamailio ... INFO: creating standard tables into kamailio ... INFO: Core Kamailio tables succesfully created. Install presence related tables? (y/n): y INFO: creating presence tables into kamailio ... INFO: Presence tables succesfully created. Install tables for imc cpl siptrace domainpolicy carrierroute userblacklist htable purple uac pipelimit mtree sca mohqueue rtpproxy? (y/n): y INFO: creating extra tables into kamailio ... INFO: Extra tables succesfully created. Install tables for uid_auth_db uid_avp_db uid_domain uid_gflags uid_uri_db? (y/n): y INFO: creating uid tables into kamailio ... INFO: UID tables succesfully created. Not knowing at this stage the benefits or drawbacks of creating any of the extra tables, I answered "yes" to each of the questions on the basis that I don't care if tables exist in MySQL which then never get used, but I find out I want to use one, I'd like it to exist... It would be nice if "successfully" were spelled correctly :) ===== Creating a user ===== So, heading back to the wiki, "You need also to add subscribers (username/password to subscriber database table). You can use **kamctl** tool for managing subscriber records." Let's see what the **kamctl** tool does now: root@SystemY:/etc/kamailio# kamctl /usr/sbin/kamctl 4.4.0 Existing commands: ...etc... There then follows a lengthy list of commands you can use with **kamctl**, including starting & stopping Kamailio (so, it sounds like I shouldn't be using the normal **/etc/init.d/kamailio restart** etc?). The command for managing subscribers are: * add .......... add a new subscriber (*) * show .................... show subscriber attributes (*) * passwd ......... change user's password (*) * rm ...................... delete a user (*) * sets ....... set string attribute (column value) * setn ....... set numeric attribute (column value) So, let's try adding a subscriber: root@SystemY:/etc/kamailio# kamctl add Polycom 834622a413e3c42c2dd8080c226bee85 new user 'Polycom' added root@SystemY:/etc/kamailio# kamctl show Polycom *************************** 1. row *************************** id: 2 username: Polycom domain: my_domain.net password: 834622a413e3c42c2dd8080c2 email_address: ha1: 832a1c4706237713837a0bd8e6876e0f ha1b: 20be01352f53a20caea1487745b789f5 rpid: NULL Looks good so far... **Edit**: No, that doesn't look so good - I specified a 32-character password (actually the MD5sum of "Polycom") and the database contains only 25 of them :( And, sure enough, asking MySQL for the column definitions in the 'subscriber' table shows me that passwords are stored to only 25 characters length! **BAH!** (The following continues as it was written before the above edit.) ===== Starting Kamailio ===== Let's try starting Kamailio and see what I get in the log files: root@SystemY:/etc/kamailio# kamctl start INFO: Starting Kamailio : ERROR: PID file /var/run/kamailio.pid does not exist -- Kamailio start failed Hm, well, of course the .pid file doesn't exist - I've just asked Kamailio to start, which should create it... Okay, let's go back to the standard way of starting services: Uncomment the following in **/etc/default/kamailio**: RUN_KAMAILIO=yes USER=kamailio GROUP=kamailio CFGFILE=/etc/kamailio/kamailio.cfg Start the service: root@SystemY:/etc/kamailio# /etc/init.d/kamailio start [....] Starting Kamailio SIP Server: kamailio:loading modules under config path: /usr/lib/x86_64-linux-gnu/kamailio/modules/ Listening on udp: 127.0.0.1:5060 udp: 213.138.113.127:5060 tcp: 127.0.0.1:5060 tcp: 213.138.113.127:5060 Aliases: tcp: SystemY:5060 tcp: SystemY.voxspan.net:5060 tcp: localhost:5060 tcp: localhost.localdomain:5060 udp: SystemY:5060 udp: SystemY.voxspan.net:5060 udp: localhost:5060 udp: localhost.localdomain:5060 . ok Now **that's** more like it :) What's in the log file? Well, there's a whole load of stuff in **/var/log/messages** and **/var/log/syslog** (not sure I like that, I'd prefer to get things in **/var/log/kamailio.log** or similar - I'll see how to change that, I think. However, amongst the entries in **/var/log/syslog** are lots of: Mar 1 15:04:58 systemy /usr/sbin/kamailio[15636]: ERROR: db_mysql [km_my_con.c:124]: db_mysql_new_connection(): driver error: Access denied for user 'kamailio'@'localhost' (using password: YES) So, when I gave **kamdbctl** the root MySQL password, did it not set up the Kamailio users? No, there's a **kamailio** database in MySQL, it contains a table **subscribers**, which has a single entry for the user **Polycom**, and there are MySQL users **'kamailio'@'localhost'** and **'kamailioro'@'localhost'** as well as the same usernames **@'127.0.0.1'**. The Mysql GRANT privileges also look okay. So, that's not the problem... Ah - the output from **/etc/init.d/kamailio start** is disappointingly misleading: root@SystemY:/var/log# /etc/init.d/kamailio restart [ ok ] Stopping Kamailio SIP Server: kamailio:. [....] Starting Kamailio SIP Server: kamailio:loading modules under config path: /usr/lib/x86_64-linux-gnu/kamailio/modules/ Listening on udp: 127.0.0.1:5060 udp: aaa.bbb.ccc.ddd:5060 tcp: 127.0.0.1:5060 tcp: aaa.bbb.ccc.ddd:5060 Aliases: tcp: SystemY:5060 tcp: SystemY.my_domain.net:5060 tcp: localhost:5060 tcp: localhost.localdomain:5060 udp: SystemY:5060 udp: SystemY.my_domain.net:5060 udp: localhost:5060 udp: localhost.localdomain:5060 . ok root@SystemY:/var/log# /etc/init.d/kamailio status [FAIL] Status of Kamailio SIP Server: :[....] kamailio is not running ... failed! So, that encouraging-looking **ok** at the end of the output from the **start** command does not in fact mean that it successfully started and is running :( Let's try turning on some debugging, and also get the logging to its own file, not to syslog. Well, it [[http://thyrusgorges.com/post/kamailio-log-message-to-custom-log-file/|appears]] that you can't tell Kamailio to log to its own file; you have to configure syslog to split it out instead. Oh well... So, lines changed in **/etc/kamailio/kamailio.cfg**: #!define WITH_DEBUG log_stderror=no Added to **/etc/rsyslog.conf**: local0.* -/var/log/kamailio.log See if it's worked: ===== Really starting Kamailio ===== root@SystemY:/etc# /etc/init.d/rsyslog restart [ ok ] Stopping enhanced syslogd: rsyslogd. [ ok ] Starting enhanced syslogd: rsyslogd. root@SystemY:/etc# ls -l /var/log/kamailio.log -rw-r----- 1 root adm 0 Mar 1 15:30 kamailio.log root@SystemY:/etc# /etc/init.d/kamailio restart [ ok ] Stopping Kamailio SIP Server: kamailio:. [....] Starting Kamailio SIP Server: kamailio:loading modules under config path: /usr/lib/x86_64-linux-gnu/kamailio/modules/ Listening on udp: 127.0.0.1:5060 udp: 213.138.113.127:5060 tcp: 127.0.0.1:5060 tcp: 213.138.113.127:5060 Aliases: tcp: SystemY:5060 tcp: SystemY.voxspan.net:5060 tcp: localhost:5060 tcp: localhost.localdomain:5060 udp: SystemY:5060 udp: SystemY.voxspan.net:5060 udp: localhost:5060 udp: localhost.localdomain:5060 . ok root@SystemY:/etc# ls -al /var/log/kamailio.log -rw-r----- 1 root adm 110238 Mar 1 15:31 kamailio.log Success! We now have 110k of debug-level logs in a file separate from **/var/log/messages** and **/var/log/syslog**. Much neater. Does it tell us what the problem with the MySQL users is? Some way down the file I see: Mar 1 15:31:08 SystemY kamailio: DEBUG: [cfg.lex:1813]: pp_define_get(): ### returning define ID [DBURL] value ["mysql://kamailio:kamailiorw@localhost/kamailio"] ...which looks to me very much as though it's trying to use the default password of **kamailiorw** and not the password I defined in the config file... root@SystemY:/etc/kamailio# grep -r kamailiorw . ./kamailio-basic.cfg:#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio" ./kamailio-dist.cfg:#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio" ./kamailio-advanced.cfg:#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio" ./kamailio.cfg:#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio" Aha - I not only have to define the database user & password in **/etc/kamailio/kamctlrc**, but also in **/etc/kamailio/kamailio.cfg** - what a nice opportunity for change mismanagement :( ===== Getting Kamailio talking to MySQL ===== So, I edit **/etc/kamailio/kamailio.cfg** to contain: #!define DBURL "mysql://kamailio:my_rw_password@localhost/kamailio" ...and try again: root@SystemY:/etc/kamailio# /etc/init.d/kamailio start [....] Starting Kamailio SIP Server: kamailio:loading modules under config path: /usr/lib/x86_64-linux-gnu/kamailio/modules/ Listening on udp: 127.0.0.1:5060 udp: aaa.bbb.ccc.ddd:5060 tcp: 127.0.0.1:5060 tcp: aaa.bbb.ccc.ddd:5060 Aliases: tcp: SystemY:5060 tcp: SystemY.my_domain.net:5060 tcp: localhost:5060 tcp: localhost.localdomain:5060 udp: SystemY:5060 udp: SystemY.my_domain.net:5060 udp: localhost:5060 udp: localhost.localdomain:5060 . ok root@SystemY:/etc/kamailio# /etc/init.d/kamailio status [ ok ] Status of Kamailio SIP Server: :[....] kamailio is running. So, it appears to have started :) It's only listening on IPv4 so far, but we'll come to IPv6 later (I hope - I assume it can do IPv6 these days?) **netstat** also confirms I now have a listener on TCP and UDP ports 5060. ===== Does it work? ===== Let's trying configuring a phone to register to it and see what shows up in the log file: Hm, 848 lines (529 DEBUG, 319 ERROR) in the first minute - the phone tried to register 11 times, unsuccessfully. I wonder what I missed... **Edit**: After finding out that a 32-character password gets __silently__ (**GRRRRR...**) truncated to 25 characters, I changed the password on the telephone, and in **kamctl**, to something shorter, but the problem still remains - the phone cannot register. So, we've now run out of "[[https://www.kamailio.org/wiki/tutorials/getting-started/main|Getting Started]]" documentation from the wiki, and although I've clearly managed to get Kamailio running, it's not exactly useful if it won't even accept a Register from a SIP phone. Let's try looking for some more documentation... [[https://telnyx.com/sip-trunk-registration-kamailio/]] suggests adding **#!define WITH_USRLOCDB** to the configuration file, however doing that (and then restarting Kamailio) still doesn't enable the phone to register. Oh, the magic turns out to be **#!define WITH_NAT**, which has to go into **/etc/kamailio/kamailio.cfg** (How many people **don't** have their phones behind a NAT connection...? Surely this should be the default assumption for a "Getting Started" guide... Come to that, why not just support NAT by default - what's going to go wrong if a non-NATted client then comes along and registers?) So, I finally got Kamailio installed and configured to the point where a phone could register to it. BTW: **#!define WITH_USRLOCDB** wasn't necessary - removing it still allows the phone to register, so until I found out a good reason to include this, it's staying out. Next, let's see if I can get Kamailio to [[register]] to another SIP provider... Oh, no, before we do that, let's find out if simply adjusting the length of the password field in the MySQL table definition allows us to use a more than 25-character-long password... root@SystemY:/etc/kamailio# mysql -p kamailio Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 463 Server version: 5.5.54-0+deb7u2-log (Debian) mysql> alter table subscriber change password password varchar(64); Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> update subscriber set password='834622a413e3c42c2dd8080c226bee85'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> exit Bye root@SystemY:/etc/kamailio# /etc/init.d/kamailio restart //Reconfigure and restart phone// **YES**, it works :) So, a simple change to the MySQL field definitions is all that's needed to allow >25 character SIP passwords. So, on with getting Kamailio to [[register]] to another SIP provider... ---- [[.:|Go up]]\\ Return to [[:|main index]].