Kamailio installazione e configurazione

Kamailio è un SIP Server Open Source rilasciato su licenza GPLv2+, capace di gestire migliaia di call setup al secondo, e con il pieno supporto del protocollo SIP definito in IETF RFC 3261, inclusi i vari annessi e addon. L’utilizzo principale di Kamailio è quello di un SIP Proxy per il routing di messaggi SIP, ma ci sono poi tutte una serie funzionalità aggiuntive supportate e descritte sul sito ufficiale al link https://www.kamailio.org/w/. Sulla documentazione ufficiale si trovano i dettagli dei vari moduli supportati dal sistema, qui invece andiamo a vedere brevemente come installare Kamailio e come configurarlo per la gestione di chiamate in ingresso.

Installare ed avviare Kamailio

Come ambiente di setup useremo un server CentOS 7.

	yum install yum-utils
	yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo

Controlliamo quindi la presenza del repository per i pacchetti Kamailio kamailio.repo in /etc/yum.repos.d

	[kamailio]
	name=Kamailio - latest - Packages for the Kamailio latest release
	baseurl=https://rpm.kamailio.org/centos/$releasever/latest/$basearch/
	enabled=1
	metadata_expire=30d
	repo_gpgcheck=0
	gpgkey=https://rpm.kamailio.org/rpm-pub.key
	type=rpm
	skip_if_unavailable=True
	...
	...

Installare Kamailio

	yum install kamailio

Una volta installato, troveremo i file di configurazione in /etc/kamailio (il file di configurazione è kamailio.cfg) e lo unit file è già predisposto per poter avviare il sistema.

Configurare la gestione dei log

La configurazione base di Kamailio prevede la generazione dei log sulla facility local0, quindi per una corretta gestione dei log occorre intervenire sul file /etc/rsyslog.conf come segue:

Aggiungiamo la riga

	#kamailio log
	local0.*   -/var/log/kamailio/kamailio.log

Inoltre possiamo disabilitare la scrittura dei log prodotti da Kamailio nel messages

	# Don't log private authentication messages!
	*.info;mail.none;authpriv.none;cron.none;local0.none		/var/log/messages

Configuriamo poi la log rotation, aggiungendo il file /etc/logrotate.d/kamailio

	/var/log/kamailio/kamailio.log {
	missingok
	notifempty
	size 50M
	rotate 5
	dateformat -%Y%m%d-%s
	postrotate
	  /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
	endscript
	}

Infine creiamo il folder ed il file dove verrano prodotti i log

	mkdir -p /var/log/kamailio
	touch /var/log/kamailio/kamailio.log
	systemctl restart rsyslog

Possiamo quindi avviare Kamailio con la sua configurazione di default

	systemctl start kamailio

Configurare Kamailio per ruotare una chiamata ricevuta

Supponiamo adesso di voler configurare il sistema per ricevere una chiamata effettuata da un client verso un certo numero ed inoltrarla ad un server di destinazione. Nel mio caso ho usato il simulatore sipp sia come client, che some server (trovate qui una breve guida di installazione e configurazione), attivando due istanze di esecuzione sulla stessa macchina, ma ovviamente su porte diverse. Scendendo più nel dettaglio la mia topologia di rete è la seguente:

  • SIP Client: IP 10.0.1.66 porta 5065
  • Kamailio SIP Proxy: IP 10.0.1.215 porta 5060
  • SIP Server: IP 10.0.1.66 porta 5060

Nel file di configurazione /etc/kamailio/kamailio.cfg come prima cosa commentiamo la riga if (uri==myself) return; nella route SIPOUT altrimenti Kamailio non effettuerà il RELAY di chiamate dirette a se stesso

	# Routing to foreign domains
	route[SIPOUT] {
		#if (uri==myself) return;

		append_hf("P-Hint: outbound\r\n");
		route(RELAY);
		exit;
	}

Poi andiamo ad aggiungere la nostra regola di routing all’interno della route RELAY

	route[RELAY] {

		# enable additional event routes for forwarded requests
		# - serial forking, RTP relaying handling, a.s.o.
		if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
			if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
		}
		if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
			if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
		}
		if (is_method("INVITE")) {
			if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
		}
		if (is_method("INVITE")) {
			if ($rU == "12345") {
				if (!t_relay_to_udp("10.0.1.66","5060")) {
					sl_reply_error();
				}
			}
		}
			else if (is_method("ACK")) {
					t_relay();
			}
			else if (is_method("BYE")) {
					t_relay();
			}
		else {
			if (!t_relay()) {
				sl_reply_error();
			}
		}
		exit;
	}

In particolare stiamo intercettando la parte User della Request Uri (12345) presente sull’INVITE ricevuto e stiamo effettuando il relay verso il server. L’immagine che segue mostra l’intero call flow della chiamata tra gli elementi della nostra semplice rete di test. Dopo aver modificato la configurazione è necessario riavviare Kamailio.

Basic SIP Call

Il call flow è stato ottenuto tramite il tool sngrep installato sulla stessa macchina che ospita Kamailio.