Asterisk, une configuration simple pour bien débuter

By | 27 January 2018 |
This entry is part 4 of 9 in the series Asterisk
Reading Time: 8 minutes

Introduction

Une fois l’installation terminée et les grandes lignes du firewall configurées, il ne vous reste plus qu’à configurer votre serveur.
“Plus qu’à”, plus facile à dire (écrire) qu’à faire vous me dites..
Rassurez-vous, ce post devrait vous simplifier la vie, en vous proposant au début une configuration simple d’Asterisk que vous pouvez enrichir petit à petit..

Le but étant de ne pas vous perdre dans la multitude de possibilités et de vous permettre d’avoir un serveur “online” rapidement.

Objectif 1 : établir une communication en interne

Le status de votre serveur

Avant de pouvoir configurer votre serveur, il est nécessaire de s’assurer que celui-ci fonctionne, de vérifier son status, de pouvoir l’arrêter ou redémarrer au besoin.

Asterisk CLI

Le moyen le plus rapide de vérifier que notre serveur Asterisk est bien en fonctionnement est de se connecter à sa ligne de commande,
pour celà il suffit de taper la commande

# asterisk

asterisk command

Résultat de la commande “asterisk”

Si vous souhaitez rester connecté à la console, afin par exemple de taper des commandes, il vous faut ajouter l’argument “r”

# asterisk -r

commande ligne d'asterisk

Connexion à la commande ligne d’asterisk

Vous pouvez également choisir, le niveau d’information (niveau de verbosité) que vous voulez recevoir dans la console en ajoutant un ou plusieurs “v”

# asterisk -rv

ou si vous souhaitez beaucoup plus d’information

# asterisk -rvvvvvvvv

asterisk verbosité

asterisk verbosité “v”

Service Asterisk

Dans la même optique, vous pouvez également vérifier le status du service asterisk

# service asterisk status

Asterisk service status

Comme pour les autres services, les options “start“, “stop“, “restart“, “reload” sont disponibles

Options service asterisk

Le service asterisk est démarré au boot de votre system.
L’ordre de démarrage des services pourra avoit son importance si vous décidez par exemple d’installer un serveur VPN, pour que vos extensions soient joignables via ce tunnel, il faudra qu’Asterisk démarre après le serveur VPN.

Les fichiers de configuration

Sur “Raspbian“, mais également “Debian”, “Ubuntu”, les fichiers de configuration (*.conf) se trouvent dans le répertoire /etc/asterisk.
Asterisk permet de gérer plusieurs protocoles de communications, nous nous intéresserons juste au protocole SIP.

Nous allons nous focaliser sur les fichiers que je considère les plus important pour notre mise en route.

  • sip.conf
  • users.conf
  • extensions.conf
  • rtp.conf

A noter que pour les trois premiers fichiers, il n’est pas obligatoire de séparer leur contenu,
certains tutoriaux sur le net regroupent l’information dans le fichier principal “sip.conf” et laisse donc les autres fichiers vides.
J’ai fait le choix de les séparer, un des avantages est qu’ainsi les utilisateurs et extensions configurés le sont également pour d’autres protocoles.

Veuillez noter également que tout changement dans les fichiers de configuration ne prendra effet qu’après un reload de la configuration, ce qui se fait soit

  • via l’option “reload” du service
  • via la commande “sip reload” dans la CLI
  • directment depuis votre terminal avec la commande “# asterisk -rx “sip reload”

sip.conf

Ce fichier contiendra les options générales de votre configuration comme par exemple:

  • la langue de votre serveur, utile si vous utilisez les fichiers audios (répondeur, ivr, …)

    language=fr

  • les informations réseaux (adresse, port, ..)

    bindport=5060
    bindaddr=0.0.0.0
    srvlookup=yes

    J’ai choisi de garder le port standard 5060 et d’écouter sur toutes les interfaces, ceci parce que j’ai dans l’esprit d’ajouter plus tard un serveur VPN.
    Si ce n’est pas votre cas, vous pouvez renseigner l’adresse IP de votre serveur, que vous pouvez obtenir avec la commande “ifconfig

  • les options pour gérer le NAT

    qualify=yes
    nat=force_rport,comedia
    directmedia=update,nonat
    localnet=192.168.1.0/255.255.255.0
    localnet=10.8.0.0/255.255.0.0
    externhost=<yourddns>:5060
    externrefresh=15
    directmediapermit=192.168.1.0/255.255.255.0
    directmediapermit=10.8.0.0/255.255.0.0

    Ceci suppose que votre serveur se trouvera derrière votre BBOX et ne sera pas dans la DMZ.
    Deux réseaux locaux (localnet) sont renseignés que vous devrez peut-être adapter selon votre réseau, dans mon cas:
    le premier (192.168.1.0/24) est le réseau de la BBOX3 tandis que le réseau 10.8.0.0/16 est le réseau d’un future VPN.
    Pour ces deux réseaux, j’autorise la communication en direct entre les extensions (directmediapermit).

On peut donc partir sur un fichier assez simple ressemblant à ceci

[general]
language=fr
bindport=5060
bindaddr=0.0.0.0
srvlookup=yes
qualify=yes
nat=force_rport,comedia
directmedia=update,nonat
localnet=192.168.1.0/255.255.255.0
localnet=10.8.0.0/255.255.0.0
externhost=<yourddns>:5060
externrefresh=15
directmediapermit=192.168.1.0/255.255.255.0
directmediapermit=10.8.0.0/255.255.0.0

Afin de vérifier que nous n’avons pas fait d’erreur de syntaxe, nous pouvons nous connecter à la console et tapez la commande afin de reloader la configuration.

sip reload

Cette configuration pose les bases de notre serveur mais on ne peut toujours pas téléphoner avec cette configuration…

users.conf

Comme vous pouvez-vous y attendre, ce fichier sert à la définition des utilisateurs.
Je divise ce fichier en trois sections

  • general
  • template
  • user

General

Dans cette section, on retrouve les options qui s’appliquent à tous les utilisateurs, on y retrouve entre autres le(s) protocole(s) authorisés (seulement SIP dans notre cas), les actions autorisées (forward, park, ..).

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

Templates

J’ai décidé de créer un template selon

  • le type de téléphone (ip phone, soft-phone)
  • et la manière dont ces téléphones vont se connecter (réseau interne, réseau externe, vpn).

Le but derrière la création de ces templates est de faciliter la maintenance et l’ajout de nouveau utilisateurs, car on y retrouve les options communes.
Je n’ai pas considéré la dimension du contexte, les templates ne permettent que de joindre les extensions locales (context=User-Internal voir plus loin dans l’article), si besoin un contexte plus précis sera donné dans la définition des utilisateurs.

IP phone

Ce template sera utilisé par les téléphone IP, souvent connecté au réseau local (192.168.1.0/24) par cable.

[ip-phone](!)
type=friend
context=User-internal
host=dynamic
qualify=yes
dtmfmode=auto
disallow=all
allow=ulaw
allow=g722
nat=force_rport,comedia
directmedia=update
fromdomain=<yourddns>
defaultexpirey=3600

Soft-phone local

Ce template sera utilisé par les softwares qui permettent d’utiliser le protocole SIP que ce soit sur ordinateur (Ekiga, Twinkle, …) our sur téléphone mobile (Zoiper, Csip, …) mais toujours connecté au réseau local (192.168.1.0/24) par wifi ou cable.

[soft-phone](!)
type=friend
context=User-internal
host= dynamic
qualify=yes
dtmfmode=auto
disallow=all
allow=ulaw
allow=g722
nat=force_rport,comedia
directmedia=update,nonat
fromdomain=<your-ddns>
defaultexpirey=3600

Soft-phone VPN

[soft-phone-vpn](!)
type=friend
context=User-internal
host=dynamic
qualify=yes
dtmfmode=auto
disallow=all
allow=ulaw
allow=g722
nat=force_rport,comedia
directmedia=no
fromdomain=<your-ddns>
defaultexpirey=3600

External

Un template pour les IP phones ou softphones se connectant de l’extérieur, pour ce dernier type, il faudra revoir notre firewall afin d’autoriser ces utilisateurs à s’enregistrer..

Les Utilisateurs

Dans cette dernière section, je rattache chaque uilisateur à un template et lui ajoute ces caractéristiques propres comme

  • le numéro d’extension pour le joindre
  • l’ID de l’utilisateur (à noter que j’ai opter pour un ID différent du numéro d’extension)
  • le mot de passe de l’utilisateur
  • le nom du contact qui s’affichera lors des appels
  • l’adresse email pour recevoir les messages vocaux

ce qui donne par example pour un soft-phone (en gras le template)

[blablabefddcvgyefjeif-1](soft-phone)
alternateexts= 6001
fullname= Malandra Sebastien
description= Ekiga-cba
;context= User-standard
secret=<mot-de-passe-de-cet-utilisateur>
email= [email protected]
cid_number = 6001

et pour un IP phone:

[blablabefddcvgyefjeif-2](ip-phone)
alternateexts= 6005
;fullname= Malandra Sebastien
description= TB30-Bureau
;context= User-standard
secret=<mot-de-passe-de-cet-utilisateur>
email= [email protected]
cid_number = 6005

il ne reste plus qu’à sauver le fichier et s’assurer qu’Asterisk considère les changements avec les commandes “sip reload” suivies de “sip show peers

Montrer les utilisateurs SIP

Résultat de la commande sip show peers

J’ai effacé les autres utilisateurs et mis en évidence les 2 utilisateurs dont je donne l’exemple plus haut, on peut voir sur l’image que le premier utilisateur utilisant l’IP phone est connecté (IP 192.168.1.28) mais que l’autre n’est pas connecté. (pas d’IP et status UNKNOWN)

Maintenant, on a deux utilisateurs mais ceux-ci ne peuvent toujours pas s’appeller, mais ça ne devrait plus trop tarder..

extensions.conf

Ce fichier que l’on appelle aussi le dialplan (plan d’appel) décrit l’action ou la suite d’actions qui se passe lorsque l’on essaie de joindre un numéro (une extension).

Il se compose dans ma configuration de différentes sections

  • [general] pour la configuration valable pour toutes les extensions
  • [globals] pour la définition des variables globales qui peuvent être utilisées dans la définition des extensions
  • [Includes]

La section générale

[general]
static=yes
writeprotect=no
autofallthrough=yes
clearglobalvars=yes
priorityjumping=no

La section globales

[globals]
DIAL_OPTS = g
MY_DIAL_STATUS = ANSWER
TIMEOUT = 45

Les includes

#include “z_submenu.conf
#include “z_localset.conf”
#include “z_user_context.conf”
#include “z_outgoing_context.conf”

Rien ne vous oblige à créer des includes mais je trouvais qu ça permettait d’avoir une configuration claire.

Le fichier z_submenu.conf

Dans ce fichier, comme pour la configuration des templates pour les users, ceci permet de définir une suite d’instructions et de pouvoir l’appeler, évitant ainsi de devoir répéter les mêmes instructions. L’autre avantage qui peut s’avérer parfois un problème est que l’on peut changer le flow de toutes ces extesions, juste en changeant ces flows.

Dans ma configuration, je m’en sers principalement pour ne pas devoir répéter le suite d’instructions, si personne ne décroche dans les 20 secondes, envoyer l’appel vers la messagerie.

[subDialVm]
exten => start,1,NoOp()
same => n,GoSub(subDialer,start,1(${ARG1},20))
same => n,GotoIf($[“${GOSUB_RETVAL}” = “ANSWER”]?DialOk)
same => n,GoSub(subVoicemail,start,1(${ARG2},LocalSets,${GOSUB_RETVAL}))
same => n(DialOk),Hangup()

[subDialer]
exten => start,1,NoOp()
same => n,Dial(${ARG1},${ARG2},${DIAL_OPTS})
same => n,Return(${DIALSTATUS})

[subVoicemail]
exten => start,1,NoOp() ; vmbox, context, dialStatus
same => n,GotoIf($[“${ARG3}” = “ANSWER”]?VmOk)
same => n,Set(VmMessage=${IF($[${ARG3} = BUSY]?b:u)})
same => n(VmOk),VoiceMail(${ARG1}@${ARG2},s,${VmMessage})
same => n,Hangup()

Le fichier z_localset.conf

Dans ce fichier, j’ai décidé d’inclure la configuration des extensions locales que ce soit des IP Phones, des soft-phones connecté par cable, wifi ou VPN et de les regrouper dans un contexte appelé “LocalSets

Si je reprends l’exemple des 2 extensions données plus haut 6005 et 6012, celà donne ceci:

[LocalSets]
exten => 60XX,1,GoSub(subDialVm,start,1(SIP/${EXTEN}))

Les deux “XX” dans 60XX, représente n’importe quel chiffre entre 0 et 9, entrement dit les extensions entre 6000 et 6099.

j’ai également inclu des extensions spéciales:

  • un test d’echo sur l’extension 6000, ceci permet de vérifier la qualité audio de vos appels
  • pour le VoiceMail, l’extension 150 afin d’écouter vos messages vocaux
  • pour les fax
  • pour les appels venant de l’extérieur (ligne OVH dans mon cas)

Nous reviendrons sur ces extensions plus tard dans notre configuration.

Le fichier z_user_context.conf

Ce fichier me permet de jouer avec les contextes de mes utilisateurs, celui qui nous attribuons à nos users lors de la création.
Ce contexte permet de limiter ce qu’un utilisateur peut faire, par exemple il

  • ne peut joindre que les extensions locales
  • ne peut joindre que les numéros nationaux résidentiel
  • ne peut joindre que les numéros résidentiel en France (Italie, Suisse, ..)
  • ne peut joindre que les réseaux mobiles belges (français, italien, suisse, ..)
  • ….

Dans notre template, nous avons définit le contexte “User-Internal” qui est définit comme ceci

[User-internal]
include => LocalSets

Pour nos deux utilisateurs, nous avons utilisé, bien que pour le moment commenté (précédé d’un “;”),
le contexte “User-Standard”, ce qui leur permettra de joindre les extensions internes mais également le monde extérieur.

[User-standard]
include => User-internal
include => out_SupportOVH
include => out_national
include => out_BE_internationnal_0032
include => out_BE_internationnal_+32
include => out_FR_internationnal_0033
include => out_FR_internationnal_+33
include => out_LU_internationnal_0035
include => out_LU_internationnal_+35
include => out_IT_internationnal_0039
include => out_IT_internationnal_+39

En combinant ces différents contextes, on arrive à donner des accès très précis.
A ce stade, comme les utilisateurs utilisent le contexte “User-internal”, ils peuvent s’appeler.

Le fichier z_outgoing_context

Dans ce fichier, on retrouve la configuration permettant de joindre le monde exterieur.
On retrouve donc les contextes “out_SupportOVH,” “out_national”, “out_BE_internationnal_0032”, “out_FR_internationnal_0033”, …
Cette configuration n’est pour le moment pas utilisée, elle le sera dés lors que nous aurons enregistrer notre ligne SIP chez OVH et mis à jour les utilisateurs pour utiliser le contexte “User-Standard”.

A titre d’exemple, voici à quoi ressemble certains de ces contextes

  • out_SupportOVH – permet de joindre le support OVH (0033972101007)[out_SupportOVH]

exten => _0033972101007,1,NoOp(${LigneSip}/N_${EXTEN}, ${TIMEOUT}, ${DIAL_OPTS})
same => n,Set(LigneSip=SIP/sip-ovh-line1)
same => n(dial),NoOp(${LigneSip})
same => n,NoOp(Limiting maximum call duration)
same => n,Set(TIMEOUT(absolute)=3300);
same => n,Dial(${LigneSip}/${EXTEN}, ${TIMEOUT}, ${DIAL_OPTS})
same => n,Congestion(3)

  • Le réseau résidentiel belge

[out_national]
exten => _0ZX.,1,NoOp(${LigneSip}/N_${EXTEN}, ${TIMEOUT}, ${DIAL_OPTS})
same => n,Set(LigneSip=SIP/sip-ovh-line1)
same => n(dial),NoOp(${LigneSip})
same => n,NoOp(Limiting maximum call duration)
same => n,Set(TIMEOUT(absolute)=3300);
same => n,Dial(${LigneSip}/${EXTEN}, ${TIMEOUT}, ${DIAL_OPTS})
same => n,Congestion(3)

  • Pour joindre le réseau résidentiel français

[out_FR_internationnal_+33]
exten => _[+3]3[12345].,1,NoOp(${LigneSip}/N_${EXTEN}, ${TIMEOUT}, ${DIAL_OPTS})
same => n,Set(LigneSip=SIP/sip-ovh-line1))
same => n(dial),NoOp(${LigneSip})
same => n,NoOp(Limiting maximum call duration)
same => n,Set(TIMEOUT(absolute)=3300);
same => n,Dial(${LigneSip}/${EXTEN}, ${TIMEOUT}, ${DIAL_OPTS})
same => n,Congestion(3)

Un mot d’explication pour certaines options de la configuration

  1. Pour appeler le réseau externe, nous devons nous enregistrer sur un serveur permettant de faire la passerelle entre notre serveur Asterisk et le reste du monde, dans cet exemple, nous utilisons une ligne SIP de chez OVH, appelée ici “sip-ovh-line1”, nous verrons plus tard dans cette série comment la configurer.
  2. Nous fixons un timeout à 3300 sec (50 min) par appel, après ces 50 minutes la communication est coupée,
    ceci est lié aux conditions d’OVH qui facture à partir de la 3601 secondes, cette valeur peut donc être adaptée à la hausse.
  3. Afin de facilité la configuration, il est possible d’utiliser des “patterns”, nous avons déjà utilisé le “X” dans la configuration des LocalSets, nous en tulisons d’autres dans cette configuration.

    X pour n’importe quel chiffre entre 0-9
    Z pour n’importe quel chiffre entre 1-9
    N pour n’importe quel chiffre entre 2-9
    [1237-9] pour n’importe quel chiffre ou lettre entre les [ ], (dans cet exemple, 1,2,3,7,8,9)
    [a-z] n’importe quelle lettre minuscule
    [A-Z] n’importe quelle lettre majuscule
    . suivi de un ou plusieurs chiffre(s)/lettre(s)

rtp.conf

Ce fichier dicte à Asterisk quel range de ports “rtp” il doit utiliser pour les communication audio.
Je considère cette configuration importante car nécessaire à la bonne configuration de votre firewall, particulièrement important quand vous connecterez votre serveur au monde extérieur.
Si vous avez une doute, je vous renvois vers le billet décrivant la configuration de votre firewall en suivant ce lien

Conclusion

Cette configuration simple d’Asterisk, vous permet permet globalement de l’utiliser à l’intérieur de votre réseau, par exemple

  • comme Talkie-Walkie si vous installer les clients SIP sur vos téléphone mobiles
  • comme interphone

Cette configuration ne vous permet pas d’être joignable ou de joindre le monde extérieur, c’est le but du prochain billet.

Series Navigation<< Comment configurer le firewall de votre serveur Asterisk en 5 minutesComment connecter votre serveur Asterisk à OVH >>

Laisser un commentaire

This site uses Akismet to reduce spam. Learn how your comment data is processed.