Table des matières

, , , ,

Asterisk (For VoIP)

Préambule

Asterisk permet de transformer un ordinateur en commutateur téléphonique performant. Il se présente sous la forme d'un logiciel libre édité par la société américaine Digium. La configuration d'un serveur Asterisk n'est pas relativement aisée, surtout pour les néophytes, c'est pour cette raison que certaines sociétés dont Digium éditent maintenant des distributions entièrement consacrées à Asterisk parmi lesquelles on peut citer :

Installation

Tout d'abord, veillez à avoir une distribution à jour :

sudo apt update
sudo apt upgrade 

Nous procédons ensuite à l'installation des dépendances :

sudo apt install build-essential libxml2-dev libncurses5-dev linux-headers-$(uname -r) libsqlite3-dev libssl-dev libedit-dev uuid-dev libjansson-dev

On télécharge la dernière version d’Asterisk et on l’installe :

1 - Auparavant vérifier la version à utiliser et modifiez les trois lignes (3, 4, 5) en fonction de la version d'Asterisk

2 - Exécuter la ligne 6 en étant dans le répertoire /usr/src/asterisk/asterisk-18.6.0 (car configure est un fichier exécutable du répertoire asterisk-18.6.0)

mkdir /usr/src/asterisk
cd /usr/src/asterisk                       
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
tar -xvzf asterisk-18-current.tar.gz
cd asterisk-18.6.0
./configure --with-jansson-bundled
make menuselect

Lorsque vous faites le ./configure, il est possible qu'il manque des paquets; dans ce cas, installez la version dev de ce paquet (par exemple, s'il manque le paquet libedit, exécutez la commande sudo apt-get install libedit-dev) puis relancez le ./configure.

Dans le menu qui s'affiche, allez dans Core Sound Package et cochez à l'aide de la touche Espace CORE-SOUNDS-FR-ULAW. Quittez en pressant la touche Echap. Allez ensuite dans Music On Hold File Packages, décochez MOH-OPSOUND-WAV et cochez MOH-OPSOUND-ULAW. Enfin, allez dans Extras Sound Packages et cochez EXTRA-SOUNDS-FR-ULAW.

Revenez à l'écran principal et appuyez sur Echap pour terminer et pressez S pour sauvegarder.

Enfin tapez les commandes suivantes pour terminer l’installation :

Avant d'effectuer ces commandes, assurez vous que vous avez une connexion Internet configurée et active.
make
make install
make samples
make config

Enfin, lancez Asterisk avec la commande suivante :

/etc/init.d/asterisk start

Lancez la console Asterisk avec la commande suivante :

sudo asterisk -rvvvv

Si vous avez l'erreur "Unable to connect to remote asterisk (does /var/run/asterisk.ctl exist?)", assurez-vous que vous avez bien démarré la console Asterisk en root.

Autre méthode

L'installation qui suit a été effectuée avec Ubuntu 6.06.1 LTS depuis des paquets debian. Tout d'abord, il faut installer les pilotes Zaptel qui vous permettront ensuite d'ajouter des cartes analogique, T0… de marque Digium.

 sudo vim /etc/udev/rules.d/50-zaptel.rules

Ajoutez dans ce fichier les lignes suivantes :

KERNEL=="zapctl", NAME="zap/ctl", OWNER="asterisk", GROUP="asterisk", MODE="0660"
KERNEL=="zaptimer", NAME="zap/timer", OWNER="asterisk", GROUP="asterisk", MODE="0660"
KERNEL=="zapchannel", NAME="zap/channel", OWNER="asterisk", GROUP="asterisk", MODE="0660"
KERNEL=="zappseudo", NAME="zap/pseudo", OWNER="asterisk", GROUP="asterisk", MODE="0660"
KERNEL=="zap[0-9]*", NAME="zap/%n", OWNER="asterisk", GROUP="asterisk", MODE="0660"

Ensuite, il faut compiler et installer les pilotes :soumaya

sudo apt-get install gcc zaptel zaptel-source
sudo module-assistant auto-install zaptel

Fin de l'installation des pilotes Zaptel, redémarrez maintenant votre ordinateur a l'aide de la commande :

sudo reboot

Ensuite nous allons procéder à l'installation de Asterisk :

sudo apt-get install asterisk

Un fois installé, modifiez ces paramètres pour que Asterisk demarre au démarrage de l'ordinateur :

sudo vim /etc/default/asterisk
RUNASTERISK=yes
RUNASTSAFE=no

Pour installer les paquets français de Asterisk, vous devez lancer cette commande :

sudo apt-get install asterisk-prompt-fr

Configuration

La configuration d'Asterisk s'articule sur les fichiers de configuration suivants :

Chaque modification dans la configuration devra être suivie par la commande
reload

saisie dans la console d'Asterisk

Paramétrer les sons en français

Modifier le fichier /etc/asterisk/sip.conf et modifiez la ligne :

language=en; Default language setting for all users/peers

en :

language=fr; Default language setting for all users/peers
N'oubliez pas d'enlever le point-virgule au début de la ligne.

Modifier les utilisateurs

Modifier le fichier /etc/asterisk/users.conf et veillez que la configuration de la rubrique général corresponde avec ce qui suit :

[general]
hasvoicemail = yes
hassip = yes
hasiax = yes
callwaiting = yes
threewaycalling = yes
callwaitingcallerid = yes
transfer = yes
canpark = yes
cancallforward = yes
callreturn = yes
callgroup = 1
pickupgroup = 1
nat = yes

Méthode sans template

Pour chaque utilisateur, ajoutez le code suivant (avec les modifications nécessaires) :

[6001]				; Numéro SIP
type=friend			; Type d'objet SIP (friend = utilisateur)
host=dynamic			; Vous pouvez vous connecter a ce compte SIP a partir de n’importe quelle adresse IP
dtmfmode=rfc2833		; Mode du DTMF
disallow=all			; Désactiver tous les codecs
allow=ulaw			; Activer les codecs µlaw
fullname = John DOE		; Nom complet de l'utilisateur (ce qui s'affichera sur le téléphone)
username = jdoe			; Nom d'utilisateur
secret=secret			; Mot de passe
context = work			; Contexte (exploité par le fichier extensions.conf)

Méthode avec template

Pour chaque template, ajoutez le code suivant (avec les modifications nécessaires) :

[template](!)			; Nom du template (ici template)
type=friend			; Type d'objet SIP (friend = utilisateur)
host=dynamic			; Vous pouvez vous connecter a ce compte SIP a partir de n’importe quelle adresse IP
dtmfmode=rfc2833		; Mode du DTMF
disallow=all			; Désactiver tous les codecs
allow=ulaw			; Activer les codecs µlaw
context = work			; Contexte (exploité par le fichier extensions.conf)

Pour chaque utilisateur, ajoutez le code suivant (avec les modifications nécessaires) :

[6001](template)		; Numéro SIP et template utilisé
fullname = John DOE		; Nom complet de l'utilisateur (ce qui s'affichera sur le téléphone)
username = jdoe			; Nom d'utilisateur
secret=secret			; Mot de passe

Configuration du Dialplan

Modifier le fichier /etc/asterisk/extensions.conf et ajoutez le code suivant (avec les modifications nécessaires) :

[work]			; Nom du contexte
exten => _6XXX,1,Dial(SIP/${EXTEN},20)	
exten => _6XXX,2,Hangup()

Dans ces trois lignes nous allons voir deux choses, les contextes et les extensions. [work] est le contexte c’est une sorte de conteneur dans lequel les utilisateurs faisant partis de ce contexte pourrons communiquer entre eux. Lors de la création de nos deux utilisateurs nous avons spécifié le contexte work.

Donc la ligne exten ⇒ _6XXX,1,Dial(SIP/${EXTEN},20) se traduit par: Quand on compose le numéro (par exemple) 6001, on appelle le numéro 6001 et si au bout de 20 secondes il n’y a pas de réponses on passe à la ligne du dessous.

La seconde ligne : exten ⇒ _6XXX,2,Hangup() permet de raccrocher si il n’y a pas de réponses au bout des 20 secondes.

Configuration des clients

Les clients "logiciels" n'ont généralement besoin que de quelques infos : Un nom (qui apparaitra en clair sur le client de destination lors d'un appel) , un login et son mot de passe associé, et l'adresse du serveur VOIP. Leur configuration étant assez simple et disponible sur beaucoup de pages internet, elle ne sera pas détaillée ici.

En revanche, si on utilise un appareil type combiné téléphonique IP, il y a un peu plus de travail…

Comme tout périphérique IP, il doit avoir une adresse. Soit le réseau VOIP dispose d'un serveur DHCP, dans ce cas l'appareil en obtiendra une automatiquement (ces appareils sont par défaut en recherche dhcp), soit il faut lui en donner une avant de le relier au réseau. Cela se fait avec les touches et les menus internes (voir notice du téléphone). Une fois l'adresse IP connue, l'entrer dans un navigateur internet pour accéder à l'interface web. C'est avec qu'on va configurer l'appareil et surtout l'enregistrer sur le serveur VOIP. Les informations nécessaires sont généralement dans un onglet ou menu "Login" ou "Identity". Les plus importantes sont :

Le compte ou l'ID de connexion (souvent le numéro du poste pour des raisons de simplicité, qui est défini entre les [ ] dans le users.conf ) Le mot de passe associé à ce compte (qui est défini dans le users.conf à la ligne "secret =" L'adresse du serveur VOIP (appelé généralement "registrar") Les options de chiffrement et encodages des appels, qui doivent être compatibles avec celles du serveur VOIP. Si la sécurité des appels n'est pas critique, autant simplement désactiver ces fonctions. Une fois ces infos indiquées, enregistrer l'appareil sur le serveur VOIP (un bouton d'enregistrement ou "register" est normalement présent sur l'interface web). Si la console Asterisk est ouverte, elle indiquera par un message que le serveur a bien enregistré l'appareil. S'il y a un souci, elle indiquera une description du problème (par exemple un mauvais nom d'utilisateur, un chiffrement non pris en charge, etc). De plus, le numéro du poste s'affiche alors à l'écran de l'appareil.

Remarque : S'il y a beaucoup de téléphones IP sur le réseau, leur interface permet généralement d'exporter la configuration pour la dupliquer.

Ensuite, plus facultatif :

Le nom qui apparaîtra sur le téléphone appelé (Displayname en général) Éventuellement une IP d'un proxy ou passerelle si le réseau VOIP interne peut communiquer avec l'extérieur des sonneries et messages personnalisés, etc.

Exemple d'AGI : allumer la lumière

AGI permet à Asterisk d’exécuter des scripts. L'exemple ci-dessous ouvre la piste vers toute sorte de solutions domotiques.

L'idée est la suivante: Asterisk modifie à distance un fichier sur le Raspberry. Sur celui-ci un script python analyse le fichier et active le GPIO en fonction.

Du côté du serveur Raspberry

Installer un raspberry avec Pi Os Lite. Activer le ssh. Pour l'exemple, l'utilisateur sera info, l'adresse IP du Raspberry 192.168.1.111.

Dans /home/info créer le script python command.py:

import RPi.GPIO as GPIO 
import time 
GPIO.setmode(GPIO.BCM) 
GPIO.setup(24, GPIO.OUT)

while True: 
 with open('command.txt', 'r') as fichier: 
 contenu = fichier.read()

 if "on" in contenu: 
  # Turn on 
  print('on') 
  GPIO.output(24, GPIO.HIGH) 
 else: 
  # Turn off 
  print('off') 
  GPIO.output(24, GPIO.LOW)
Du côté d'Asterisk

Il faut d'abord autoriser du ssh sans mot de passe. Dans la console (ne rien entrer comme nom de fichier et comme passphrase):

ssh-keygen -t rsa

Partager la clé avec le raspberry:

ssh-copy-id info@192.168.1.111

Configurer ensuite l'AGI, en ajoutant ces lignes dans extensions.conf:

exten => 801,n,AGI(allumer.agi)
exten => 800,n,AGI(eteindre.agi)

On crée ensuite les scripts correspondant. Créer le fichier /var/lib/asterisk/agi-bin/allumer.agi et le rendre éxécutable:

#!/bin/bash
scp /root/on.txt info@192.168.1.111:/home/info/command.txt

Faire de même pour eteindre.agi. Il faut aussi créer un fichier /root/on.txt contenant uniquement le mot on, et son équivalent off.

Recharger Asterisk. C'est sensé fonctionner!

Matériel compatible

Passerelle FXO

Les passerelles FXO permettent de convertir une ligne analogique en VoIP. Par exemple utiliser Asterisk avec la ligne d'une box.

Il s'agit de boîtiers indépendants se branchant d'une part sur une ou plusieurs lignes analogiques, d'autre part sur le réseau IP. Elles se configurent soit par une interface web, soit par divers protocoles comme telnet.

Grandstream GXW 4104

Indications de configuration:

Dans Asterisk:

Ajouter dans sip.conf:

[gxw410x]
type=peer
context=incoming
host=192.168.40.9
insecure=port

Dans extensions.conf (dialplan):

[outgoing]                                ; Appels sortants
exten => _XX,1,Dial(SIP/${EXTEN}@gxw410x)

[incoming]                                ; Appels entrants. Attention: même context qu'indiqué dans sip.conf.
exten => 9000,1,Dial(SIP/10,15,tTr)       ; Lors d'un appel de l'extérieur, ce sera le poste 10 qui recevra l'appel.

https://www.grandstream.com/sites/default/files/Faq/gxw410x_interop_asterisk.pdf

Passerelle RNIS

Le RNIS (ISDN en anglais) est une sorte de liaison téléphonique numérique utilisée surtout pour la téléphonie d'entreprise (ce n'est pas encore de la véritable VoIP).

Une ligne RNIS ou ligne Numéris en France est appelée T0; le port est appelé BRI. 1 ligne physique T0 donne accès à 2 communications simultanées grâce à deux canaux. Ainsi une passerelle avec deux ports BRI permet 4 communications simultanées. Dans ce cas, les 2 T0 forment un groupement: les utilisateurs appellent un seul numéro qui utilise l'une des quatre lignes.

Une passerelle RNIS est un boîtier indépendant se branchant d'une part sur un ou plusieurs ports BRI, d'autre part sur le réseau IP. Elle se configure soit par une interface web, soit par divers protocoles comme telnet.

Patton Smartnode 4120

Cette passerelle compte 2 port T0. Mais la programmation Smartnode semble identique sur toutes les passerelles Patton RNIS. L'interface web est acceptable mais le langage du fichier de configuration est mieux. J'ai donc préféré travailler sur le fichier ce qui est simplifié par l'usage du wizard, comme indiqué ci-dessous.

On trouve beaucoup de documentation, mais le meilleur guide est sans doute le manuel de configuration simplifié

Configuration de la passerelle

Pour se connecter à la passerelle, il faut en connaître l'adresse IP. Deux solutions: le logiciel de Patton, ou bien repérer l'adresse MAC sur votre routeur.

Par défaut aucune route n'est définie. Il n'est donc pas possible de se connecter depuis un autre sous-réseau. On peut créer la route depuis l'interface web; on peut aussi directement charger un fichier de configuration avec une route.

On trouve sur le site de Patton un wizard pour créer un fichier de configuration qu'il suffit ensuite de personnaliser. Aller sur cette page, connectez-vous et choisissez ensuite le wizard "SmartWare ISDN PSTN gateway Asterisk trunk Setup" qui produit un fichier de configuration qu'il suffit de charger sur la passerelle.

Ce wizard a trois défauts:

Ci dessous, un fichier de config sans la ligne de login et avec correction des deux derniers points. Il faut penser à modifier les adresses IP selon vos besoins.

#----------------------------------------------------------------#
#                                                                #
# SN4120/2BIS4V                                                  #
# R6.11 2019-07-02 H323 SIP                                      #
# 1970-01-20T23:16:11                                            #
# SN/00A0BA107E7B                                                #
# Generated configuration file                                   #
#                                                                #
#----------------------------------------------------------------#

cli version 3.20

clock local default-offset +00:00
webserver port 80 language en

system

  ic voice 0
    low-bitrate-codec g729

system
  clock-source 1 bri 0 0
  clock-source 2 bri 0 1

profile ppp default

profile tone-set default

profile voip default
  codec 1 g711alaw64k rx-length 20 tx-length 20
  codec 2 g711ulaw64k rx-length 20 tx-length 20

profile pstn default

profile sip default
  no autonomous-transitioning

profile aaa default
  method 1 local
  method 2 none

context ip router

  interface WAN
    ipaddress 192.168.40.9 255.255.255.0     # Adresse IP de la patton

context ip router
  route 0.0.0.0 0.0.0.0 192.168.40.1 0       # Adresse du routeur

context cs switch

  routing-table called-e164 RT_ISDN_TO_SIP
    route .T dest-interface IF_SIP

  interface isdn IF_ISDN_00
    route call dest-table RT_ISDN_TO_SIP
    call-reroute emit
    diversion emit

  interface isdn IF_ISDN_01
    route call dest-table RT_ISDN_TO_SIP
    call-reroute emit
    diversion emit

  interface sip IF_SIP
    bind context sip-gateway GW_SIP
    route call dest-service SRV_HG
    remote 192.168.40.10                  # Adresse d'Asterisk
    trust remote

  service hunt-group SRV_HG
    drop-cause normal-unspecified
    drop-cause no-circuit-channel-available
    drop-cause network-out-of-order
    drop-cause temporary-failure
    drop-cause switching-equipment-congestion
    drop-cause access-info-discarded
    drop-cause circuit-channel-not-available
    drop-cause resources-unavailable
    route call 1 dest-interface IF_ISDN_00
    route call 2 dest-interface IF_ISDN_01

context cs switch
  no shutdown

authentication-service AUTH_SRV

location-service SER_LOC
  domain 1 192.168.40.10                # Adresse d'Asterisk
  match-any-domain

  identity patton

    authentication outbound
      authenticate 1 authentication-service AUTH_SRV username patton

    registration outbound
      registrar 192.168.40.10              # Adresse d'Asterisk
      register auto

context sip-gateway GW_SIP

  interface IF_GWSIP
    bind interface WAN context router port 5060

context sip-gateway GW_SIP
  bind location-service SER_LOC
  no shutdown

port ethernet 0 0
  medium auto
  bind interface WAN router
  no shutdown

port bri 0 0
  clock auto
  encapsulation q921

  q921
    permanent-layer2
    uni-side auto
    encapsulation q931

    q931
      protocol dss1
      uni-side user
      bchan-number-order ascending
      encapsulation cc-isdn
      bind interface IF_ISDN_00 switch

port bri 0 0
  no shutdown

port bri 0 1
  clock auto
  encapsulation q921

  q921
    permanent-layer2
    uni-side auto
    encapsulation q931

    q931
      protocol dss1
      uni-side user
      bchan-number-order ascending
      encapsulation cc-isdn
      bind interface IF_ISDN_01 switch

port bri 0 1
  no shutdown
Configuration d'Asterisk

Si les adresses IP sont fixes, il n'y a pas besoin d'authentification.

Il suffit donc d'ajouter ces lignes dans sip.conf:

[patton] 
type=peer 
context=incoming
description=passerelle_BRI 
host=192.168.40.21 
insecure=port,invite

Dans le dialplan (extensions.conf) quelques exemples d'utilisation:

Pour les appels entrants, la Patton passe en numéro d'extension les quatre derniers chiffres du numéro appelé (le vôtre, donc!). L'exemple suivant vaut donc pour un numéro du type: xx xx xx 5678. C'est d'ailleurs ainsi qu'on peut modifier le comportement d'Asterisk selon le SDA appelé.

[incoming]                                ; Attention, même context qu'indiqué dans sip.conf
exten => 5678,1,Dial(SIP/10,25,tT)        ; Notez bien le numéro de l'extension.

Pour les appels sortants:

exten => _0X.,1,Set(CALLERID(num)=1 23 45 67 89)   ; Option pour afficher son numéro
 same =>      n,Dial(SIP/${EXTEN}@patton)          ;remarquez le @patton correspondant au context dans sip.conf

Téléphones

Matériel testé avec succès:

(default étant le context de la boîte vocale du SIP 10).

Liens