A propos | Laboratoire | Voisinage | Meilleurs articles | Nous aider

Panoramisk / Le druide de la VoIP 

ENUM ou la voix en “peer to peer”

Vous êtes passés à la téléphonie sur IP avec un Asterisk, vous avez déjà un opérateur voix de type Centrex IP en SIP ou IAX, passez la vitesse supérieure et oser la téléphonie en peer-to-peer avec ENUM.

ENUM est un système d’annuaire, basé sur la structure du DNS, permettant d’associer à un numéro de téléphone traditionnel (format E.164) des informations relatives à l’Internet. On peut manipuler ainsi des adresses de courriel, des URL mais surtout et c’est ce qui nous intéresse ici des moyens d’être joint en téléphonie sur IP.

ENUM va donc autoriser une transition en douceur entre le monde de la téléphonie traditionnelle dans lequel nous manipulons des “numéros de téléphone” (au format E.164 donc) et le monde de la téléphonie sur IP dans lequel nous manipulons des URI (plutôt au format RFC822 comme les adresses de courriel).

Comment fonctionne ENUM

ENUM est basé sur le DNS, il s’agit donc de données, accessibles via ce protocole largement diffusé sur Internet et indexées par rapport à une entrée de type numéro de téléphone au format E.164. Il faut donc disposer d’un tel numéro afin d’avoir une entrée dans un annuaire ENUM, c’est l’idée de base.

Lorsqu’un PABX IP souhaite acheminer un appel vers un correspondant, il peut alors effectuer une requête de type DNS à un annuaire ENUM, afin de savoir si le numéro demandé n’est pas associé à un moyen de communication sur IP. Si un tel moyen existe, l’appel pourra alors être écoulé en IP (disons en utilisant SIP par exemple) et sur Internet (ou un réseau privé IP). Si en revanche aucun enregistrement n’est disponible dans l’ENUM, alors on utilisera un autre moyen d’acheminer l’appel, via son opérateur SIP ou en RTC.

S’inscrire

Avant de pouvoir recevoir des appels via ENUM, il est nécessaire de s’inscrire à un ou plusieurs annuaires. En effet, il existe plusieurs initiatives dans ce domaine qui n’est toujours pas organisé puisque un manque à gagner évident pour les opérateurs téléphoniques plane autour d’une généralisation d’un tel usage.

La façon la plus simple de démarrer est d’utiliser le service de e164.org. Après création d’un compte, vous pourrez alors effectuer deux types d’enregistrement:

  • à partir d’un numéro de téléphone valide associé a un ou plusieurs moyen de communication ToIP,
  • à partir d’un PABX IP connecté à Internet (en direct ou via un SBC1 disposer de numéro virtuels disponibles à tout utilisateur de e164.org. Pour information, un préfixe de 10.000 SDA vous est attribué lors de l’inscription de votre serveur, c’est pas mal pour démarrer.

Attention: l’enregistrement d’une entrée ENUM chez e164.org nécessite la configuration préalable de votre système de téléphonie, en effet, afin d’éviter les abus, un appel est effectué et doit aboutir correctement sur votre enregistrement SIP.

Valider son inscription

Une fois inscrit, vos informations ENUM vont être propagées dans l’arborescence DNS et sont donc consultables à l’aide d’un client DNS. Je vous conseille d’installer dig s’il n’est pas déjà présent sur votre système.

La syntaxe de requête utilise le format de résolution inverse du DNS, on va donc devoir écrire son numéro de téléphone à l’envers (très bon pour les neurones). On cherche bien sûr une information spécifique, pas une adresse IP ou un nom de domaine, c’est pourquoi il faut spécifier dans la recherche le champ NAPTR. La syntaxe de recherche peut ressembler à :

dig 9.9.9.9.8.7.3.5.0.0.9.9.2.8.8.e164.org. NAPTR

Cette commande recherche le moyen de joindre ce numéro de téléphone, en l’occurrence et remis dans le bon sens il s’agit du : 88299 005378 9999. Ce numéro est extrait de ma plage de numéros privés, enregistrée chez e164.org et permettant d’accéder à une extension de test sur mon Asterisk en IAX. Le résultat de la requête contient l’information recherchée :

;; ANSWER SECTION:
9.9.9.9.8.7.3.5.0.0.9.9.2.8.8.e164.org. 600 IN NAPTR
   100 10 "u" "E2U+IAX2"
   "!^\+88299005378(.*)$!iax2:guest@cislyon.homeip.net/88299005378\1!" .

Il s’agit bien d’un enregistrement pour de l’IAX et vous avez le chemin permettant d’accéder à mon PABX via ce protocole et donc à utiliser dans votre commande Dial().

Une fois que vous voyez vos enregistrements avec dig, vous devez être joignable depuis tous les PABX connectés à Internet et effectuant des recherches dans ENUM.

Configuration d’Asterisk pour ENUM

Vous trouverez de la littérature sur Internet pour configurer votre Asterisk pour qu’il puisse faire de l’ENUM, mais voici une solution clé en main si vous souhaitez aller vite.

Pour recevoir des appels en IAX

IAX est le protocole propriétaire permettant de construire des faisceaux entre Asterisk sans contraintes de négociation des numéros de port relatifs au transport de la voix, en effet la signalisation et les communications sont transportées sur le même port UDP. Une fois que votre installation de sécurité a autorisé les appels entrants vers votre PABX, il reste à configurer celui-ci pour accepter les appels.

Dans iax.conf on ajoute une section qui est en phase avec l’enregistrement dans ENUM, par exemple, mon numéro 88299 005378 9999 est associé avec l’utilisateur guest derrière un serveur dont le nom est cislyon.homeip.net. La section est donc:

[guest]
type=user
context=fromiax

Elle est basique étant donné que les appels peuvent provenir de n’importe quel Asterisk sur Internet2. Tout appel vers l’utilisateur guest sera acheminé vers le contexte fromiax que l’on retrouve dans le plan d’appel.

Le plan d’appel extensions.conf doit contenir de quoi gérer un appel entrant, classiquement on aura quelque chose qui pourrait ressembler à

[fromiax]
; echo pour Enum IAX
exten => 882990053789999,1,Answer()
exten => 882990053789999,n,Echo()

On valide le numéro d’appel et exécute les actions spécifiques, ici une prise de ligne et un Echo() qui permet de faire du test3.

Pour recevoir des appels en SIP

Le cas de SIP est un peu différent dans la méthode même si le principe est exactement le même: accepter un appel de l’extérieur. Nous considérons ici que votre Asterisk et la solution de sécurité réseau sont configurés pour accepter des appels en SIP.

Dans un premier temps il est important de mettre en place un contexte dans sip.conf permettant à e164.org de valider votre serveur. Ceci peut nécessiter des ajustements en fonction du fournisseur de service ENUM sélectionné. Je vous propose quelque chose comme:

[enumsip-e164]
type=peer
host=e164.org
qualify=no
context=from-e164org
insecure=very

On ajoutera dans le plan d’appel la section correspondante à la validation de l’appel:

[from-e164org]
exten => _.,1,Answer()
exten => _.,2,Hangup()

Il est maintenant nécessaire de configurer notre Asterisk pour accepter des appels de n’importe quel correspondant sur Internet utilisant SIP. Ceci n’est pas trivial dans Asterisk qui souhaite valider la provenance des initiations de session SIP et les rattacher à un contexte dans sip.conf. Or ici, nous ne pouvons pas créer un contexte pour chaque contrepartie, celles-ci étant inconnues par définition. On utilisera donc la fonction de dernier recours mise en place dans le traitement des appels SIP et qui constitue à déléguer au plan d’appel le soin de valider celui-ci. Tous les appels parvenant dans notre Asterisk en SIP seront donc acheminé automatiquement dans le contexte du plan d’appel nommé default. Dans ce contexte nous devrons être très sélectif et traiter uniquement nos SDA. Par exemple, toujours tiré de ma liste de SDA e164.org mais en SIP cette fois ci, je vous propose la configuration suivante pour le fichier extensions.conf:

[default]
; echo pour ENUM SIP
exten => 882990065339999,1,Answer()
exten => 882990065339999,n,Echo()

Un appel vers le numéro 88299 006533 9999, aboutira en SIP sur un Echo() localisé dans mon Asterisk.

Nous avons donc désormais un système capable de recevoir des appels SIP ou IAX depuis un tiers sur Internet et basé sur un numéro de SDA existant dans le monde RTC ou sur une SDA offerte par notre fournisseur ENUM.

Passage d’appel

Nous allons voir maintenant comment acheminer un appel à partir de notre Asterisk, relié à Internet et ceci après avoir effectué une recherche dans la base ENUM.

Le principe est d’utiliser, avant l’appel, une (ou plusieurs) recherche à l’aide de la fonction ENUMLOOKUP. Cette fonction est disponible dans le module func_enum.so qui doit donc être chargé et son fichier enum.conf présent dans le répertoire des configurations.

La fonction ENUMLOOKUP effectue la requête DNS permettant d’extraire les informations correspondantes, de la base du fournisseur sélectionné, par défaut e164.arpa. Elle peut effectuer des recherches plus ou moins ciblées et s’informer également sur le nombre d’enregistrements présents dans la base DNS.

Nous vous proposons une solution de code à ajouter dans le fichier extensions.conf et permettant d’automatiser cette recherche, par le biais d’une macro:

; callENUM *****
; --- get address in ENUM DNS record and dial
; args:
;  1: extension
;  2: domain to lookup
;  3: iax2 or sip
;
[macro-callENUM]
exten => s,1,Set(count=${ENUMLOOKUP(+${ARG1},${ARG3},c,,${ARG2})}|counter=0)
exten => s,n(start),GotoIf($["${counter}" >= "${count}"]?end)
exten => s,n,Set(counter=$[${counter}+1])
exten => s,n,Set(ENUM=${ENUMLOOKUP(+${ARG1},${ARG3},,${counter},${ARG2})})
exten => s,n,GotoIf($["${LEN(${ENUM})}" = "0" ]?start)
exten => s,n,Set(DIALSTR=${ARG3}/${ENUM})
exten => s,n(dodial),Dial(${DIALSTR},30)
exten => s,n,GotoIf($["${DIALSTATUS}"=="CHANUNAVAIL"]?start)
exten => s,n,GotoIf($["${DIALSTATUS}"=="CONGESTION"]?start)
exten => s,n(end),Verbose(Dial failed due to ${DIALSTATUS})

Son fonctionnement est le suivant: on vérifie tout d’abord qu’au moins un enregistrement est bien présent dans la base DNS (il peut en effet y en avoir plusieurs dans le cas de solution redondante). Ensuite, en fonction de la technologie recherchée (IAX ou SIP), on cherche les informations qui serviront au Dial(). L’appel est présenté et s’il échoue on essaye l’enregistrement ENUM suivant jusqu’à sortir de la macro.

Le principe d’appel de cette macro est, par exemple, le suivant:

exten => _X.,1,Macro(callENUM,${EXTEN},e164.org,iax2)
exten => _X.,2,Macro(callENUM,${EXTEN},e164.org,sip)
exten => _X.,3,Macro(callENUM,${EXTEN},e164.arpa,sip)

Ici, on fait d’abord une tentative en IAX, puis en SIP, la base étant celle d’e164.org. Si l’appel n’aboutit pas, on tente une recherche dans la base de e164.arpa, en SIP uniquement.

Conclusion

La communication sans opérateur voix est une réalité technique, mais pas encore sur le terrain en raison de l’usage massif du réseau RTC à ce jour. La migration lente mais inéluctable vers les opérateurs SIP (Centrex IP) pour l’acheminement des appels ouvre la porte à des initiatives comme celle d’ENUM pour l’usage de la voix en peer-to-peer. Restera à surveiller les évolutions réglementaires, notamment au niveau des interceptions légales et la réponse des opérateurs qui ne vont pas laisser un marché leur échapper de la sorte.

Ne vous attendez néanmoins pas à passer ou recevoir beaucoup d’appel via ENUM, mais ceci peut être utilisé pour joindre des partenaires, des sites distants ou pourquoi pas des usagers de la communauté Asterisk ayant lu cet article.


  1. Session Border Controller []
  2. nous évoquerons dans un article prochain les solutions pour limiter le spam ou spit []
  3. vous pouvez l’utiliser d’ailleurs []
Posté par: Alexandre Chauvin-Hameau, le 17/10/2007
Trackback | Popularité: 36%
marqué , , , , , , et
AddThis Social Bookmark Button
UselessNothing newInformativeLearned a lotAmazingly helpful
Loading ... Loading ...

Voir aussi

Et pourquoi pas

Laisser un commentaire

© 2010 Panoramisk | Creative Commons License wordpress logo