Translate

samedi 28 novembre 2009

TUTORIEL: Intégration Exchange 2007/2010, Trixbox/Asterisk et SIP Trunk Freephonie! (Seconde partie)

Dans la première partie, j'expliquais comment intégrer Exchange UM et Asterisk (sur base d'une Trixbox) avec un SIP Trunk.

L'état des lieux suite à cette première partie est celui-ci:
  • Asterisk est configuré et sait router vers Exchange UM
  • Exchange UM sait router vers Asterisk, mais cela n'est pas encore configuré
  • L'appel vers une extension non disponible sera redirigé vers Exchange UM
  • Tout utilisateur Asterisk peut appeler le "nombre pilote" de la messagerie vocale ou du standard automatique.
Nous allons dans un premier temps nous intéresser à la partie permettant de configurer la reception d'un appel avec un SIP Trunk Freephonie et de le rediriger directement vers le standard automatique Exchange.

Configuration d'une route entrante

Dans la première partie, je disais réserver l'extension 2000 pour un usage particulier. C'est ici que celle-ci intervient.

Avant de créer une route entrante, nous allons créer deux "Custom Destinations". Pour ceci, nous allons dans le menu "PBX" ==> "PBX Settings". Dans le panneau de gauche, aller dans l'onglet "Tools" puis cliquez sur "Custom Destinations".

Ajouter les destinations suivantes:

Outlook Voice Access
  • Custom Destination: app-eum,ova,1
  • Description: Outlook Voice Access
Exchange Auto Attendant
  • Custom Destination: app-eum,aa,1
  • Description: Exchange Auto Attendant
Explications:
  • Une "Custom Destination" permet de déclencher un contexte personnel tel qu'une application
  • Ici nous exécutons les sous-routines "ova" et "aa" de notre application "app-eum" que nous avons installé dans l'article précédent - La syntaxe correspond au macro language d'Asterisk
Nous pouvons maintenant créer une route entrante. Pour ceci il suffit d'aller dans l'onglet principal "Setup" puis dans la section "Inbound Call Control" et de cliquer sur "Inbound Routes".

De là, ajouter une route entrante:
  • DID Number: 2000
  • Set Destination
    • Sélectionner "Custom Destinations" ==> sélectionner "Exchange Auto Attendant"

Validez et appliquez les changements.

Configuration du SIP Trunk avec Freephonie

Créez un nouveau SIP Trunk avec les paramètres suivants:

Trunk name: Freephonie

PEER Details:
type=peer
context=from-pstn
username=09XXXXXXXX
secret=motdepassetopsecret
host=freephonie.net
fromuser=09XXXXXXXX
fromdomain=freephonie.net
insecure=port,invite
nat=yes
qualify=yes
disallow=all
allow=alaw&ulaw
dtmfmode=auto

USER Context: 09XXXXXXXX

Incoming Settings:
type=user
host=freephonie.net
disallow=all
allow=alaw&ulaw
dtmfmode=auto

Register String: 09XXXXXXXX:motdepassetopsecret@freephonie.net/2000

Validez la création de la route puis rechargez la configuration d'Asterisk.

Explications:
  • La section "PEER Details" permet d'appeler au travers du SIP Trunk Freephonie et contrôle ce contexte
  • La section "User Details" permet de contrôler le contexte des appels entrants
  • La valeur de "Register String" permet de s'authentifier auprès de Freephonie. Petite subtilité ici, le "/2000" permet de dirgier tous les appels entrants vers la route que nous avons créé précédemment, et qui porte donc le "faux DID" 2000.
Afin que les appels entrants soient bien dirigés vers votre Trixbox, assurez-vous que vous avez configuré votre compte Free en conséquence ("Rediriger les appels entrants vers le compte SIP").


Une fois cette modification effectuée, vous pouvez tester la configuration en appelant votre n°Freephonie.

Configuration de la route sortante via le SIP Trunk Freephonie

Pour créer la route sortante, allez dans l'onglet principal "Setup" puis dans la section "Basic" et de cliquer sur "Outbound Routes".

Modifier la route sortante par défaut afin qu'elle utilise le SIP Trunk Freephonie au lieu du Zaptel. Au passage, changez les règles de numérotation afin qu'elles correspondent à vos souhaits.

Ci-dessous un exemple:

Validez la création de votre route, puis appliquer les changements de configuration.

Une fois la route créée, vous devriez être capable d'appeler un numéro extérieur depuis votre SIP phone et une extension définie dans Asterisk/Trixbox (ex 2001, 2002, ...)

Configuration d'Exchange pour le "Play on Phone" et les appels sortants

Exchange UM a une fonctionnalité nommée "Play on Phone", qui permet, via Outlook Web Access/Outlook Web App de demander à Exchange de vous appeler sur un numéro que vous lui spécifiez.

Il est aussi possible d'activer les appels sortants au travers des standards automatiques, pour appeler des numéros présents dans les listes d'adresses Exchange ou dans les contacts personnels.

Pour que les fonctionnalités d'appels sortants fonctionnent, vous devrez configurer plusieurs éléments:
  • Dial Codes: au niveau de l'UM Dial Plan, permettant de reformer un numéro en fonction de lu pays/région du Dial Plan et permettant de déterminer le type de destination ("In Region" ou "International");
  • Dial Rule Groups: au niveau de l'UM Dial Plan, permettant de transposer un numéro en fonction de sa destination en un numéro formaté tel que l'UM IP Gateway (une passerelle ou un IP-PBX) l'attend.
Voici des exemples de Dial Codes et Dial Rule Groups:


Ensuite, il suffit d'autoriser (ou pas) les appels vers ces Dial Rules. Pour le "Play on Phone", cela se configure au niveau des UM Policies (stratégies UM).

Dans mon lab, j'ai par exemple une stratégie UM me permettant d'appeler des téléphones mobiles, tandis que la stratégie par défaut n'autorise que les 0[1-59]xxxxxxxx !


A partir de là, vous avez la capacité de vous faire appeler par Exchange sur un numéro français, il suffit d'aller dans Outlook Web App puis Options ==> Téléphone ==> Appelez le numéro...


Et là me direz vous "Non ça ne marche pas!!!". En effet, il faut savoir que dans notre cas Exchange UM appelle depuis l'extension "2xxx" telles que nous l'avions défini dans notre première partie.

Or, Asterisk n'est pas un Proxy SIP, c'est un Back-to-Back User Agent (B2BUA) -- si vous activez le debug sip sur Asterisk vous verrez clairement le problème:
  • Le serveur Exchange envoie une INVITE au numéro externe
  • Le serveur Asterisk répond avec un erreur 401 (non autorisé)
Le fait est que l'appelant dans notre scénario est, par exemple, 2001. Or cette extension est connue dans Asterisk et doit être authentifiée (avec un REGISTER) avant de pouvoir émettre un appel. Ceci malgré le fait que nous ayons un contexte "from-internal" et configuré un niveau bas de sécurité "insecure=invite,port" pour notre serveur Exchange. Asterisk refuse donc le "spoofing" d'identité, ce qui ne nous arrange pas dans notre cas...

J'ai trouvé deux parades:
  1. Ne pas mettre de "secret" sur l'extension qui doit pouvoir appeler via Exchange... L'extension n'ayant pas de mot de passe, un appel sans REGISTER préalable fonctionne!
  2. Utiliser le fameux UMOUTDIALPREFIX (par exemple, 5)
    • Créer un UM Dial Plan à 5 chiffres au lieu de 4
    • Lors de l'activation UM des utilisateurs, préfixez l'extension UM du chiffre choisi (par exemple, 2001 devient 52001)
    • Ajouter un Hunt Group dont le Pilot Number est 51000 et pointe vers le nouveau Dial Plan
    • Ajouter un Auto Attendant dont le Pilot Number est 51900
    • De là, il faut tout reconfigurer côté UM :(
Ensuite, il suffit de spécifier dans le fichier /etc/asterisk/global_custom.conf:

UMOUTDIALPREFIX = 5
UMVMPILOTNUMBER = 51000
UMAAPILOTNUMBER = 51900

Il ne sera plus possible d'appeler "facilement" des extensions Asterisk depuis Exchange (ex: au travers de l'Auto Attendant). Cela requerra une petite manipulation que je ne détaillerai que succinctement ici:
  • Créer un contexte "from-internal-Exchange" qui inclue le contexte "from-internal" - Définir ce contexte au niveau du SIP Trunk Exchange UM
  • Ajouter du code Asterisk dans ce contexte qui permet de tronquer le préfixe de l'extension UM lorsque le numéro appelé correspond à 52xxx
Voici ce qui conclue donc notre seconde partie, où nous avons intégré Exchange UM derrière Asterisk/Trixbox mais aussi et surtout notre SIP Trunk Freephonie.

Il va de soit qu'il est possible d'utiliser virtuellement n'importe quel SIP Trunk, voire même plusieurs numéros si votre fournisseur le supporte.

Dans ce dernier cas, il suffira de faire une route entrante par numéro, ce que j'aurai pu faire sans extension "2000" (l'intérêt de mon extension étant de pouvoir la retirer rapidement au niveau de mon SIP Trunk sans modifier la route entrante).

Post-mortem

Ce qui fonctionne bien:
  • Redirections vers la messagerie vocale
  • Accès aux standards automatiques Exchange UM
Ce qui fonctionne, mais au prix de quelques bidouilles:

  • Appels sortants, à cause de la façon dont Asterisk fonctionne - je conserve dans mon lab l'astuce de ne pas avoir de secret sur mes extensions, mais cela rend l'intégration non viable dans un environnement de production, à moins que cette fonctionnalité ne soit pas utilisée.
  • Il serait possible de mettre en oeuvre un Proxy SIP tel que SipX (qui sait aussi faire SIP Registar) et l'utiliser pour les appels sortants. Cela ajoute un serveur dans l'environnement et complifie légèrement notre environnement de tests, mais pourquoi pas...
Ce qui ne fonctionne pas du tout:
  • Indicateur de messages (MWI - Message Waiting Indicator) - Une fois encore Asterisk n'autorise pas la réception de messages de type NOTIFY en dehors d'un dialogue SIP (ayant donc commençé par un INVITE) ce qui a pour conséquence un retour avec une erreur 489 (Bad request).
  • Un patch est censé exister, il me semblait même qu'il était incorporé dans la 1.6.0. Si tel est le cas, j'ai dû rater quelque chose :p -- Il sera vraisemblablement incorporé dans la v1.6.2.

2 commentaires:

  1. Bonjour le forçage du DID ne fonctionne pas chez moi. (Register String: 09XXXXXXXX:motdepassetopsecret@freephonie.net/2000)
    C'est comme si je ne mettais rien
    Brice

    RépondreSupprimer
  2. Bonsoir,

    Est-ce que tu as bien créé la route entrante vers la Custom Application ?

    Il ne faut pas oublier de configurer ton compte SIP chez Freephonie pour diriger vers "un téléphone SIP" et non vers la Freebox (téléphone branché directement dessus)

    Je l'ai fait plusieurs fois et ça marche très bien :)

    RépondreSupprimer