Installation d'un serveur téléphonique local avec Asterisk

ven. 18 mai 2018 by Marmotte

Asterisk est un IPBX logiciel, permettant la communication par différents protocoles, dont le SIP.

Cet article explique la mise en place d'un serveur de téléphonie simple, permettant de communiquer au sein du réseau local au moyen d'applications SIP et de téléphones analogiques.

Installation

Sur Debian, il suffit d'installer le paquet asterisk.

$ sudo apt install --no-install-recommends asterisk

Configuration

La configuration d'Asterisk se trouve dans le répertoire /etc/asterisk/.

Après toute modification de la configuration, il est nécesaire de lancer la commande sudo service asterisk reload pour prendre en compte les changements. Il est aussi possible de recharger la configuration avec la commande sudo asterisk -rx "core reload", qui est équivalente. Si cette forme ne semble pas intéressante pour recharger simplement les configurations, elle le devient dans le cas où les modifications demanderaient de relancer complètement Asterisk. Il est alors préférable d'utiliser sudo asterisk -rx "core restart when convenient", plutôt que sudo service asterisk restart, puisque cette commande attend que toutes les communications en cours soient terminées avant de relancer le service.

Configuration SIP

La configuration SIP globale d'Asterisk est située dans le fichier /etc/asterisk/sip.conf.

Je n'y ai modifié que le paramètre language pour mettre la valeur fr.

Déclaration des utilisateurs

Les utilisateurs sont déclarés dans le fichier /etc/asterisk/users.conf.

Pour simplifier la configuration des utilisateurs, j'ai créé un modèle contenant les paramètres qui sont identiques pour tous. La déclaration des utilisateurs basés sur ce modèle ne nécessite alors que de définir le mot de passe. Cependant, je préfère définir aussi un nom, qui sera affiché lors d'un appel de cet utilisateur.

Par exemple, voici comme déclarer deux utilisateur interne dont l'identifiant SIP est le numéro de téléphone (6000 et 6001), le mot de passe 1234 :

[local-user](!)
    type = friend
    host = dynamic
    context = default

[6000](local-user)
    fullname = Marmotte
    secret = 1234

[6001](local-user)
    fullname = Phone
    secret = 1234

Configuration du plan de numérotation

Le plan de numérotation permet de définir ce qui sera exécuté lors d'un appel. Cela peut être le déclenchement d'actions comme faire sonner le téléphone d'un utilisateur, raccrocher, envoyer l'appel vers la boite vocale, etc. Il est décrit dans le fichier /etc/asterisk/extensions.conf.

Les utilisateurs déclarés dans un même context peuvent automatiquement se joindre entre-eux, il n'est donc pas nécessaire de définir une configuration spécifique pour permettre aux utilisateurs locaux de communiquer.

La syntaxe du plan de numérotation est décrite en détail dans la documentation officielle d'Asterisk.

Cependant, pour donner un exemple rapide, voici un plan de numérotation qui définit un SVI (Serveur Vocal Interactif) très simple. Il permet à l'appelant de choisir un utilisateur en tapant un chiffre. Pour un vrai service, il faudrait au moins ajouter un texte vocal annonçant les différentes possibilités.

[default]
; When calling 5000, redirect to choose-user
exten => 5000,1,Goto(choose-user,s,1)

[choose-user]
; Answer the call
exten => s,1,Answer()
; Wait for a digit
exten => s,n,WaitExten()
; Redirect the call to the right user
exten => 0,1,Dial(SIP/6000)
exten => 1,1,Dial(SIP/6001)
; In case of a wrong digit or a timeout, terminate the call
exten => t,1,Hangup()

Utilisation d'un téléphone analogique

Si vous disposez de téléphones analogiques, il est possible de les utiliser en les connectant sur un serveur Asterisk.

Cela nécessite l'utilisation d'une carte analogique, qui sera installée dans le serveur, ou d'un boitier ATA (Analog Telephone Adapter), qui sera chargé de transmettre le signal analogique du téléphone sur un canal SIP.

Cartes analogiques

Je dispose d'une carte Digium TDM400P. L'utilisation de cette carte nécessite d'installer les modules DAHDI (Digium Asterisk Hardware Device Interface) du noyau Linux, qui ne sont pas présents par défaut sur Debian. Cela demande d'activer le composant non-free des dépôts Debian.

$ sudo apt install --no-install-recommends asterisk-dahdi dahdi-source dahdi-firmware-nonfree
$ # Debian way to compile and install modules
$ sudo m-a a-i dahdi

On lance ensuite la génération automatique de la configuation correspond aux cartes présentes dans la machine :

$ # Detect the right kernel module
$ sudo dahdi_genconf modules
$ # Load the right module. The name of this module is written in the /etc/dahdi/modules file
$ sudo modprobe <modulename>
$ # Define the hardware address of installed Digium cards
$ sudo dahdi_span_assignments auto
$ # Detect and configure modules installed on the cards
$ sudo dahdi_genconf

L'exécution de ces commandes génère la configuration de la carte dans le répertoire /etc/dahdi, ainsi que la configuration d'Asterisk pour les cartes Digium, dans /etc/asterisk/dahdi-channels.conf. J'ai ensuite modifié le fichier /etc/dahdi/system.conf, pour définir les valeurs des paramètres loadzone et defaultzone à fr.

Une fois que la carte est configurée, il est nécessaire de définir un utilisateur pour chaque port FXS dans la configuration d'Asterisk, afin de permettre au téléphone qui y est connecté d'être joignable. Comme les autres utilisateurs, celui-ci se configure dans le fichier /etc/asterisk/users.conf. Il est cependant nécessaire d'ajouter deux paramètres, pour déterminer à quel port FXS correspond cet utilisateur. La valeur des paramètres dahdichan et group sont ceux présents dans le fichier /etc/asterisk/dahdi-channels.conf.

[6100](local-user)
    fullname = Analog Phone
    dahdichan = 1
    group = 5

Note : Dans le cas où votre carte comporte des ports FXO et des ports FXS, les configurations des ports FXS correspondent aux blocs contenant la ligne signalling=fxo_ks.

Boitier ATA

Je possède un Cisco SPA122 et un Linksys SPA3102. Ces deux boitiers ATA font office de routeur, et sont donc pourvus de deux ports ethernet, nommés Internet (prévu pour le WAN) et Ethernet (prévu pour le LAN). La configuration par défaut définit le port Internet en client DHCP, et le port Ethernet en tant que serveur DHCP, et l'accès à la page d'administration n'est possible que depuis un ordinateur connecté sur le port Ethernet. J'ai donc connecté le port Internet à un switch mon réseau local, et un ordinateur sur le port Ethernet pour pouvoir accéder à la configuration.

Les éléments importants à définir dans la configuration de la ligne Voice sont :

  • Proxy : Adresse du serveur Asterisk.
  • User ID : Identifiant SIP de l'utilisateur configuré dans Asterisk.
  • Password : Mot de passe de l'utilisateur SIP.

La déclaration du compte SIP dans la configuration d'Asterisk ne demande pas de paramètre spécifique. Il est donc possible d'utiliser une configuration identique à celle décrite dans le précédent article.

Logiciels SIP

J'ai testé cette configuration de base avec le logiciel Linphone, sur Linux et Android. Après avoir renseigné l'adresse du serveur, l'identifiant utilisateur et le mot de passe associé, les deux ont pu communiquer sans problème entre eux, avec un téléphone connecté sur ma carte analogique, et avec un téléphone connecté sur l'un de mes boitiers ATA.