Artisan Numérique

/système/réseau/voip/sip/asterisk/infrastructure/ Comment mettre en place sa téléphonie grâce à Asterisk

De la ligne téléphonique d'une freebox (et sûrement des autres "box") à Skype en passant par les très nombreuses offres disponibles sur le Net, la VoIP (Voice over IP) est partout. Pris dans le contexte d'une architecture domestique ou d'entreprise, la VoIP (Voice over IP ou Voix sur IP) est un nouveau faisceau de service, comme la messagerie, qu'il est possible d'intégrer à un degré professionnel grâce à un outil libre souvent considéré, à tord, comme complexe, Asterisk.

Pour quoi faire ?

Comme toujours il est important avant de se lancer, de comprendre ce que peut apporter une intégration VoIP domestique ou professionnelle. Et pour cela, il est nécessaire d'avoir en tête ce que permet Asterisk.

Asterisk est un projet qui démarré il y a plus de 10 ans (1999) par Mark Spencer. Son objectif était alors de fournir à Linux un commutateur téléphonique complet et totalement libre. Aujourd'hui Asterisk est un PABX (Private Automatic Branch eXchange) d'une rare puissance et souplesse, capable de gérer la téléphonie analogique, mais surtout, et c'est ce qui nous intéresse, la voix sur IP (VoIP).

La VoIP sur Asterisk passe entre autre par la prise en charge d'un protocole standard, ouvert et très largement utilisé, le SIP (Session Initiation Protocol). SIP qui est un protocole très proche d'HTTP qui n'est pas limité à la seule voix mais qui prend aussi en charge la vidéo et la messagerie instantanée.

D'un point de vue fonctionnalité, Asterisk permet tout ce que l'on peut attendre d'un PABX moderne, et plus particulièrement dans notre contexte :

  • La prise en charge de tous vos comptes SIP (et pas seulement, Skype et Gtalk aussi).
  • La gestion des postes téléphonique sur IP locaux. Il peut s'agir de téléphones physiques (tout en un ou via un adaptateur ATA - Analog Telephone Adapter), mais aussi logiciels (ou SoftPhone) comme Ekiga ou csipsimple.
  • La téléphonie de poste à poste en local, comme le permettent les téléphones DECT (mais sans vous bourrez la tête d'onde).
  • Un nombre illimité de boites vocales, et en français s'il vous plait !
  • La mise en attente et le transfert d'un appel, d'un poste local à l'autre.

Asterisk est un beau joujou qui reste, nous allons le voir, très simple à mettre en œuvre. Mais comme toute chose cela demande du temps. Il faut donc bien se poser l'intérêt de cette technologie dans votre configuration. Si vous désirez que votre ligne Freebox (ou autre fournisseur SIP) fasse sonner tous les téléphone sur IP (ce qui est impossible avec freephonie sans PABX), si vous désirez irriguer en téléphonie une petite entreprise à moindre frais (les grosses préférerons sûrement passer par un prestataire plutôt que bricoler cela eux-mêmes ;-), ou si, comme moi, vous êtes une famille d'indépendants qui reçoivent finalement des appels perso, comme pro, Asterisk est sans aucun doute une option à envisager sérieusement.

Installation d'asterisk

Avant de partir dans l'installation de paquets, sachez qu'il existe de nombreuses distribution Asterisk toutes faites (allez sur la page wikipedia d'asterisk pour en savoir plus), ainsi que des configurateur sensés être user-friendly (par exemple freePBX). Mais si vous êtes ici, c'est que vous aimez savoir ce qui se passe, en direct. Nous allons donc voir comment monter tout cela à la mano, sur une debian de base.

La première chose à faire est évidement d'installer Asterisk. Cela se fait sans douleur sur la grande majorité des distribution modernes, par exemple debian :

aptitude install asterisk asterisk-config asterisk-prompt-fr-proformatique
Installation d'asterisk

Ici nous avons installé l'outil, sa configuration, ainsi que, en prévision de la suite, une séries de messages en français de haute qualité pour la boite vocale.

Ceci fait, Asterisk est prêt à être lancé avec sa configuration par défaut dans le dossier /etc/asterisk. Nous allons cependant nous en garder pour faire d'abord un peu de paramétrage.

Paramétrage SIP

Pour commencer nous n'allons pas faire aussi compliqué. Notre configuration va consister à déclarer deux softphones Ekiga et ainsi permettre de passer des appels internes de l'un à l'autre.

Pour cela nous allons créer la configuration de la partie SIP en écrasant /etc/asterisk/sip.conf avec la configuration suivante :

[general]
defaultexpirey=1800
dtmfmode=auto
qualify=yes
configuration de base pour le SIP

Dans cette section [general] sont placés les paramétrages communs à tous les éléments connectés au moteur SIP d'asterisk.

Ajout des deux postes

A la suite de sections, nous allons en ajouter deux nouvelles, correspondant aux deux téléphones :

[salon]
type=friend
username=salon
qualify=no
secret=salon_password
host=dynamic
context=maison
language=fr

[bureau]
type=friend
username=bureau
qualify=no
secret=bureau_password
host=dynamic
context=maison
language=fr
configuration du softphone

Bien évidement, vous pouvez remplacer salon|bureau par les noms de votre choix, de même pour xxx_password. Ces identifiants et mots de passe seront à reporter, ainsi que l'adresse IP de la machine sur laquelle tourne asterisk, dans la configuration du softphone. Le host est dynamique car on ne connaît pas à l'avance l'IP des téléphones (ce qui est faux dans mon cas, mais bon ;-). La variable language sera utilisé par la boîte vocale. Enfin notez le context=maison commun aux deux téléphones qui vont nous permettre de programmer les extensions.

Paramétrage des extensions

Les extensions d'Asterisk sont un peu le plan d'adressage des numéros composés en fonction du contexte. De manière grossière, il s'agit d'associer un motif de numéro de téléphone à une commande Asterisk. En réalité, il est possible d'aller très loin et de définir de véritables scripts (avec des fonctions, des goto, etc...).

Pour l'heure nous allons nous contenter de faire correspondre le numéro 11 à salon et 12 pour bureau. Cela se fait en écrasant le contenu de /etc/asterisk/extensions.conf par les informations suivantes :

[maison]
exten => 11,1,Dial(SIP/salon)
exten => 12,1,Dial(SIP/bureau)
Paramétrage du mode talkie-walkie

Nous avons ici déclaré deux extensions dans le contexte maison (celui là même que nous avons défini pour nos téléphones). Chaque extension commence par une série de chiffre à composer sur l'un des cadrant pour déclencher l'extension. Le second paramètre est une priorité car une extension peut être un véritable script composé de plusieurs lignes. Enfin le dernier paramètre est une macro Asterisk, ici Dial, qui va composer le numéro SIP d'un des deux téléphones.

Paramétrage du routeur

Ceci ne vaut évidement que si votre serveur est derrière un routeur NAT. Dans ce cas, pour qu'Asterisk puisse correctement fonctionner il est nécessaire de le configurer pour permettre la redirection du port 5060, en UDP, vers le port 5060 de la machine Asterisk sur votre réseau local.

Premier lancement d'Asterisk

Nous pouvons maintenant faire nos premiers tests. Pour cela, nous allons arrêter Asterisk qui a sûrement été lancé automatiquement lors de l'installations (/etc/init.d/asterisk stop), puis le relancer à la main en mode "console debug" par la commande asterisk -cvvv.

/etc/init.d/asterisk stop
Stopping Asterisk PBX: asterisk.
asterisk -cvvv
....
[Aug 17 13:39:32] NOTICE[13575]: chan_sip.c:18223 handle_response_peerpoke: Peer 'salon' is now Reachable. (108ms / 2000ms
[Aug 17 13:49:10] NOTICE[13575]: chan_sip.c:18223 handle_response_peerpoke: Peer 'bureau' is now Reachable. (108ms / 2000ms
Lancement d'asterisk

Ok asterisk est lancé en mode console. Il ne reste qu'à paramétrer les Ekiga's.

Paramétrage des softphones

Un softphone (ou téléphone SIP) est un terme générique désignant aussi bien une application SIP sur votre ordinateur (ex. ekiga) ou un terminal mobile (ex. android), qu'un téléphone physique sur IP ou encore un ATA (Analog Telephone Adapters) transformant un téléphone standard en téléphone sur IP. Pour ma part j'utilise deux ATA Linksys (PAP2T), un terminal Android avec le logiciel libre CSIPSimple et deux Ekiga sous Windows et sous Linux.

Pour paramétrer Ekiga, rien de plus simple. Lancez la bête, allez dans Édition → Comptes puis Comptes → Ajouter un compte SIP. Pour le Nom, mettez ce qui vous fait plaisir.

Registrar qui doit contenir l'adresse IP ou le nom de la machine sur laquelle est lancée Asterisk. Pour utilisateur et Identifiant d'authentification, utilisez la même valeur username qui nous avons saisi dans la configuration SIP d'asterisk pour ce poste. Et enfin le mot de passe provenant lui aussi de sip.conf Asterisk. Validez et normalement Ekiga devrait indiquer que le compte est en état Inscrit. Faire de même avec le second post.

Si Ekiga pose problème, une option utile est de le lancer en mode debuggage par la commande ekiga -d4. Cela devrait produire suffisamment de traces en console pour permettre de trouver la solution.

Lorsque le compte passe en état Inscrit, cela devrait provoquer du côté d'Asterisk un message du genre Peer 'salon' is now Reachable. (117ms / 2000ms). Lorsque les deux téléphones sont actifs, vous pouvez vérifier leur rattachement à asterisk en tapant la commande sip show peers

*CLI>sip show peers
Name/username              Host            Dyn Nat ACL Port     Status
salon/salon              192.168.154.11   D          5060     OK (48 ms)
bureau/bureau                  192.168.154.22   D          5060     OK (108 ms)
2 sip peers [Monitored: 2 online, 0 offline Unmonitored: 0 online, 0 offline]
*CLI>#
Lancement d'asterisk

Maintenant le test, aller dans l'application SIP du téléphone salon et taper le numéro 12, ce qui doit faire sonner le second téléphone et permettre une communication entre les deux appareils. Dans la console Asterisk, nous voyons la trace de l'appel apparaître : Qui as dit qu'asterisk était compliqué ? Enfin si, c'est super compliqué, mais pour l'instant, il reste magnifiquement simple à mettre en œuvre.

Connexion à un fournisseur SIP

Pour l'instant nous avons surtout réussi à fabriquer deux talkie-walkie de luxe. Il est temps de connecter tout cela au vrai monde. Free, à travers son service Freephonie, propose la téléphone SIP en standard à tous ses abonnés. Il est donc possible de connecter ce service à notre PBX. De même vous avez sur internet de très nombreux fournisseurs SIP plus ou moins sympa ou compétitifs. Comme j'ai mon activité professionnelle dans mon garage, et que le numéro de notre freebox est dédiée depuis longtemps à notre famille, j'ai eu besoin d'un autre numéro pour mon boulot. Plutôt que de faire tirer une ligne, j'ai simplement créé un compte chez un fournisseur SIP et le tour était joué. Après pour le choix du fournisseur, c'est question de goût, mais pour l'instant je suis très content d'IPPI qui propose gratuitement un numéro local (en 01, 02, etc..) et permet de recharge par Paypal son compte pour les appels sortants.

Bref, quel que soit votre fournisseur SIP, vous allez pouvoir le connecter à votre PBX. Du coup vous allez pouvoir avoir notre propre boîte vocale (en prenant soin de déconnecter celle du fournisseur), faire sonner tous les téléphones lorsque l'on est appelé de l'extérieur, et aussi passer jusqu'à des appels simultanés (2 pour freephonie, 3 sur IPPI, variable d'un fournisseur à l'autre).

La première chose à faire est d'ajouter un nouveau partenaire de jeu à sip.conf comme pour le téléphone. Mais à la différence du téléphone, il faut en plus ajouter un enregistrement du fournisseur dans la section general pour prendre en charge les appels entrant. Cela nous donne pour freephonie :

[general]
...
register => 09XXXXXX:freephonie_password@freephonie.net

[freephonie]
type=peer
insecure=port,invite
host=freephonie.net
username=09XXXXXXXX
secret=freephonie_password
context=from-freephonie
language=fr
configuration de freephonie

Ici il vous faut remplacer 09XXXXXX et freephonie_password respectivement pas l'identifiant et le mot de passe freephonie. Dans la section [general], ajoutez la commande register permettant à Asterisk de s'enregistrer sur FreePhonie. Ensuite nous créeons une section [freephonie] pour déclarer le nouveau partenaire. Le paramètre insecure est spécifique à se service. Ce paramétrage est le même pour IPPI mais il faudra peut-être le modifier pour un autre fournisseur. Enfin, point important, on définit un contexte from-freephonie qui nous servira pour de nouvelles extension spécifiques aux appels entrant de ce partenaire SIP.

Si vous n'avez pas défini de mot de passe, vous n'avez sûrement pas activé le SIP non plus. Il vous faut donc aller dans la console de votre freebox, section Téléphone puis Gestion de mon compte SIP. Vous y trouverez un rappel de votre identifiant/numéro de téléphone, la possibilité de définir un mot de passe une case à cocher pour activer le service SIP et enfin, un bouton radio à placer sur Rediriger les appels entrants vers le compte SIP de sorte à ce que les appels soient redirigés sur asterisk et non plus sur le téléphone branché à la freebox. Ceci fait, terminez en cliquant sur Enregistrer.

Nous allons maintenant rajouter deux nouvelles extensions.

[default]
exten => 11,1,Dial(SIP/salon)
exten => 12,1,Dial(SIP/bureau, 10)
exten => 12,2,Voicemail(maison)
exten => 600,1,VoiceMailMain(maison)
exten => _0.,1,Dial(SIP/freephonie/${EXTEN})

[from-freephonie]
exten => s,1,Dial(SIP/salon&SIP/bureau,10)
exten => s,2,Voicemail(maison)
Configuration des boîtes vocales

La première commune à tous les téléphones du groupe maison, va nous permettre de passer des appels en utilisant les tarifs de free. Comme vous le voyez, il s'agit d'une expression régulière indiquant "tous les numéros commençant par un 0". La variable ${EXTEN} permet de composer ce numéro en passant par le partenaire freephonie (défini dans sip.conf).

En réalité La variable EXTEN est ici la variable correspondant au numéro effectivement tapé. ${...} est quant à elle une fonction permettant d'en récupérer le contenu et qui peut prendre deux paramètres optionnels. Le début de la chaîne à retourner (ex. ${1234:3} renverra 34). Et la taille de la chaîne à retourner (${1234:3:1} renverra 3). Ainsi un SIP/ippi/33${EXTEN:1} renverra pour le numéro 0102030405 la chaîne /SIP/ippi/33102030405.

La deuxième extension, cette fois spécifique au contexte from-freephonie nous permet de gérer les appels entrant. Ici nous indiquons à Asterisk de faire sonner nos deux téléphones simultanément pendant 10 secondes. L'appel sera transféré au premier qui décrochera. Dans le cas contraire (priorité 2 sur la même extension), nous basculons sur la boite vocale.

Nous pouvons maintenant relancer asterisk et déjà vérifier que FreePhonie est bien connecté en utilisant la commande sip show peers, puis en tentant de s'appeler avec un portable par exemple.

Conclusion

J'espère avoir au moins démontré qu'Asterisk est un monstre gentil dont il ne faut vraiment pas avoir peur. Personnellement la simplicité de mis en œuvre et la qualité du résultat obtenu m'a bluffé au regard de tout ce que cet outil sait faire. Chapeau bas donc pour ce très beau soft et bonne téléphonie à vous.