Asterisk Concepts de bases

1. Sources à consulter

Ces chapitres de la documentation officielle ont été examinés en salle de formation :

Ils correspondent aux chapitres suivants du livre officiel Asterisk The Definitive Guide, 4th Edition :

  1. A Telephony Revolution
  2. Asterisk Architecture
  3. Installing Asterisk
  4. Initial Configuration Tasks
  5. User Device Configuration
  6. Dialplan Basics
  7. Dialplan Syntax
  8. A Simple Dialplan

2. Introduction à Asterisk

2.1. Versions d’Asterisk

Release Series Release Type Release Date Security Fix Only EOL
11.x LTS 2012-10-25 2016-10-25 2017-10-25
12.x Standard 2013-12-20 2014-12-20 2015-12-20
13.x LTS 2014-10-24 2018-10-24 2019-10-24
14.x Standard 2016-09-26 2017-09-26 2018-09-26
15.x LTS 2017-10-03 2018-10-03 2019-10-03

https://wiki.asterisk.org/wiki/display/AST/Asterisk+Versions

2.2. Composants d’Asterisk

https://wiki.asterisk.org/wiki/display/AST/Asterisk+Architecture%2C+The+Big+Picture

2.3. Channels

Un "Channel" est l'équivalent d'une ligne téléphonique mais en format digital. Un "canal" consiste en général en un système de signalisation analogique digitale (TDM) ou une combinaison de codecs et de protocoles de signalisation comme par exemple SIP-GSM ou IAX-uLaw. Au début de la téléphonie, toutes les connexions téléphoniques étaient analogiques et étaient susceptibles de subir de l'écho ou du bruit. Plus tard la plupart des systèmes ont été convertis en systèmes digitaux, avec un son analogique converti dans un format digital en utilisant le «pulse code modulation » (PCM) dans la plupart des cas. Ce format permet une transmission vocale avec 64 Kbps sans compression (PCMU ou PCMA).

Channels qui s'interfacent sur le PSTN

  • chan_dahdi : Supporte les cartes venant de Sangoma, Digium, Xorcom et autres.
  • chan_mISDN : Supporte les cartes ISDN* (RNIS) cards se basant sur les pilotes Linux ISDN.

Channels qui s'interfacent en Voice-over IP

  • chan_sip : Supporte la voice-over IP en utilisant le protocole SIP. Le pilote est remplacé par défaut par channel_pjsip à partir d’Asterisk 12 !
  • chan_pjsip : fournit les nouveaux services SIP
  • chan_iax : Supporte la voice-over IP en utilisant le protocole IAX2.

Autres channels

  • chan_agent : utilisé dans le cadre d'un ACD. Ce channel n'a pas de rapport avec un matériel ou un protocole. Il peut être utilisé pour de la mobilité, permettant à une personne d'utiliser n'importe quel téléphone seulement en connectant à l'agent.
  • chan_local : C'est un « pseudo » channel qui peut créer un bouclage dans un dialplan (dans un « Context » Asterisk). C'est utile pour du routage récursif.
  • ...

2.4. Codec

Un codec est un procédé qui permet de coder/décoder la voix en données digitales. Leur performance dépend de leur rapport qualité / bande passante.

Codecs et traduction de codecs

Nous avons l'habitude de placer autant de connexions voix que possible dans un réseau de données. Les codecs activent de nouvelles fonctionnalités en voix digitale telle que la compression permettant des gains en bande passante avec un ratio de 8 à 1. Mais il y a aussi des fonctionnalités de détection d'activité vocale, d'annulation de perte de paquets et de génération de bruit de confort. Plusieurs codecs sont disponibles sous Astersik et peuvent traduits de manière transparente l'un vers l'autre.

Codecs disponibles

Pour vérifier quels codecs sont disponibles sur votre système veuillez frapper dans la console :

CLI>core show translation

Les codecs suivants sont supportés par Asterisk :

  • G.711 ulaw (USA) - (64 Kbps). - MOS 4.3
  • G.711 alaw (Europe) - (64 Kbps). - MOS 4.3
  • G.722 (Haute Définition) – (64 Kbps).
  • G.723.1 – seulement en pass-through mode (non traduisible) - MOS 3.9
  • G.726 - (16/24/32/40kbps) - MOS 3.8
  • G.729a - Licence nécessaire (8Kbps) - MOS 3.7
  • GSM - (12-13 Kbps) - MOS 3.5
  • iLBC - (15 Kbps) - MOS 4.14

Ils sont caractérisés par une valeur MOS qui spécifie leur qualité audible.

2.5. Modules

Pour établir les appels d'un téléphone à un autre, c'est l'application dial() qui est sollicitée. La plupart des fonctionnalités d'Asterisk sont implémentées en tant qu'applications.

On peut constater les applications disponibles avec la commande CLI core show applications :

CLI>core show applications

Vous pouvez ajouter des applications venant d'add-ons Asterisk, des fournisseurs tiers ou en en développant vous-même.

3. Installation

Distribution : Centos7

cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
CentOS Linux release 7.4.1708 (Core)

Minimum : 1Go RAM

3.1. Préparation du système

En tant qu'utilisateur root.

Si on utilise un serveur public (chez Scaleway par exemple), il est conseillé de privatiser l'accès avec OpenVPN à l'aide de la procédure suivante.

wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh

Elle a pour effet de :

  • Installer et de configurer un serveur OpenVPN
  • Créer des fichiers de configuration client
  • Installer et configurer le routage et le pare-feu n'autorisant que le service SSH et OpenVPN
  • Avec cette configuration tout trafic passera par le tunnel

Pour supprimer ce routage par défaut et pousser d'autres routes, on pourra s'inspirer de cette procédure :

sed -i s/^push/#push/g /etc/openvpn/server.conf
ip=$(ip -4 addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//')
echo push "route ${ip} 255.255.255.255" >> /etc/openvpn/server.conf
systemctl restart openvpn@server.service

Mise à jour du système et redémarrage

yum -y install epel-release && yum update -y && shutdown -r now

Synchronisation temporelle et installation de NTP (Network Time Protocol)

yum -y install chrony && systemctl enable chronyd && systemctl start chronyd

Localisation.

timedatectl  list-timezones
timedatectl  set-timezone Europe/Brussels

Nom d'hôte, par exemple "pbx01"

hostnamectl set-hostname pbx01

Locale.

localectl set-locale LANG=fr_BE.UTF-8
localectl set-keymap be
localectl
   System Locale: LANG=fr_BE.UTF-8
       VC Keymap: be
      X11 Layout: be
     X11 Variant: oss

Ajouter un utilisateur asteriskpbx.

adduser asteriskpbx && passwd asteriskpbx && yum -y install sudo && gpasswd -a asteriskpbx wheel && exit

3.2. Acquérir les sources

Se reconnecter sous l'utilisateur asteriskpbx :

su - asteriskpbx

Créer la structure des dossiers.

mkdir -p ~/src/asterisk-complete/asterisk
cd ~/src/asterisk-complete/asterisk

Obtenir les sources d’Asterisk (ici version 13) et installer les dépendances.

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
tar xvfz asterisk-13-current.tar.gz
mv asterisk-13.12.2 current
cd current
sudo ./contrib/scripts/install_prereq install
./contrib/scripts/get_mp3_source.sh

3.3. Configurer et compiler

Sur n’importe quelle plateforme, on peut exécuter la compilation selon des principes similaires.

Un script vérifie la configuration de la compilation.

./configure --libdir=/usr/lib64 --with-pjproject-bundled

Support des MP3 (format_mp3), sons français (CORE-SOUNDS-FR-GSM et EXTRA-SOUNDS-FR-GSM) à choisir dans menuselect. Le terminal doit être à une taille minimale de 80 x 27.

make menuselect

Compilation.

make

Installation des binaires.

sudo make install

A la fin de la compilation, on nous propose de générer des copier fichiers d'exemple et de documentation. Pour l'exercice, nous construirons nous-mêmes les fichiers de configuration.

 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 + Asterisk has successfully been installed. +
 + If you would like to install the sample   +
 + configuration files (overwriting any      +
 + existing config files), run:              +
 +                                           +
 + For generic reference documentation:      +
 +    make samples                           +
 +                                           +
 + For a sample basic PBX:                   +
 +    make basic-pbx                         +
 +                                           +
 +                                           +
 +-----------------  or ---------------------+
 +                                           +
 + You can go ahead and install the asterisk +
 + program documentation now or later run:   +
 +                                           +
 +               make progdocs               +
 +                                           +
 + **Note** This requires that you have      +
 + doxygen installed on your local system    +
 +-------------------------------------------+

Pour installer le service.

sudo make config

Pour le démarrer.

sudo systemctl start asterisk

Pour l'activer au démarrage.

sudo systemctl enable asterisk
asterisk.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig asterisk on

Pour vérifier le statut du service.

sudo systemctl status asterisk
 asterisk.service - LSB: Asterisk PBX
   Loaded: loaded (/etc/rc.d/init.d/asterisk)
   Active: active (running) since ven 2016-11-11 16:52:06 CET; 24s ago
     Docs: man:systemd-sysv-generator(8)
 Main PID: 27274 (asterisk)
   CGroup: /system.slice/asterisk.service
           ├─27272 /bin/sh /usr/sbin/safe_asterisk
           └─27274 /usr/sbin/asterisk -f -vvvg -c

nov 11 16:52:05 localhost.localdomain systemd[1]: Starting LSB: Asterisk PBX...
nov 11 16:52:06 localhost.localdomain asterisk[26129]: Starting asterisk:
nov 11 16:52:06 localhost.localdomain systemd[1]: PID file /var/run/asterisk/asterisk.pid not readable (yet?)...art.
nov 11 16:52:06 localhost.localdomain systemd[1]: asterisk.service: Supervising process 27274 which is not ou...its.
nov 11 16:52:06 localhost.localdomain systemd[1]: Started LSB: Asterisk PBX.
nov 11 16:52:12 localhost.localdomain systemd[1]: asterisk.service: Supervising process 27274 which is not ou...its.
Hint: Some lines were ellipsized, use -l to show in full.

Note : Adaptation des droits sur les dossiers installés

sudo chown -R asteriskpbx:asteriskpbx /var/lib/asterisk/
sudo chown -R asteriskpbx:asteriskpbx /var/spool/asterisk/
sudo chown -R asteriskpbx:asteriskpbx /var/log/asterisk/
sudo chown -R asteriskpbx:asteriskpbx /var/run/asterisk/

ou encore en une seule ligne :

sudo chown -R asteriskpbx:asteriskpbx {/var/lib,/var/spool,/var/log,/var/run}/asterisk

Une option d'installation configure la rotation des logs.

$ sudo make install-logrotate

4. Adaptation du pare-feu

Malgré qu'il soit conseillé d'utiliser firewalld, il est possible de le désactiver et de repasser aux commandes iptables.

Options disponibles

  • Firewalld : le plus actualisé
  • Désactivation : déconseillé
  • Iptables

4.1. Firewalld

sudo systemctl start firewalld && systemctl enable firewalld
sudo firewall-cmd --zone=public --add-port=5060/udp --permanent
sudo firewall-cmd --zone=public --add-port=5060/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5061/tcp --permanent
sudo firewall-cmd --zone=public --add-port=4569/udp --permanent
sudo firewall-cmd --zone=public --add-port=10000-20000/udp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eno16777736
  sources:
  services: dhcpv6-client ssh
  ports: 5061/tcp 4569/udp 5060/tcp 10000-20000/udp 5060/udp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

4.2. Désactivation

sudo systemctl stop firewalld && systemctl disable firewalld

4.3. Retour à iptables

sudo yum install -y iptables-services
sudo systemctl enable iptables
sudo systemctl start iptables
sudo iptables -F
sudo iptables -X
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -d 127.0.0.0/8 -j REJECT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -j ACCEPT
sudo iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
sudo iptables -A -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
sudo iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp -m tcp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p udp -m tcp --dport 5061 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
sudo iptables -A -A INPUT -j DROP
sudo iptables -A -A FORWARD -j DROP

Note: DHCPc/DHCPv6c ACCEPT ?

sudo iptables-restore < /etc/iptables.firewall.rules
sudo iptables -L
sudo /usr/libexec/iptables/iptables.init save

5. Configuration minimale

On doit trouver au minimum 5 fichiers dans le dossier /etc/asterisk :

  • asterisk.conf
  • indications.conf
  • modules.conf
  • extensions.conf
  • sip.conf ou pjsip.conf

Accessoirement, pour commencer, on peut ajouter le fichier musiconhold.conf.

5.1. Fichier indications.conf

Créer le dossier /etc/asterisk et copie du fichier indications.conf

sudo mkdir -p /etc/asterisk
sudo chown asteriskpbx:asteriskpbx /etc/asterisk
cd /etc/asterisk/
cp ~/src/asterisk-complete/asterisk/current/configs/samples/indications.conf.sample ./indications.conf

5.2. fichier asterisk.conf

Copie du fichier asterisk.conf dans le dossier /etc/asterisk et changement du runuser et rungroup avec la valeur asteriskpbx :

cp ~/src/asterisk-complete/asterisk/current/configs/samples/asterisk.conf.sample ./asterisk.conf

Éléments à ajouter dans le fichier asterisk.conf

runuser = asteriskpbx
rungroup = asteriskpbx

5.3. Fichier modules.conf

Créer le fichier modules.conf. C'est le fichier d'activation/désactivation des modules.

cat >> /etc/asterisk/modules.conf
; The modules.conf file, used to define which modules Asterisk should load (or
; not load).
;
[modules]
autoload=yes


; Resource modules currently not needed
noload => res_speech.so
noload => res_phoneprov.so
noload => res_ael_share.so
noload => res_clialiases.so
noload => res_adsi.so


; PBX modules currently not needed
noload => pbx_ael.so
noload => pbx_dundi.so


; Channel modules currently not needed
noload => chan_oss.so
noload => chan_mgcp.so
noload => chan_skinny.so
noload => chan_phone.so
noload => chan_agent.so
noload => chan_unistim.so
noload => chan_alsa.so


; Application modules currently not needed
noload => app_nbscat.so
noload => app_amd.so
noload => app_minivm.so
noload => app_zapateller.so
noload => app_ices.so
noload => app_sendtext.so
noload => app_speech_utils.so
noload => app_mp3.so
noload => app_flash.so
noload => app_getcpeid.so
noload => app_setcallerid.so
noload => app_adsiprog.so
noload => app_forkcdr.so
noload => app_sms.so
noload => app_morsecode.so
noload => app_followme.so
noload => app_url.so
noload => app_alarmreceiver.so
noload => app_disa.so
noload => app_dahdiras.so
noload => app_senddtmf.so
noload => app_sayunixtime.so
noload => app_test.so
noload => app_externalivr.so
noload => app_image.so
noload => app_dictate.so
noload => app_festival.so

Ctrl+D

5.4. Fichier musiconhold.conf

Configurer musiconhold.conf :

cat >> musiconhold.conf
; musiconhold.conf
[general]


[default]
mode=files
directory=moh

Ctrl+D

6. Un Simple PBX

6.1. Fichier sip.conf

Pour comparaison avec le fichier pjsip.conf et pour mémoire, un exemple de fichier sip.conf.

;sip.conf
[general]
transport=udp


[telephones](!)
type=friend
host=dynamic
context=appels-internes
disallow=all
allow=ulaw


[telephone1](telephones)
secret=1111
[telephone2](telephones)
secret=1111
[telephone3](telephones)
secret=1111

6.2. Fichier pjsip.conf

;pjsip.conf
;===============TRANSPORT

[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0

;===============ENDPOINT TEMPLATES

[endpoint-basic](!)
type=endpoint
context=appels-internes
disallow=all
allow=ulaw

[auth-userpass](!)
type=auth
auth_type=userpass

[aor-single-reg](!)
type=aor
max_contacts=1

;===============EXTENSION telephone1

[telephone1](endpoint-basic)
auth=telephone1
aors=telephone1

[telephone1](auth-userpass)
password=1111
username=telephone1

[telephone1](aor-single-reg)

;===============EXTENSION telephone2

[telephone2](endpoint-basic)
auth=authtel2
aors=telephone2

[authtel2](auth-userpass)
password=1111
username=telephone2

[telephone2](aor-single-reg)

;===============EXTENSION telephone3

[telephone3](endpoint-basic)
auth=authtel3
aors=telephone3

[authtel3](auth-userpass)
password=1111
username=telephone3

[telephone3](aor-single-reg)

6.3. Fichier extensions.conf

;extensions.conf
[general]


[globals]


[appels-internes]
exten=>2301,1,Dial(PJSIP/telephone1,20)
exten=>2302,1,Dial(PJSIP/telephone2,20)
exten=>2303,1,Dial(PJSIP/telephone3,20)
exten=>9999,1,Dial(PJSIP/telephone1,20)


exten=>1234,1,Answer()
same=>n,SayNumber(${EXTEN})
same=>n,Hangup()

6.4. Redémarrage du service

$ sudo systemctl restart asterisk

6.5. Contextes, extensions et priorités

https://wiki.asterisk.org/wiki/display/AST/Contexts%2C+Extensions%2C+and+Priorities

6.6. Applications

Applications :

  • Dial
  • Answer
  • SayNumber
  • Hangup
  • Playback
  • Background

7. Commandes de base

7.1. Démarrage du service

$ sudo systemctl restart asterisk

7.2. Lancement de la console

Lancer le CLI Asterisk à partir d’une console

asterisk -rvvv

Lancer le CLI Asterisk avec verbosité

asterisk -rvvvvvv

7.3. Dialplan

Relancer la configuration du Dialplan (extensions.conf)

> dialplan reload

Visualiser le dialplan

> dialplan show
[ Context '__func_periodic_hook_context__' created by 'func_periodic_hook' ]
  'beep' (CID match '') =>  1. Answer()                                   [func_periodic_hook]
                    2. Playback(beep)                             [func_periodic_hook]
  'hook' (CID match '') =>  1. Set(EncodedChannel=${CUT(HOOK_CHANNEL,-,1-2)}) [func_periodic_hook]
                    2. Set(GROUP_NAME=${EncodedChannel}${HOOK_ID}) [func_periodic_hook]
                    3. Set(GROUP(periodic-hook)=${GROUP_NAME})    [func_periodic_hook]
                    4. ExecIf($[${GROUP_COUNT(${GROUP_NAME}@periodic-hook)} > 1]?Hangup()) [func_periodic_hook]
                    5. Set(ChannelToSpy=${URIDECODE(${EncodedChannel})}) [func_periodic_hook]
                    6. ChanSpy(${ChannelToSpy},qEB)               [func_periodic_hook]

[ Context 'appels-internes' created by 'pbx_config' ]
  '1234' =>         1. Answer()                                   [pbx_config]
                    2. SayNumber(${EXTEN})                        [pbx_config]
                    3. Hangup()                                   [pbx_config]
  '2301' =>         1. Dial(SIP/telephone1,20)                    [pbx_config]
  '2302' =>         1. Dial(SIP/telephone2,20)                    [pbx_config]
  '2303' =>         1. Dial(SIP/telephone3,20)                    [pbx_config]
  '9999' =>         1. Dial(SIP/telephone1,20)                    [pbx_config]

7.4. Vérification chan_pjsip

> pjsip show aors
> pjsip show auths
> pjsip show contacts
> pjsip show endpoints

7.5. Vérification chan_sip

Relancer la configuration SIP.

> sip reload

Vérifier les téléphones enregistrés (REGISTER).

> sip show peers

Vérifier les paramètres des téléphones.

> sip show users

8. Collecter des logs dans la console

> logger add channel myDebugLog {notice,warning,error,debug,verbose,dtmf}
> core set verbose 5
> core set debug 5
> module reload logger

Commentaires