SIP : comment débugger ?

Introduction

Votre nouveau serveur VoIP est en place. Mais pour une raison que vous ignorez vos appels ne fonctionnent pas comme prévus. Pas de panique, je vais vous présenter quelques outils en ligne de commande qui vont vous aider à déterminer la source du problème. En effet, le protocole SIP n’est pas toujours aussi simple à l’usage que dans la théorie. Les informations fournies par les systèmes de téléphonie Open Source (Asterisk, Freeswitch, Yate …) ou propriétaires ne sont pas toujours d’une grande aide (manque de lisibilité, de souplesse …).

Pourquoi des outils en ligne de commande : l’installation est simple et très rapide, fonctionnent sur toutes les distributions linux, et l’information souhaitée est facilement et rapidement accessible. Il est tout à fait possible d’utiliser ces outils afin de sauvegarder les informations collectées dans un fichier afin de réaliser des analyses plus fines avec des logiciels intégrant une interface graphique, comme le renommé Wireshark.

Pré requis

Vous vous êtes assuré de la bonne configuration de vos comptes SIP (du moins sur le papier), que le routage (diaplan) est correctement fait et que les appels sont possibles (droits d’accès à la route bien affectés, balance financière positive …). Si pour vous, vous ne voyez pas de loup à cette étape, nous allons entrer dans le dur.

Procédure

Je vais maintenant vous expliquer comment trouver de manière efficace la source du problème. Nous allons du plus général vers le plus détaillé. Tout d’abord, vérifier que les échanges de messages SIP se passent comme prévus (je ne vais pas les rappeler ici, je vous laisse ressortir vos cours. J’écrirais peut-être un de ces jours un article les détaillants) : enregistrement, établissement d’un appel, raccroché de l’appel. Si une des étapes est manquantes, il va falloir trouver des informations détaillées. Nous allons voir ces étapes dans le paragraphe suivant.

Comment tracer les messages SIP

Nous allons dans un premier temps vérifier que les messages SIP échanger sont conforment. Nous n’avons pas besoin de tout le détail, juste du type de message SIP (100, 180, 407, 404 …). On va ainsi pouvoir voir très simplement à quelle étape le problème se pose. Le serveur distant souhaite que le compte soit enregistrer avant d’autoriser un appel (merde, on m’avait dit que c’était une authentification par IP ?), le serveur distant vous répond par un bon 404 ? …

Pour cela, je vais utiliser tshark, outil renommé de tout bon administrateur linux. Il utilise la librairie pcap pour capturer le traffic de l’interface déclarée (avec l’option -i) et affiche (ou enregistre dans un fichier avec l’option -w) les informations décodées de paquets capturés. Les fichiers de capture créés peuvent être lus par Wireshark.

Nous allons utiliser toute la puissance de filtrage de tshark afin de trouver l’information souhaitée. Par exemple, il faut vérifier que l’invite correspond bien au format attendu.

tshark -i eth0 -R "ip.addr==78.x.y.10 and sip.CSeq.method eq INVITE" (-V)

Si vous souhaitez capturer l’ensemble du traffic SIP d’une adresse ip spécifique et d’un port spécifique :

tshark -i eth0 -R "ip.addr==78.x.y.10 and port==5060" -z sip,stat

Un autre outil fort utile peut être utilisé, j’ai nommé tcpdump.

tcpdump est un analyseur de paquet. Il utilise libpcap, une librairie C/C++ afin de capturer les paquets.  Vous devez avoir les droits de super utilisateur afin de pouvoir l’utiliser.

Nous allons voir le détail de la commande à utiliser :

-i eth0 — le nom de l’interface à écouter

-n — afin de ne pas résoudre les hostnames

host 1.2.3.4 — filtre le traffic sur cette adresse IP (peut être remplacé par net pour capturer un réseau ex : net 1.2.3.0/24)

proto udp — en général on utilise de l’udp

-w /tmp/file.pcap — pour enregistrer la capture dans un fichier. Mais comme on souhaite avoir le retour en console, on ne vas pas ajouter cette option.

Vous trouverez le détail des options de la commande de tcpdump sur cette page.

Conclusion

Nous venons de voir de manière simple comment débugger un chance SIP entre 2 machines. Vous pouvez utiliser la capture afin de l’importer dans un GUI comme Wireshark afin de réaliser des recherches plus poussées, afficher une vue graphique des échanges ou générer des statistiques.

Il est aussi possible d’utiliser d’autres outils comme ngrep. Je vous présenterai dans un prochain article l’outil HOMER.

Text to speech : comment utiliser festival, eSpeak et GoogleTTS avec asterisk, solution de téléphonie open source

Introduction

Il est souvent indispensable de diffuser des messages spécifiques aux appelants, des messages pouvant changer selon le contexte de l’appel (numéro appelé, numéro de compte saisi …). Il est difficile de prévoir tous les cas et d’enregistrer en studio à l’avance toutes les éventualités sans même parler du coût. Je vous propose d’utiliser un service de google permettant de générer un signal audio à partir d’un texte.

Nous allons voir dans cet article 3 moyens différents de réaliser de la synthèse vocale pour notre serveur asterisk.

Note : toutes les commandes sont pour une machine fonctionnant sous debian/ubuntu, mais vous pouvez simplement les transposer pour un autre système d’exploitation linux.

Qu’est-ce que le text to speech ?

Text to speech ou TTS pour les intimes, est une technique informatique permettant de transformer un texte écrit en parole artificielle, autrement dit, c’est de la synthèse vocale. Je vous renvoie sur wikipedia afin de découvrir l’histoire et les techniques de la synthèse vocale.

Il existe plusieurs solutions libres de synthèse vocale : Festival et eSpeak sont les 2 les plus connues fonctionnant sous linux. Nous allons voir l’installation et l’usage sous asterisk.

Une autre solution non libre, mais gratuite et qui à l’avantage de la simplicité : GoogleTTS. GoogleTTS est un service en ligne de Google (ah bon ?) réalisant de la synthèse vocale et qui est de plus, de bonne qualité.

Solution de synthèse vocale Festival

Installation

L’installation est très simple, le paquet étant disponible dans les repos de Debian et Ubuntu mais aussi de Centos.

apt-get install festival speech-tools

Ensuite, vous devez modifier le fichier festival.scm afin de permettre à asterisk de se connecter au serveur festival. Le fichier est situé dans le répertoire /usr/share/festival/

(define (tts_textasterisk string mode)
"(tts_textasterisk STRING MODE)
Apply tts to STRING. This function is specifically designed for
use in server mode so a single function call may synthesize the string.
This function name may be added to the server safe functions."
(let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string)))))
(utt.wave.resample wholeutt 8000)
(utt.wave.rescale wholeutt 5)
(utt.send.wave.client wholeutt)))

Ensuite, il faut démarrer le serveur festival avec la commande suivante :

festival --server 2>&1 > /dev/null &

Bine entendu, il est souhaitable de l’ajouter au fichier /etc/rc.local afin que le serveur festival soit lancé au démarrage de la machine.

Maintenant, nous devons paramétrer asterisk afin de lui indiquer où joindre notre serveur festival. Pour cela il faut modifier le fichier /etc/asterisk/festival.conf comme ci-dessous :

[general]
host=localhost
port=1314
;usecache=yes
;cachedir=/var/lib/asterisk/festivalcache/
festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n

Maintenant, nous allons vérifier que le module est bien chargé par asterisk en entrant cette commande en cli :

CLI> core show application festival

  -= Info about application 'Festival' =-

[Synopsis]
Say text to the user.

[Description]
Connect to Festival, send the argument, get back the waveform, play it to
the user, allowing any given interrupt keys to immediately terminate and return
the value, or 'any' to allow any number back (useful in dialplan).

[Syntax]
Festival(text[,intkeys])

[Arguments]
Not available

[See Also]
Not available

Si vous obtenez une sortie comme celle-ci , c’est parfait, sinon chargez le module manuellement :

CLI> module load app_festival.so

Utilisation

Nous allons maintenant le tester en modifiant le fichier /etc/asterisk/extensions.conf :

;Festival demo
exten => s, 1, Answer()
exten => s, n, Festival('Welcome! Your phone number is ${CALLERID(num)}.')
exten => s, n, Hangup()

Le résultat est acceptable sans être exceptionnel. Je ne vous ai pas présenté l’installation de la langue française, car la qualité n’est pas suffisante en regard des autres solutions que je vais présenter dans la suite de ce post. Mais comme festival est une solution open source nativement intégrée avec asterisk, il me semblait important de vous en parler.

Solution de synthèse vocale eSpeak

Installation

Tout d’abord, il faut installer les fichiers de développement d’asterisk. Ensuite, il est d’installer eSpeak. Pour nous simplifier la vie, nous allons utiliser les paquets, mais pour un serveur de production je vous encourage à installer eSpeak via les sources.

apt-get install espeak
apt-get install asterisk-espeak

L’installation via les paquets est maintenant terminée.

Utilisation

Nous allons voir l’utilisation de eSpeak au sein du dialplan asterisk. La commande à utiliser est Espeak et est assez simple à utiliser. Voici la syntaxe :

Espeak(text[,intkeys,language])

Le texte est entre guillemets, intkey peut prendre 2 valeurs, soit any, soit une des touches du téléphones et language la langue souhaitée. Voici un exemple :

;eSpeak Demo

exten => 1234,1,Answer()

;;Play mesage using default language as set in espeak.conf

exten => 1234,n,Espeak("This is a simple espeak test in english.",any)

;;Play message in Spanish

exten => 1234,n,Espeak("Esta es una simple prueba espeak en español.",any,es)

;;Play message in Greek

exten => 1234,n,Espeak("Αυτό είναι ένα απλό τέστ του espeak στα ελληνικά.",any,el)

;;Read a text file from disk (relative to the channel language)

;;and play it with espeak using the asterisk channel language.

exten => 1234,n,ReadFile(MYTEXT=/path/${LANGUAGE}/myfile,200)

exten => 1234,n,Espeak("${MYTEXY}",any,${LANGUAGE})

exten => 1234,n,Hangup()

Le logiciel est sous licence GPL, vous êtes donc libre de l’utiliser et bien entendu de l’améliorer.

Solution de synthèse vocale GoogleTTS

Installation

Afin d’utiliser GoogleTTS sur notre serveur asterisk, il est nécessaire que notre serveur ait un accès à internet (le script doit faire appel aux serveurs de Google) mais il nécessite aussi l’installation des paquets suivants :

apt-get install perl libwww-perl sox mpg123

Ensuite, nous allons utiliser un script AGI développer par Zaf, asterisk-googletts. Le script est développé en PERL.

Premièrement, localisez l’emplacement du dossier agi-bin afin d’y installer le script. Pour cela, vérifiez la variable astagidir dans le fichier asterisk.conf . Ensuite téléchargez le fichier googletts.agi dans ce répertoire :

wget https://raw.github.com/zaf/asterisk-googletts/master/googletts.agi
chmod +x googletts.agi

Maintenant, vous avez terminé l’installation !.

Utilisation

L’utilisation est extrêmement simple. Il suffit de faire un appel agi afin d’utiliser la synthèse vocale. Voici un exemple simple :

;DEMO GoogleTTS
exten => S,1,Answer()
exten => s,n,agi(googletts.agi,"Asterisk vous parle enfin.",fr)
exten => s,n,Hangup()

Un peu d’explication : googgletts.agi accepte plusieurs variables (4) que nous allons détailler :

  • La première contient le texte. L’exemple est parlant !
  • La seconde contient la langue qui doit être utilisée (par défaut en-US). La liste est très longue.
  • Les autres variables sont optionnelles :
    • 3ème variable : elle peut prendre soit la valeur « any » ou n’importe quel chiffre ou # ou * . Quand un de ces éléments est saisi par l’appelant sur son clavier téléphonique, la lecture du texte est arrêtée.
    • 4ème variable correspond à la vitesse de lecture (par défaut la valeur vaut 1). Vous pouvez accélérer la lecture en utilisant par exemple cette valeur 1.2 .

L’utilisation est assez simple et le résultat est convaincant. La communication avec les serveurs de Google se fait en clair, mais il est possible d’utiliser une connexion cryptée (pour cela, il faut modifier le script PERL.

Conclusion

Nous avons vu 3 solutions différentes afin de réaliser de la synthèse vocale sous asterisk. Sachez qu’il en existe d’autres gratuites ou payantes de différente qualité. A part festival dont la qualité me semble juste, eSpeak et GoogleTTS apporte une qualité suffisante pour la plus part des installations. Quelle solution utilisez-vous ?

Asterisk : Comment configurer odbc pour stocker les cdr dans mysql

Procédure afin d’installer et configurer odbc pour un serveur linux debian afin d’y stocker nos précieux CDR.

Introduction

Tout d’abord nous allons supposer que les serveurs Asterisk et MySQL sont parfaitement installés et configurés (et sécurisés 🙂 ). Ce n’est pas l’objet de ce guide (Howto).

Installation d’ODBC

Nous allons commencer par installer les drivers ODBC nécessaires. Installer les paquets nécessaires pour le bon fonctionnement de ODBC et MySQL :

apt-get install unixodbc libmyodbc unixodbc iodbc

Maintenant, nous allons configurer odbc afin de se connecter à notre serveur MySQL.

Paramétrage de ODBC

Editer le fichier suivant /etc/odbcinst.ini, et copier les éléments suivants :

[MySQL]
Description = MySQL ODBC Driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout = 0
CPReuse = 0

Maintenant, il faut éditer /etc/odbc.ini et ajouter le code suivant :

[MySQL-asterisk]
Description = Connection to MySQL
Driver = MySQL
Socket = /var/run/mysqld/mysqld.sock
Server = localhost
User = YourUsername
Password = YourPassword
Database = YourDatabase
Option = 3

N’oublier pas d’adapter le User, Password et Database selon vos éléments, sinon vous obtiendrez une belle erreur !.

Création de la base de données CDR

Connectez vous à votre serveur MySQL et entrez le code suivant (attention aux espaces qui peuvent causer des erreurs)

CREATE TABLE cdr(calldate DATETIME NOT NULL,clid varchar(80) NOT NULL DEFAULT'aDefaultValue',src varchar(80) NOT NULL DEFAULT 'aDefaultValue',dstVARCHAR(80) NOT NULL DEFAULT 'aDefaultValue',dcontext VARCHAR(80) NOT NULLDEFAULT  'aDefaultValue',channel VARCHAR(80) NOT NULL DEFAULT 'aDefaultValue',dstchannel VARCHAR(80) NOT NULL DEFAULT'aDefaultValue',lastapp VARCHAR(80) NOT NULL DEFAULT  'aDefaultValue',lastdataVARCHAR(80) NOT NULL DEFAULT  'aDefaultValue',duration int(11) NOT NULLDEFAULT '0',billsec int(11) NOT NULL DEFAULT '0',disposition VARCHAR(45) NOTNULL DEFAULT  'aDefaultValue',amaflags int(11) NOT NULL DEFAULT'0',accountcode VARCHAR(20) NOT NULL DEFAULT  'aDefaultValue',uniqueidVARCHAR(32) NOT NULL DEFAULT  'aDefaultValue',userfield VARCHAR(255) NOT NULLDEFAULT 'aDefaultValue');

GRANT ALL PRIVILEGES ON YourDatabase.* TO YourUsername@localhost IDENTIFIED BY 'YourPassword';

FLUSH PRIVILEGES;

Il faut tester le bon fonctionnement de notre connecteur ODBC avant d’aller plus loin. Entrez cette commande dans votre terminal :

isql -v MySQL-asterisk

Si tout fonctionne correctement, vous êtes connecté, sinon vous devriez voir un gentil message d’erreur 🙁 .

Paramétrage d’asterisk

Configuration d’ODBC

Nous allons commencer par paramétrer les fichiers de configuration d’Asterisk afin qu’il puisse utiliser ODBC afin de se connecter au serveur MySQL. Pour cela, nous allons éditer le fichier /etc/asterisk/res_odbc.conf et y ajouter :

[mysql]
enabled => yes
dsn => MySQL-asterisk
username => YourUsername
password => YourPassword
pre-connect => yes

puis, éditer le fichier /etc/asterisk/cdr_odbc.conf, et remplacer les lignes par celles-ci :

[global]
dsn=MySQL-asterisk
;username=asterisk
;password=asterisk
loguniqueid=yes
dispositionstring=yes
table=cdr ;"cdr" is default table name
usegmtime=no

Configuration de cdr.conf

Pour cela, nous allons éditer le fichier /etc/asterisk/cdr.conf et activer l’enregistrement des CDR dans une base de données via ODBC. Pour cela modifier au début du fichier :

enabled = yes

puis ajouter à la fin du fichier les lignes suivantes :

[odbc]
usegmtime=yes
loguniqueid=yes
loguserfiled=yes

Et maintenant redémarrer votre serveur Asterisk, connectez vous à la console et vérifier que le module res_odbc est bien chargé (reload res_odbc). faites de même avec le module cdr_odbc.

Puis faites un appel afin de vérifier que son CDR est bien dans la base de données.

Conclusion

Après avoir suivi attentivement ce guide, vous avez maintenant une installation Asterisk où vous pouvez enregistrer vos CDR via ODBC dans une base de données MySQL locale ou distante. Vous pouvez ainsi par exemple stocker les CDRs de vos serveurs Asterisk dans une base de données centralisées afin d’exploiter des données riches avec une application comme CDR-STATS, afin d’analyser vos appels et extraire de jolies stats pour les chefs.

 

[revue de presse] Asterisk présenté dans Linux Magazine Avril 2014

Ce mois-ci vous découvrirez un article présentant Asterisk. N’ayant pas encore reçu mon magazine, je ne vous donnerais donc pas d’avis. Mais, si cet article est dans ce magazine, c’est qu’il est de bon niveau. Je vous ferais un retour après lecture. Un autre article qui me tente concerne la planificateur de requête de PostgreSQL. Et hop, un copié-collé du sommaire.

News
p.04 Inside Android : Jelly Bean (4.1 à 4.3)
Sysadmin
p.16 Planificateur de requêtes de PostgreSQL – Les parcours
En couverture
p.28 Asterisk en routeur d’appels : Par Toutatis, ça capte mal dans ce tunnel !
Repères
p.38 Retour d’expérience sur l’optimisation d’un projet libre
p.48 La documentation de code ne sert à rien !
Netadmin
p.50 Collectd et PerfWatcher : découverte
p.56 Collectd et PerfWatcher : installation
p.66 Graphing, logging et monitoring 2.0 : vos alertes avec Sensu
Code(s)
p.80 YAML et Python

IPBX : sortie de Astlinux 1.14, plateforme de communication sécurisée embarquée

Découvrez les détails de cette nouvelle version qu’il faut absolument découvrir

Cette nuit, une nouvelle version de Astlinux vient de sortir. Astlinux est une distribution intégrant Asterisk, et l’ensemble des outils nécessaires afin de gérer votre PABX. Il est plutôt destiné aux petites entreprises du fait de son interface simple. Mais un administrateur connaissant asterisk ne sera nullement bridé et pourra pousser asterisk dans ses retranchements.

Présentation de Astlinux

Astlinux se différencie de ses concurrents Trixbox, Xivo, Elastix par le fait qu’il est optimisé pour fonctionner sur des environnements avec peu de ressources. Je l’ai utilisé pendant des années sur des cartes Soekris. On obtient un système solide : pas de disque dur (on utilise une carte mémoire et le stockage de la prog et des messages se font sur une clé usb ou un disque flash par exemple), pas de ventilateur et une faible consommation (il est facile de tenir de nombreuses heures avec une petite batterie).

Fonctionnalités

AstLinux fournit une plateforme de communication sécurisée intégrant les éléments suivant :

  • Asterisk 1.8 and 11: SIP, DAHDI – IPBX
  • Asterisk Operator Panel: FOP2 – optional Add-On Package
  • Prosody 0.9: XMPP – Presence et Message
  • Linux: Kernel 2.6.35, basé sur Busybox avec iproute2, e2fsprogs et util-linux
  • VPN : OpenVPN IPSec VPN and PPTP
  • Languages: bash, php, lua and perl
  • Server web: Linux-Lighttpd-SQLite3-PHP
  • Monitoring: Zabbix SNMP et UPS Equipment
  • Routeur IPv4 / IPv6 et Stateful Filtering Firewall
  • Serveurs DHCP, DNS, TFTP NTP et FTP
  • Notifications par email
  • Serveur LDAP pour distribuer l’annuaire
  • ODBC afin de supporter SQLite3
  • RUNNIX bootloader permettant la gestion des versions de firmware et les diagnostiques matériels
  • Interface pour l’administration

Nouveautés

Cette nouvelle version apporte l’intégration d’un serveur d’annuaire LDAP permettant de distribuer l’annuaire, la’intégration du paquet Nut pour la supervision de l’UPS et quelques correctifs de bugs et de failles de sécurité.

Conclusion

Attention, Astlinux n’est pas un clicodrome. Il faut donc savoir ce que l’on fait quand on souhaite l’utiliser. Des notions de Linux, d’Asterisk, de réseau et de VPN (si vous souhaitez l’utiliser, mais c’est tout de même recommandé pour les postes distants) sont indispensables.

Vous trouverez sur le site de Astlinux les images afin de pouvoir l’utiliser ou le tester sur VirtuialBox ou VMWare (mais dans ces 2 derniers cas, pas en prod !!!).

L’image pour la carte 5501 de Soekris est bien entendu disponible. Si vous avez dans vos placard quelques cartes 4801, il est possible de créer votre propre image assez simplement.

Asterisk : comment lire un numéro de téléphone à l’appelant

Nous allons voir comment asterisk peut annoncer un numéro de téléphone à l’appelant. En France, on ne lit un numéro de téléphone en annonçant chaque nombre le composant, mais par groupe de 2 ( 014012… est lu zero un, quarante, douze … et non zero, un, quatre, zero, un , deux …). Pour cela nous allons utiliser l’application app_playpack.so.

Fonctionnement

L’application app_playback.so se paramètre dans le fichier de configuration say.conf. L’application utilisée afin de lire le numéro est Playback().

Pré requis

Il faut s’assurer que dans sip.conf, dans la section [general] que vous ayez la définition suivante :

language=fr

Ensuite, éditez asterisk.conf et ajoutez dans le context [options] et ajouter :

languageprefix = yes

Les fichiers de voix française sont bien entendu installés.

Ensuite, vous devez avoir le fichier say.conf dans /etc/asterisk et ce fichier doit contenir les patterns pour le français.

Configuration

Modifiez say.conf afin d’avoir les lignes suivantes :

[fr](date-base,digit-base)
_[n]um:0X => num:${SAY:0:1}, num:${SAY:1:1}

...

;numeros 0800 : 0800, 0811... 0899
_pho[n]e:08XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:3},num:${SAY:4:2}, num:${SAY:6:2},num:${SAY:8:2}

;numeros de telephones fixes et mobiles
_pho[n]e:0[1-79]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}

Ensuite, faites un reload ( ou juste « module reload app_playback.so ») afin de prendre en compte les changements.

Un exemple d’utilisation

Voici un exemple de code à ajouter dans un contexte du fichier extensions.conf :

[pres-num-tel-fr]
exten => 0011,1,Playback(phone:0140456789,say)
exten => 0011,n,Hangup

ou si vous souhaitez utiliser votre AGI en utilisant le PERL :

$AGI->exec("PLAYBACK num:0140456789,say ""n");

Voilà votre asterisk programmé afin d’énoncer à la manière française les numéros de téléphone.

Configurer correctement les appels anonymes avec un asterisk

Pour certaines raisons, vous souhaitez émettre des appels sans présenter votre numéro à partir de votre serveur asterisk. Mais, en jouant sur le CallerID, vos appels sont toujours rejetés. La cause est simple : pour des raisons de traçabilité réglementaire, il faut que l’opérateur puisse tracer l’origine de l’appel. Il faut donc que votre numéro soit correctement indiqué dans les entêtes SIP.

Voici le code à intégrer (et modifier selon votre dialplan) pour vous conformer à la règlementation et éviter d’être rejeté :

exten => _X.,1,NoOp(Mon appel avec mon numero masqué)
exten => _X.,n,SIPAddHeader(P-Asserted-Identity: <sip:${CALLERID(num)}@${SYSTEMNAME}>) ;RFC3323
exten => _X.,n,SIPAddHeader(P-Preferred-Identity: <sip:${CALLERID(num)}@${SYSTEMNAME}>) ;RFC3325
exten => _X.,n,SIPAddHeader(Privacy: id)
exten => _X.,n,Set(CALLERID(num)=)
exten => _X.,n,Set(CALLERID(name)=Anonymous)
exten => _X.,n,Dial ...
exten => _X.,n,Hangup

Configuration de fail2ban selon les différentes versions d’asterisk

Fail2ban est un outil indispensable à installer sur ses serveurs asterisk. Il permet de bloquer de manière proactive les tentatives de scan et ainsi de protéger vos deniers. Mais selon la version d’asterisk, le filtre doit être configurer de manière différente.

Il faut ajouter au fichier jail.conf la partie le code suivant :

[asterisk-iptables]
# if more than 4 attempts are made within 6 hours, ban for 24 hours
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=all]
              sendmail[name=ASTERISK, dest=, sender=]
logpath  = /var/log/asterisk/messages
maxretry = 4
findtime = 21600
bantime = 86400

et créer le fichier suivant :

filter.d/asterisk.conf

et copier le code suivant pour asterisk 1.4 et 1.6 :

# Fail2Ban configuration file
#
#
# $Revision: 251 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>S+)
# Values:  TEXT
#

failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Username/auth name mismatch
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' (from )
            NOTICE.* .*: Host  failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Device does not match ACL
            NOTICE.* .*: Registration from '.*" .* failed for '<HOST>' - Peer is not supposed to register
            VERBOSE.*SIP/<HOST>-.*Received incoming SIP connection from unknown peer

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

et pour la version 1.8, le code suivant :

# Fail2Ban configuration file
#
#
# $Revision: 251 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>S+)
# Values:  TEXT
#
# Asterisk 1.8 uses Host:Port format which is reflected here

failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '".*".*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '".*".*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' (from <HOST>)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
            NOTICE.* .*: <HOST> failed to authenticate as '.*'
            NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
            VERBOSE.*SIP/<HOST>-.*Received incoming SIP connection from unknown peer

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Ce code fonctionne pour asterisk 10 et 11 même si je bosse sur une amélioration.

Comment sécuriser le SIP d’un serveur asterisk ?

Comme convenu lors de mes voeux, voici mon premier article technique de 2012 touchant la sécurité informatique et plus précisément comment sécuriser le SIP d’un serveur asterisk.

Je ne vais pas vous rappeler l’intérêt (quand on touche au portefeuille, on comprend de suite beaucoup plus vite) de bien sécuriser son serveur de téléphonie. Asterisk est de plus en plus déployé en entreprise, apportant une flexibilité et des fonctionnalités pour un coût incomparable. Asterisk sait gérer plusieurs protocoles de communications dont le SIP. Nous allons voir dans cet article comment sécuriser le SIP.

Cet article est « presque » indépendant de la version d’Asterisk (les différences seront indiquées), ceci étant d’autant plus important que pour des questions de stabilité ou de compatibilité de code, beaucoup de solutions n’ont pas migré vers la dernière version stable. On trouve couramment en production des 1.4 .

Du point de vue SIP, Asterisk est un B2BUA. Un B2BUA (back-to-back user agent) est un élément logique du réseau dans les applications SIP. Il intervient entre les deux terminaisons d’un appel et divise la communication en deux appels indépendants. Tous les messages de controls passent par le B2BUA, ce qui lui permet d’intervenir lors de l’appel afin de lancer si nécessaire des applications comme l’interception, l’enregistrement, la diffusion de messages … Par contre asterisk n’est pas un proxy SIP. Il intègre quelques unes des fonctions (routage des appels, serveur registrar), mais gère de manière incomplète l’ensemble des messages SIP. Ce n’est tout simplement pas son job.

Afin de protéger notre serveur asterisk, il est judicieux de mettre en frontal un proxy SIP comme Opensips ou Kamailio. Ainsi, toutes les requêtes SIP seront dirigées vers l’interface publique du Proxy SIP. Cela va nous permettre ainsi d’isoler Asterisk. De plus, nous obtenons une architecture plus évolutive (load balancing ou fail over entre 2 serveurs asterisk synchronisés) et plus résistante aux attaques de déni de services. Un proxy SIP a été construit pour supporter un grand nombre de requêtes SIP, ce qui n’est pas le cas d’un serveur Asterisk.

Nous allons ainsi pouvoir paramétrer de manière précise comment notre proxy va répondre aux demandes selon leurs profils, bannir des adresses IP qui auraient un comportement anormal, et détecter des attaques selon des dictionnaires. On peut aussi bannir par défaut des IP selon leur origine géographique, ce qui est très utile si vos clients ne sont qu’en France ou en Europe par exemple.

De plus, Asterisk ne supporte les communications sécurisées (TLS) que depuis la version 1.8 (une version beta patchée 1.6 existe, mais il n’est pas conseillé de l’utiliser en production). Cela ajoute en plus une charge complémentaire sur le serveur. Dans notre schéma, les flux TLS seront gérés par le proxy SIP qui renverra un flux non crytpé à notre asterisk.

Voilà notre schéma :

SIP Channels (réseau public et privé) < —–> PROXY SIP < ——-> ASTERISK < ——> DAHDI, IAX …. channels (réseau privé)

Asterisk fonctionne en Realtime intégrant ainsi dans sa base de données les comptes utilisateurs SIP. Le proxy va vérifier les comptes et l’état des postes SIP dans cette base. L’authentification est gérée par le proxy SIP. Quand un appel arrive et qu’il est authentifié, le proxy le renvoie vers le serveur asterisk. Si l’utilisateur est est disponible (utilisateur interne ou externe via un trunk SIP opérateur), asterisk renvoie l’appel au proxy SIP qui renvoie l’appel au destinataire final.

Ainsi, lors d’une tentative d’attaque, le serveur asterisk est complètement isolé, et c’est le proxy SIP qui les gèrera.

Asterisk peut-il remplacer votre PABX ?

Lors de projet de renouvellement de leur PABX, beaucoup de personnes se pose la question de l’opportunité de migrer sur une solution open source comme Asterisk. La principale motivation étant de réaliser des économies, de récupérer l’exploitation en interne et de l’intégrer au sein de l’infrastructure informatique.

Historique

Asterisk a été créé en 1999 par Mark SPENCER (un gars exceptionnel que j’ai eu l’occasion de rencontrer plusieurs fois). Le code du logiciel est distribué en open source sous la licence GPL. Le site du projet est tout simplement www.asterisk.org

Présentation d’Asterisk

Asterisk est un logiciel permettant de mettre en oeuvre un PABX, c’est à dire de relier entre eux des téléphones de technologies différentes et des trunks. Les trunks sont des accès opérateurs, comme les accès numéris, analogique ou SIP. Asterisk est compatible avec tous les postes IP compatibles avec la norme SIP, IAX et SCCP. On peut aussi connecter des postes analogiques et des postes sans fil via des gateways. Une gamme impressionnante de carte permet de se raccorder aux réseaux des opérateurs.

Nous l’avons vu, au niveau des périphériques, l’offre est très importante et n’a pas à pâlir des solutions payantes concurrentes. Mais, car il y a un gros mais, quand vous installez Asterisk, vous n’obtenez pas un PABX. Vous avez une excellente base, mais sans programmation, il vous ne pouvait pas passer un appel. Afin de construire votre PABX, il vous faudra programmer toutes les fonctions dont vous avez besoin. C’est là que se situe toute la difficulté, car à moins de maîtriser les langages de programmation propre à Asterisk, vous arriverez juste à émettre et à recevoir des appels, mais sûrement pas à faire des interceptions et encore moins mettre en oeuvre la fonction patron-secrétaire. La mise en oeuvre de fonctionnalités évoluées et une intégration parfaite avec les postes nécessitent une excellente expertise. Vous remarquerez aussi que je n’ai pas parlé de fiabilité et de stabilité. Installer Asterisk pour une personne maîtrisant linux, n’est pas une chose compliquée notamment sur Centos. Sécuriser et fiabiliser cette même installation est autrement plus complexe, notamment quand le volume d’appels à traiter est assez important.

Les avantages d’Asterisk

Asterisk a pourtant des avantages à faire valoir par rapport aux PABX du marché. Quand vous achetez un PABX, vous ne pouvez installer que les postes du constructeurs, avec Asterisk vous avez le choix. Vous aurez (ou votre intégrateur) juste à adapter les scripts en conséquence. Vous n’avez plus de limite dans les programmations souhaitées et dans les circuits d’appels, problèmes par contre souvent rencontrés avec les PABX. Vous restez aussi maître des coûts d’évolution, en effet il n’y a pas de licences par utilisateurs, ou de cartes à ajouter. Il faudra par contre surveiller le dimensionnement du serveur.

Et la sécurité ?

J’ouvre un chapitre sur la sécurité. Le monde du PABX m’a souvent étonné par l’ignorance des risques associés. Combien d’entreprises ont vu leur PABX piratés ? mieux, combien se sont aperçues du piratage (en dehors de la facture) ?

Les PABX sont rarement en dernière version logicielle essentiellement pour des questions de coûts ou d’ignorance. Le parc est donc en production avec des failles de sécurité et des bugs non corrigés. Mais connaissez vous la liste des bugs et des failles de la version que utilisez chaque jour ? les hackers oui. Avec Asterisk, vous connaissez les bugs, vous pouvez ainsi mettre en place les procédures nécessaires pour les corriger ou les contourner, appliquer le dernier patch.

Le second point de la sécurité concerne les communications IP. A ce jour, Asterisk ne sait pas crypter les flux RTP (mais c’est en cours), mais peu de solutions constructeurs le proposent. Ceux qui ont ce besoin de part leur activité doivent garder cela en mémoire et bien étudier les fiches techniques des constructeurs afin de vérifier si ce point du cahier des charges est parfaitement rempli.

Asterisk est une solution logicielle qui demande de la maintenance logicielle. Souvent cet effort est oublié par les entreprises quand elles intègrent une solution open source. Et pourtant, cette maintenance va garantir la sécurité, la stabilité et l’évolutivité de votre PABX.

Alors, puis-je installer Asterisk dans mon entreprise ?

L’objectif de l’article étant de répondre à la question : puis-je installer Asterisk dans mon entreprise?

La réponse est oui.

Ai-je un intérêt financier à le faire ?

Cela va dépendre de votre expertise, de la taille de votre entreprise et de votre cahier des charges. Il existe des intégrateurs qui ont développé à partir d’Asterisk des PABX soit en mode licence soit en mode appliance (serveur + Asterisk + scripts). Pour les entreprises aux besoins standardisés et sans expertise, cette alternative peut permettre de réaliser des économies tout en bénéficiant des avantages d’Asterisk.

Il faut vérifier tout de même que la solution ne devient pas closed source (vous vous retrouverez dans le cadre d’un PABX constructeur).

Conclusion

En conclusion, je vais parler de mes propres expériences. Je travaille sur Asterisk depuis 2001 et j’ai donc suivi l’évolution impressionnante du projet. J’ai réalisé des intégrations pour des centres d’appels, des entreprises multi site et du centrex. J’utilise aussi Asterisk pour combler des lacunes de PABX en place. Le projet est extrêmement puissant et ouvre des possibilités infinies à qui sait les exploiter. 😉