Asterisk Concepts de bases
Ce chapitre est un exercice complet d’installation et de configuration d’un central téléphonique IP (IP PBX) simple avec Asterisk. Il permet de s’initier rapidement à la programmation et à la manipulation du logiciel, à manipuler les comptes SIP et le plan d’appel (dialplan).
1. Sources à consulter
Ces chapitres de la documentation officielle ont été examinés en salle de formation :
- https://wiki.asterisk.org/wiki/display/AST/About+the+Project
- https://wiki.asterisk.org/wiki/display/AST/Getting+Started
- https://wiki.asterisk.org/wiki/display/AST/Fundamentals
- https://wiki.asterisk.org/wiki/display/AST/Basic+PBX+Functionality
- https://wiki.asterisk.org/wiki/display/AST/Hello+World
Ils correspondent aux chapitres suivants du livre officiel Asterisk The Definitive Guide, 4th Edition :
- A Telephony Revolution
- Asterisk Architecture
- Installing Asterisk
- Initial Configuration Tasks
- User Device Configuration
- Dialplan Basics
- Dialplan Syntax
- 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 | Standard | 2017-10-03 | 2018-10-03 | 2019-10-03 |
16.x | LTS | 2018-10-17 | 2022-10-11 | 2023-10-11 |
17.x | Standard | 2019-10-28 | 2020-10-28 | 2021-10-28 |
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 par défaut est remplacé parchannel_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 : 1 Go 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
Install git
et wget
:
yum -y install git wget
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.* 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
┌─────────────────────────────┤ Asterisk Module and Build Option Selection ├──────────────────────────────┐
│ │
│ PBX Modules [ ] CORE-SOUNDS-ES-SLN16 ↑ │
│ Resource Modules [ ] CORE-SOUNDS-ES-SIREN7 ▒ │
│ Test Modules [ ] CORE-SOUNDS-ES-SIREN14 ▒ │
│ Compiler Flags [ ] CORE-SOUNDS-FR-WAV ▒ │
│ Voicemail Build Options [ ] CORE-SOUNDS-FR-ULAW ▮ │
│ Utilities [ ] CORE-SOUNDS-FR-ALAW ▒ │
│ AGI Samples [*] CORE-SOUNDS-FR-GSM ▒ │
│ Core Sound Packages [ ] CORE-SOUNDS-FR-G729 ▒ │
│ Music On Hold File Packages [ ] CORE-SOUNDS-FR-G722 ▒ │
│ Extras Sound Packages [ ] CORE-SOUNDS-FR-SLN16 ↓ │
│ │
│ French, GSM format │
│ │
│ Depends on: N/A ┌───────────────┐ ┌──────────┐ │
│ Can use: N/A │ Save & Exit │ │ Exit │ │
│ Conflicts with: N/A └───────────────┘ └──────────┘ │
│ Support Level: core │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────┘
<ENTER> toggles selection | <F12> saves & exits | <ESC> exits without save
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 yum -y install 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
oupjsip.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=telephone2
aors=telephone2
[telephone2](auth-userpass)
password=1111
username=telephone2
[telephone2](aor-single-reg)
;===============EXTENSION telephone3
[telephone3](endpoint-basic)
auth=telephone3
aors=telephone3
[telephone3](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