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.
Il call flow è stato ottenuto tramite il tool sngrep installato sulla stessa macchina che ospita Kamailio.