Installation et configuration d'un serveur IPBX Asterisk

Sommaire

1 - Installation d’Asterisk
1.1 Prérequis
1.2 Récupération des sources
1.3 Compilation

2 - Con?guration d’Asterisk
2.1 sip.conf
2.2 extensions.conf
2.3 Prise en compte des con?gurations

3 - Ajout de fonctions
3.1 Transfert d’appel
3.2 Mise en attente
3.3 Messagerie vocale
3.4 Con?guration du MTA pour la messagerie vocale

4 - Asterisk en temps réel avec MySQL
4.1 Prérequis
4.2 Récupération des sources Asterisk Add-Ons
4.3 Compilation
4.4 Con?guration initiale
4.5 Migration du ?chier sip.conf
4.6 Migration du ?chier extension.conf



1 - Installation d'Asterisk


1.1 Prérequis

Liste des dépendances nécessaires à l’installation :

- glibc-source
- ncurses-dev
- zlib1g-dev


1.2 Récupération des sources

Direction www.asterisk.org pour récupérer les sources.
Il est conseillé de choisir la version LTS (Long Time Support), ici la version 1.4.

On télécharge l’archive dans le répertoire /usr/src/, puis on détare :

$ cd /usr/src
$ tar -xvf asterisk-1.4.29


1.3 Compilation

On se déplace dans le répertoire détaré et on compile:

$ cd asterisk-1.4.29/
$ ./configure
$ make menuselect (optionnel)
$ make
# make install

On crée des ?chiers de con?guration d’exemple.

# make samples

On copie le bon script init pour le lancement automatique au démarrage suivant sa distribution, ici Debian.

# cp /usr/src/astrisk/contrib/init.d/rc.debian.asterisk /etc/init.d/asterisk

Attention : Ce script semble problématique sur Debian 5. En e?et, si Asterisk est lancé par ce biais, la consommation du CPU monte à 99% en permanance.

Un moyen de contourner ce problème peut être de passer par inittab, en ajoutant dans celui-ci :

as:2:respawn:/usr/sbin/asterisk -f

Le 2 correspond au runlevel, donc de cette manière asterisk se lance au démarrage et se relance grâce au respawn si le processus meurt pour n’importe quelle raison.
On n’oublie pas de désactiver le script init au démarrage :

# update-rc -f asterisk remove



2 - Con?guration d’Asterisk

Pour qu’Asterisk fonctionne de manière basique, il est nécessaire de modi?er seulement deux ?chiers de con?guration : sip.conf et extensions.conf.
Ces ?chiers de con?gurations se trouvent dans /etc/asterisk.

# cd /etc/asterisk/


2.1 sip.conf

C’est dans ce ?chier que l’on dé?nit les comptes sip des utilisteurs.
Pour être fonctionnel, un compte à besoin d’au minimum 6 lignes :

# cat sip.conf
[utilisateur1]
type=friend
host=dynamic
user=utilisateur1
secret=mysecret
context=default

Voyons en détail chaque ligne :

[utilisateur1] est le début du bloc SIP. Les informations présentes après cette ligne concerneront le compte [utilisateur1].
type=friend permet d’appeler et d’être appelé.
host=dynamic l’adresse ip du client est dé?nie par DHCP. Si son IP était ?xe on l’aurait précisé ici.
user=utilisateur1 le nom utilisateur
secret=mysceret le mot de passe en clair
context=default le contexte auquel le compte est associé dans le dialplan (servira pour le ?chier extensions.conf)

Une liste des options possibles :
http://www.voip-info.org/wiki/view/Asterisk+config+sip.conf\#SIPconfigurationspeersandclients

A noter qu’en utilisant ’secret’, le mot de passe est stocké en clair. Il est préférable d’utiliser ’md5secret’, qui, comme son nom l’indique, utilisera un hash md5. Voici la structure nécessaire pour la génération du hash :

<user>:<realm>:<secret>

Par défaut le realm est ’asterisk’. Pour générer le hash de l’utilisateur toto qui a pour mot de passe ’tutu’ avec bash, on fait donc :

$ echo -n "toto:asterisk:tutu" | md5sum
5aebc5cf46e9e2dd011c16489eb83a18


2.2 extensions.conf

C’est dans ce ?chier que l’on dé?nit le dialplan, c’est à dire le plan de la numérotation. On explicite l’action qui se déroulera si l’on compose un numéro. Voici ce que pourrait contenir ce ?chier :

# cat extensions.conf
[default]
exten => 100,1,Dial(SIP/utilisateur1)

Le [default] est ce qu’on appelle un contexte. Le contexte est une zone où la portée des actions est limitée. Cela permet par exemple d’attribuer deux numéros identiques à des utilisateurs di?érents, l’un ou l’autre sera contacté suivant le contexte dé?nit dans le compte SIP de l’utilisateur cherchant à les joindre.

La ligne suivante nous montre comment enregistrer une extension.
On commence par le mot clé exten suivi d’une ?èche =>.
Le 100 est le numéro que l’on souhaite associer, c’est ce que l’on composera sur le téléphone.
Le 1 est le numéro de séquence. On peut en e?et ordonner plusieurs actions pour une même extension.
Dial(SIP/utilisateur1) est l’action à e?ectuer. On appelle ici la fonction Dial(), qui déclenche l’appel, avec pour argument SIP/utilisateur1 pour appeler le compte SIP utilisateur1.
Ici donc, pour tous les utilisateurs du contexte default, composer le 100 appelera l’utilisateur1

Un petit exemple pour assimiler la notion de séquence :

# cat extensions.conf
[default]
exten => 100,1,Dial,wait(5)
exten => 100,2,Dial,SIP/utilisateur1

Ici, j’attends 5 secondes avant de sonner, puis j’appelle l’utilisateur1.

De nombreuses actions sont possibles, au dela du simple appel. En voici une liste :

http://www.voip-info.org/tiki-index.php?page=Asterisk+-+documentation+of+application+commands


2.3 Prise en compte des con?gurations

Pour toute modi?cation du sip.conf et du extensions.conf, il est nécessaire qu’Asterisk recharge ces ?chiers.
Pour cela, on se logue sur la console d’Asterisk :

# asterisk -rvvvvdddd (les v pour verbose, les d pour debug)

Puis on recharge Asterisk :

reload

La commande suivante permet de recharger uniquement le dialplan (extensions.conf) :

dialplan reload

A ce moment la, le serveur est opérationnel. L’utilisateur1 possède un compte SIP et un numéro lui est associé. Il ne reste plus qu’à ajouter d’autres utilisateurs et mettre à jour le dialplan.



3 - Ajout de fonctions

Il faut noter que le transfert d’appel et la mise en attente sont souvent directement implémentés dans les softphone et les terminaux SIP. Les manipulations suivantes permettent de les activer directement dans Asterisk, ce qui permet de s’a?ranchir d’un logiciel ou matériel particulier.


3.1 Transfert d’appel

Il est nécessaire avant tout d’activer les tonalités DTMF à la fois côté client et serveur. Pour Asterisk, il su?t d’ajouter la ligne suivante dans sip.conf, dans le contexte [général] ou pour chaque utilisateur :

dtmfmode = rfc2833

La démarche à suivre côté client dépend du client, il faut regarder du coté des paramètres SIP.

Pour activer le transfert d’appel, il su?t simplement de modi?er les paramètres de la fonction Dial dans extensions.conf :

exten => 100,2,Dial(SIP/utilisateur1,,tT)

Après SIP/utilisateur1, nous avon ajouté les options t et T qui autorisent l’appelé et l’appelant à transférer l’appel (nous reviendrons sur les deux virgules précédentes dans une prochaine section).

Pour e?ectuer le transfert, il faut appuyer durant une communication sur le # (on entend à ce moment la ”transfer”) suivi du numéro sur lequel on souhaite transférer l’appel.


3.2 Mise en attente

La mise en attente permet de mettre une communication en pause. Cela est très utile, car du coup la ligne est libérée. On peut alors composer un autre numéro, ou récupérer l’appel sur un autre poste.

Il est la aussi nécessaire d’activer les tonalités DTMF (cf section précédente).

Pour activer la mise en attente, il su?t d’ajouter la ligne suivante dans le contexte default du ?chier extensions.conf :

include=>parkedcalls

Pour mettre son interlocuteur en attente lors d’un appel, il faut composer le #700. Le serveur attribue un numéro au sein du parc d’attente. On peut alors raccrocher, changer de poste, et reprendre l’appel en composant le numéro annoncé par le serveur.


3.3 Messagerie vocale

Si on veut que la voix de la messagerie soit en français, il faut le spéci?er lors de la compilation d’Asterisk à l’aide de la commande :

$ make menuselect

Il faut ensuite ajouter dans le contexte [general] de sip.conf la ligne suivante :

language=fr

On crée une boite vocale dans le ?chier /etc/asterisk/voicemail.conf, dans la partie [default] :

100 => 1010,Monsieur Utilisateur 1, utilisateur1@gmailyahoohotmail.com

Le 100 est le numéro de téléphone auquel on associe la boite vocale.
Le 1010 est le mot de passe de la messagerie.
Suivent le nom de l’utilisateur, ainsi que son mail. Le mail servira à l’alerter en cas de réception de message vocal, à condition qu’un MTA soit correctement con?guré (nous le verrons plus tard).

La boite vocale est maintenant déclarée, il reste à l’inclure dans extensions.conf pour qu’elle soit utlisée :

exten => 100,1,Dial(SIP/utilisateur1, 10)
exten => 100,2,Voicemail(b101)
exten => 100,3,Hangup

Nous avions déjà vu un exemple de séquences, en voici un nouveau.
La première action e?ectuée lorsque l’on compose le 101 est l’appel de l’utilisateur1. Le 10 situé après la virgule est le timeout avant de passer à la deuxièeme séquence. C’est pour cela que l’on avait mis deux virgules de suite dans la section transfert d’appel.
Une fois le timeout atteint, on bascule sur la deuxième séquence, qui est l’appel de la boite vocale avec la fonction Voicemail.
En?n, on raccroche avec la fonction Hangup.


3.4 Con?guration du MTA pour la messagerie vocale

Il est en e?et très intéressant de passer par une alerte mail lors de la réception d’un message : l’utilisateur est alors au courant qu’il a un message, et peut l’écouter directement en pièce jointe. On a déjà renseigné l’adresse mail de l’utilisateur dans voicemail.conf, il ne reste plus qu’à con?gurer un MTA.

J’ai ici arbitrairement choisi exim4, car c’est le MTA par défaut de Debian.
Puisque exim4 est déjà installé, on va simplement le recon?gurer :

dpkg-reconfigure exim4-config
Type de configuration : Distribution directe par SMTP (site Internet)
Nom de courriel du système :le FQDN
Liste d’adresses IP où Exim sera en attente de connexions SMTP entrantes : 127.0.0.1
Autres destinations dont le courriel doit être accepté : vide
Domaines à relayer : vide
Machines à relayer : vide
Faut-il minimiser les requêtes DNS (connexions à la demande) ? Non
Méthode de distribution du courrier local : Format "mbox" dans /var/mail
Faut-il séparer la configuration dans plusieurs fichiers ? Non

Le serveur mail va se relancer, Asterisk est désormais capable d’envoyer des mails d’alerte avec le message vocal en picèe jointe.



4 - Asterisk en temps réel avec MySQL

Comme nous venons de le voir, pour que toute modi?cation de sip.conf ou extensions.conf soit prise en compte, il est nécessaire de recharger le serveur Asterisk. Si on a un vrai besoin d’une prise en compte en temps réel et d’une plus grande souplesse dans la con?guration, la migrer vers MySQL peut être extremement intéressant.
On peut en fait se servir de tables au lieu de ?chiers de con?guration. Lorsque l’on modi?era ces tables, celles-ci seront prises en compte instantanément, sans avoir besoin de recharger le serveur.
Cette fonctionnalité, bien que puissante, est considérée comme experimentale. C’est pour cette raison qu’elle n’est pas présente directement dans les sources. Il est nécessaire de télécharger et installer les Add-Ons d’Asterisk.


4.1 Prérequis

Dépendances nécessaires :

- mysql-client
- mysql-server
- libmysqlclient-dev


4.2 Récupération des sources Asterisk Add-Ons

Toujours sur www.asterisk.org, on télécharge les sources dans /usr/src puis on détarre :

$ cd /usr/src
$ tar -xvf asterisk-addons-1.4.10.tar.gz


4.3 Compilation

On se déplace dans le répertoire détaré et on compile :

$ cd asterisk-1.4.29/
$ ./configure
$ make menuselect (optionnel)
$ make
# make install

Il est conseillé de véri?er avec make menuselect si les modules dépendants de mysql sont bien activés et s’il ne manque aucune dépendance.


4.4 Con?guration initiale

Une fois la compilation e?ectuée, il on copie ces 2 ?chiers :

# cp res_config_mysql.so /usr/lib/asterisk/modules/
# cp configs/res_mysql.conf.sample /etc/asterisk/res_mysql.conf

Les paramètres de connexion d’Asterisk à MySQL sont dé?nis dans le ?chier res_mysql.conf :

# cat /etc/asterisk/res_mysql.conf
[general]
dbhost = 127.0.0.1
dbname = asterisk
dbuser = root
dbpass = motdepassemysql
dbport = 3306


4.5 Migration du ?chier sip.conf

En premier lieu il est nécessaire de créer la base ’asterisk’ dans MySQL.
On entre la requete SQL suivante à l’aide du client mysql en ligne de commande ou au travers d’une interface web de type phpmyadmin :

CREATE DATABASE ‘asterisk‘ ;

Puis on crée la table ’sip’ :

mysql>CREATE TABLE ‘sip‘ (
‘id‘ int(11) NOT NULL auto_increment,‘name‘ varchar(80) NOT NULL default ’’,
‘accountcode‘ varchar(20) default NULL,‘amaflags‘ varchar(13) default NULL,
‘callgroup‘ varchar(10) default NULL,‘callerid‘ varchar(80) default NULL,
‘canreinvite‘ char(3) default ’yes’,‘context‘ varchar(80) default NULL,
‘defaultip‘ varchar(15) default NULL,‘dtmfmode‘ varchar(7) default NULL,
‘fromuser‘ varchar(80) default NULL,‘fromdomain‘ varchar(80) default NULL,
‘fullcontact‘ varchar(80) default NULL,‘host‘ varchar(31) NOT NULL default ’’,
‘insecure‘ varchar(4) default NULL,‘language‘ char(2) default NULL,
‘mailbox‘ varchar(50) default NULL,‘md5secret‘ varchar(80) default NULL,
‘nat‘ varchar(5) NOT NULL default ’no’,‘deny‘ varchar(95) default NULL,
‘permit‘ varchar(95) default NULL,‘mask‘ varchar(95) default NULL,
‘pickupgroup‘ varchar(10) default NULL,‘port‘ varchar(5) NOT NULL default ’’,
‘qualify‘ char(3) default NULL,‘restrictcid‘ char(1) default NULL,
‘rtptimeout‘ char(3) default NULL,‘rtpholdtimeout‘ char(3) default NULL,
‘secret‘ varchar(80) default NULL,‘type‘ varchar(6) NOT NULL default ’friend’,
‘username‘ varchar(80) NOT NULL default ’’,‘disallow‘ varchar(100) default ’all’,
‘allow‘ varchar(100) default ’g729;ilbc;gsm;ulaw;alaw’,
‘musiconhold‘ varchar(100) default NULL,‘regseconds‘ int(11) NOT NULL default ’0’,
‘ipaddr‘ varchar(15) NOT NULL default ’’,‘regexten‘ varchar(80) NOT NULL default ’’,
‘cancallforward‘ char(3) default ’yes’,‘setvar‘ varchar(100) NOT NULL default ’’,
PRIMARY KEY  (‘id‘),
UNIQUE KEY ‘name‘ (‘name‘),
KEY ‘name_2‘ (‘name‘)
 ) TYPE=MyISAM ROW_FORMAT=DYNAMIC;

La requête est intentionellement lourde pour avoir tous les champs disponibles dès le départ. Cela permet d’a?ecter des valeurs par défaut sur certains champs, et d’avoir les autres déjà prêts pour plus tard, au cas où.

On va créer un compte avec cette requête :

mysql>insert into sip (name,type,host,username,secret)
values (’android1’,’friend’,’dynamic’,’AndroidM’,’secret’);

Pour véri?er, on va utiliser le CLI de MySQL. On se connecte sur la base asterisk :

$ mysql asterisk -u root -p

On regarde les champs précédemments remplis :

mysql>select name,type,host,username,secret from sip;
+----------+--------+---------+----------+--------+
| name     | type   | host    | username | secret |
+----------+--------+---------+----------+--------+
| android1 | friend | dynamic | AndroidM | secret |
+----------+--------+---------+----------+--------+

En?n, on va spéci?er à Asterisk d’aller chercher les paramètres SIP dans MySQL. Il su?t d’ajouter ces 2 lignes à la ?n du ?chier extcon?g.conf :

# echo ’sipusers => mysql,asterisk,sip’ >> /etc/asterisk/extconfig.conf
# echo ’sippeers => mysql,asterisk,sip’ >> /etc/asterisk/extconfig.conf

Au prochain redémarrage d’Asterisk, il ira chercher les données des comptes SIP dans la table sip de MySQL en complément du ?chier sip.conf.


4.6 Migration du ?chier extension.conf

On crée la table SQL ’extensions’ :

mysql>CREATE TABLE ‘extensions‘ (
‘id‘ int(11) NOT NULL auto_increment,
‘context‘ varchar(20) NOT NULL default ’’,
‘exten‘ varchar(20) NOT NULL default ’’,
‘priority‘ tinyint(4) NOT NULL default ’0’,
‘app‘ varchar(20) NOT NULL default ’’,
‘appdata‘ varchar(128) NOT NULL default ’’,
PRIMARY KEY  (‘context‘,‘exten‘,‘priority‘),
KEY ‘id‘ (‘id‘)
) TYPE=MyISAM;

On renseigne cette table avec un numéro de téléphone associé au compte SIP précédemment créé :

mysql> insert into extensions (context,exten,priority,app,appdata)
values (‘default’,’18’,’1’,’Dial’,’SIP/android1’);

On véri?e à l’aide de la requête suivante :

mysql> select context,exten,priority,app,appdata from extensions;
+---------+-------+----------+------+--------------+
| context | exten | priority | app  | appdata      |
+---------+-------+----------+------+--------------+
| default | 18    |        1 | Dial | SIP/android1 |
+---------+-------+----------+------+--------------+

La structure est quasiemment identique au ?chier extensions.conf.

Comme précédemment, il faut rajouter une ligne à extcon?g.conf pour dire à Asterisk d’aller chercher les extensions dans MySQL :

# echo ’extensions => mysql,asterisk,extensions’ >> /etc/asterisk/extconfig.conf

En?n, il faut rajouter à la ?n de extensions.con?g une ligne renvoyant vers la base SQL :

# echo ’switch => Realtime’ >> /etc/asterisk/extensions.conf

Au prochain redémarrage d’Asterisk, les extensions seront chargées à partir de la table MYSQL ’asterisk’, en complément du ?chier extensions.conf.

Vus : 970
Publié par Jeyg : 33