Asterisk
01 - Description
1) Architecture du projet
Le projet IRS-SI déploie une infrastructure VoIP complète sur un réseau local segmenté en VLAN. Le serveur Asterisk est hébergé sur une machine virtuelle Debian 12 sur le serveur Proxmox, accessible depuis le VLAN 99 (LAN VMs) à l'adresse 192.168.10.69.
Les deux téléphones IP sont connectés via le switch PoE du projet et s'enregistrent automatiquement sur le serveur Asterisk au démarrage. Les appels internes transitent entièrement par le réseau local sans passer par l'extérieur.
Le schéma de communication est le suivant : lorsqu'un téléphone compose un numéro interne, il envoie une requête PJSIP au serveur Asterisk qui consulte son plan de numérotation (extensions.conf), identifie le poste destinataire et établit la communication. Le flux audio (RTP) circule ensuite directement entre les deux téléphones sans transiter par Asterisk.
Les deux postes configurés sont les suivants :
|
Extension |
Téléphone |
Protocole |
|
1000 |
Yealink T31P |
PJSIP |
|
1001 |
Yealink T41P |
PJSIP |
2) Qu'est ce que Asterisk
Asterisk est un logiciel open source de téléphonie IP développé par Digium (aujourd'hui Sangoma), disponible sous licence GPL. Il s'agit du serveur IPBX (IP Private Branch Exchange) le plus répandu dans le monde, utilisé aussi bien dans les PME que dans les grandes entreprises.
Son rôle est de gérer les appels téléphoniques internes d'une infrastructure : il reçoit les demandes d'appel des téléphones IP, les route vers le bon destinataire et gère la signalisation entre les postes.
Asterisk supporte plusieurs protocoles de téléphonie IP, dont PJSIP (le module recommandé depuis Asterisk 13), SIP (l'ancien module chan_sip) et IAX2. Il est compatible avec une très large gamme de téléphones IP physiques et de softphones.
Dans le cadre du projet IRS-SI, Asterisk est déployé sur une machine virtuelle Debian 12 hébergée sur le serveur Proxmox. Il gère les communications entre les trois téléphones IP du site et constitue le cœur de l'infrastructure de téléphonie.
Matériels utilisés
|
Équipement |
Rôle |
|
Routeur Cisco ISR 4321 |
Routage, DHCP, gateway VLAN 20 |
|
Switch managé |
Segmentation VLAN |
|
Proxmox |
Hyperviseur hébergeant la VM Asterisk |
|
Debian 12 (VM) |
Système hôte du serveur Asterisk |
|
Asterisk 18 |
Serveur de téléphonie IP (PJSIP) |
|
Yealink T41P (poste 1000) |
Téléphone IP SIP |
|
Yealink T31P (poste 1001) |
Téléphone IP SIP |
|
Cisco CP-7811-3PCC (poste 1002) |
Téléphone IP SIP |
|
Zabbix |
Supervision réseau |
Réseau
• VLAN 20 dédié à la téléphonie : 192.168.10.64/26
• IP Asterisk (VM) : 192.168.99.9
• IP Yealink T41P (1000) : 192.168.10.66
• IP Yealink T31P (1001) : 192.168.10.67
• Port SIP Asterisk : 5160/UDP (PJSIP)
• DHCP assuré par le Cisco ISR avec réservations par adresse MAC
02 - Installation Serveur
01) 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-get install gcc make pkg-config build-essential wget libssl-dev libncurses5-dev libnewt-dev libxml2-dev linux-headers-$(uname -r) uuid-dev libsqlite3-dev libjansson-dev
Parmi ces dépendances, nous retrouvons entre autre :
- Build-essential : contient le compilateur gcc, le compilateur g++, make, etc…
- La librairie SQL Lite
- La librairie SSL
Une fois les dépendances installées, nous pouvons télécharger les sources d’Asterisk. Commençons par créer un dossier pour les contenir.
mkdir /usr/src/asterisk
cd /usr/src/asterisk
Dans le dossier /usr/src/asterisk/ télécharger les sources d’Asterisk. Veillez à prendre la dernière version d’Asterisk en date (ici la version 18).
cd /usr/src/asterisk/
sudo wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
Puis décompresser les sources, et entrer dans le dossier nouvellement créé.
sudo tar -xvzf asterisk-18-current.tar.gz
cd asterisk-18.X.X
Avant de compiler Asterisk, il faut s’assurer que le système dispose de toutes les dépendances.
Pour cela, entrer la commande suivante dans le dossier contenant les sources :
./configure
Si la vérification ne retourne pas de message d’erreur, vous pouvez alors continuer.
Dans le cas où il vous manque des dépendances, identifiez les, et ajouter les à la main (avec un apt-get install ou en les téléchargent à la main avec un wget).
Il faut ensuite choisir les options de compilation.
make menuselect
Vous pouvez aussi ajouter les sons en français dans les sections Core Sound Package, et Extras Sound Package.
Vous pouvez aussi ajouter les musiques d’attente en format aLAW.
Lancer la compilation et l’installation.
make
make install
Il convient ensuite de créer les fichiers d’exemple de configuration.
make samples
Créer les scripts de démarrage.
make config
Enfin, vous pouvez lancer Asterisk.
/etc/init.d/asterisk start
Il est possible d’entrer dans la console d’Asterisk avec la commande suivante :
asterisk –r
03 - Configuration
1) Configuration PJSIP
Le fichier de configuration principal à modifier est le /etc/asterisk/pjsip.conf.
Transport UDP
Points critiques :
• bind=0.0.0.0:5160 — écoute sur toutes les interfaces, port 5160
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5160
Configuration des postes
Chaque poste nécessite trois sections : endpoint, auth, aor.
Toujours dans le fichier /etc/asterisk/pjsip.conf.
Poste 1000 (Yealink T41P - Matheo) :
[1000]
type=endpoint
context=interne
disallow=all
allow=alaw
allow=ulaw
aors=1000
auth=auth1000
callerid="Matheo" <1000>
direct_media=no ; Empêche le bypass RTP direct entre téléphones
[auth1000]
type=auth
auth_type=userpass
username=1000
password=azerty
[1000]
type=aor
max_contacts=2
qualify_frequency=30
Répéter la même structure pour les postes 1001 et 1002 en adaptant les valeurs.
CRITIQUE : Sans qualify_frequency, les contacts restent en état 'NonQual' et les appels échouent avec 'provisoirement indisponible'. Asterisk ne sait pas si le téléphone est joignable.
Paramètres critique expliqués
|
Paramètre |
Pourquoi c'est important |
|
direct_media=no |
Sans ce paramètre, Asterisk tente un bypass RTP direct entre téléphones. Ça échoue sur réseau local segmenté → audio unidirectionnel ou absent. |
2) Dial Plan (extensions.conf)
Le dial plan est le cœur logique d'Asterisk : il définit comment chaque appel entrant est traité, routé et terminé. Il est structuré en contextes, extensions et priorités.
Structure du dial plan
[contexte]
exten => numéro, priorité, Application(paramètres)
|
Élément |
Description |
Exemple |
|
Contexte |
Groupe logique d'extensions. Un endpoint ne peut accéder qu'à son contexte. |
[interne] |
|
Extension (exten) |
Numéro composé ou motif (_, X, Z, N...) |
1000, _1XXX, s |
|
Priorité |
Ordre d'exécution. Commence à 1. n = next (priorité suivante). |
1, 2, n |
|
Application |
Action à effectuer : Dial, Hangup, Playback, VoiceMail... |
Dial(PJSIP/1000,30) |
Configuration dans extension.conf
Le Dial plan se configure dans ce fichier : /etc/asterisk/extension.conf
[general]
static=yes
writeprotect=no
clearglobalvars=no
[interne]
#Téléphone 1000
exten => 1000,1,Dial(PJSIP/1000,30)
exten => 1000,2,Hangup()
#Téléphone 1001
exten => 1001,1,Dial(PJSIP/1001,30)
exten => 1001,2,Hangup()
#Téléphone 1002
exten => 1002,1,Dial(PJSIP/1002,30)
exten => 1002,2,Hangup()
Le timeout de 30 secondes (paramètre Dial) déclenche le Hangup si personne ne répond.
Après modification : sudo asterisk -rx "dialplan reload"
Rechargement du dial plan
sudo asterisk -rx "dialplan reload"
sudo asterisk -rx "dialplan show interne" ; Affiche le contexte interne
2) Configuration des téléphone IP
Yealink T41P et T31P
Accès à l'interface web : ouvrir un navigateur et saisir http://<IP_du_téléphone>.
Identifiants par défaut : admin / admin.
|
Champ |
Valeur pour 1000 |
Valeur pour 1001 |
Description |
|
Label |
1000 |
1001 |
Nom affiché sur le téléphone |
|
Display Name |
Service Comptabilité |
Service Informatique |
Identité appelant |
|
Register Name |
1000 |
1001 |
Username SIP (doit correspondre à pjsip.conf) |
|
Username |
1000 |
1001 |
Identifiant d'authentification |
|
Password |
azerty |
azerty |
Mot de passe SIP |
|
Server Host |
192.168.10.69 |
192.168.10.69 |
IP du serveur Asterisk |
|
Port |
5160 |
5160 |
Port SIP d'Asterisk (pas le défaut 5060 !) |
|
Transport |
UDP |
UDP |
Protocole de transport |
|
Server Expires |
3600 |
3600 |
Durée d'enregistrement en secondes |
Le port 5160 est non standard. S'assurer que les téléphones pointent bien sur 5160 et non le port par défaut 5060, sinon l'enregistrement échoue silencieusement.
Point de vigilance
-
Toujours vérifier que le mode DND est désactivé (Features → Forward & DND → Etat NPD → "de"). Si activé, les appels entrants sont ignorés sans notification.DND (Ne Pas Déranger)
-
Au décrochage, l'audio sort par défaut via le combiné. Appuyer sur le bouton haut-parleur pour basculer. Le bouton casque active la sortie jack.Mode audio
-
Le message "Update Skipped" au redémarrage est normal si aucun serveur de provisioning n'est configuré. Il n'affecte pas le fonctionnement.Mise à jour firmware
-
Après modification de la configuration, toujours redémarrer le téléphone via Settings → Upgrade → Reboot pour forcer le re-enregistrement SIP.Redémarrage
04 - Maintenance
1) Diagnostic et dépannage
Commandes de diagnostic Asterisk
|
Commande |
Usage |
|
asterisk -rx "pjsip show contacts" |
État des enregistrements : Avail/NonQual/Unreachable + RTT |
|
asterisk -rx "pjsip show endpoints" |
État global des endpoints configurés |
|
asterisk -rx "pjsip show endpoint 1000" |
Détail d'un endpoint spécifique |
|
asterisk -rx "core show channels" |
Appels actifs en cours |
|
asterisk -rx "dialplan show interne" |
Afficher le contexte du dial plan |
|
asterisk -rx "module reload res_pjsip.so" |
Recharger PJSIP à chaud |
|
asterisk -rx "dialplan reload" |
Recharger extensions.conf |
|
asterisk -rvvvv |
Console interactive avec niveau de verbosité 4 |
Activation des logs SIP et RTP
Depuis la console Asterisk (asterisk -rvvvv) :
pjsip set logger on ; Active les logs SIP complets (INVITE, OPTIONS, 200 OK...)
rtp set debug on ; Active les logs RTP (flux audio)
pjsip set logger off ; Désactive (important en prod, très verbeux)
rtp set debug off
Vérification réseau
# Vérifier qu'Asterisk écoute sur le bon port
sudo ss -ulnp | grep 5160
# Tester la connectivité vers les téléphones
ping -c 4 192.168.10.67 # Yealink T41P
ping -c 4 192.168.10.66 # Yealink T31P
# Vérifier les logs Asterisk
sudo tail -f /var/log/asterisk/full
sudo tail -f /var/log/asterisk/messages
Problème fréquent
|
Symptôme |
Cause probable |
Solution |
|
"Provisoirement indisponible" |
Contact en état NonQual — téléphone non qualifié |
Ajouter qualify_frequency=30 dans la section AOR. Vérifier DHCP/IP du téléphone. |
|
Pas de son (audio absent) |
external_signaling_address manquant → Asterisk annonce 127.0.0.1 |
Ajouter external_signaling_address et external_media_address dans le transport. Redémarrer Asterisk. |
|
Audio unidirectionnel |
direct_media=yes → bypass RTP échoue |
Ajouter direct_media=no dans chaque endpoint. |
|
Appel en absence sans sonnerie |
DND activé sur le téléphone destinataire |
Désactiver DND dans Features → Forward & DND → Etat NPD → "de". |
|
Téléphone non enregistré (croix rouge) |
Port SIP incorrect, mauvaise IP serveur, ou mot de passe erroné |
Vérifier la config du téléphone : IP Asterisk, port 5160, username/password. |
|
Contact Unavail après redémarrage VM |
Téléphone garde l'ancienne IP du serveur en cache |
Redémarrer le téléphone. Vérifier que la réservation DHCP d'Asterisk est correcte. |
|
Module reload sans effet sur le transport |
Le transport PJSIP ne se recharge pas à chaud |
sudo systemctl restart asterisk |
|
Appels impossibles, pas de connectivité VM |
VM attachée au mauvais bridge Proxmox |
Changer vmbr0 → vmbr1 dans les paramètres réseau de la VM Proxmox. |
2) Sécurité de l'infrastructure VoIP
Menaces courantes
|
Menace |
Description |
Impact |
|
Scan SIP (SIPVicious) |
Robots qui scannent le port 5060 à la recherche de serveurs Asterisk |
Tentatives d'enregistrement non autorisé |
|
Brute force |
Attaque par dictionnaire sur les credentials SIP |
Accès non autorisé, frais téléphoniques |
|
Toll fraud |
Utilisation du serveur pour passer des appels internationaux payants |
Factures exorbitantes |
|
Écoute RTP |
Capture des flux audio RTP sur le réseau |
Violation de la confidentialité |
|
Déni de service (DoS) |
Flood de paquets SIP pour saturer le serveur |
Interruption de service |
Mesures de sécurité recommandées
• (5060 → 5160 ou autre) pour réduire les scans automatisés.Changer le port SIP par défaut
• Minimum 16 caractères, mélange de lettres, chiffres et symboles.Mots de passe complexes
• Bloquer automatiquement les IPs effectuant trop de tentatives d'authentification.Fail2ban
• Utiliser les listes de contrôle d'accès du Cisco ISR pour n'autoriser le trafic SIP qu'en provenance du VLAN 20.ACL réseau
• Isoler les téléphones du reste du réseau — déjà en place dans ce projet.VLAN dédié
• Chiffrer le flux audio RTP avec SRTP pour les environnements sensibles.SRTP
• Modules Asterisk non utilisés (DAHDI, chan_skinny...) doivent être désactivés.Désactiver les services inutiles
Installation de Fail2ban pour Asterisk
Fail2ban est un outil qui surveille les fichiers de logs d'Asterisk et bloque automatiquement les adresses IP qui font trop de tentatives d'authentification SIP échouées (brute force sur les mots de passe des postes).
sudo apt install -y fail2ban
# Créer /etc/fail2ban/jail.local
[asterisk]
enabled = true
port = 5160
filter = asterisk
logpath = /var/log/asterisk/full
maxretry = 5
bantime = 3600
sudo systemctl restart fail2ban
sudo fail2ban-client status asterisk
3) Supervision avec Zabbix
Éléments à superviser
|
Élément |
Méthode |
Seuil d'alerte |
|
Service Asterisk |
Check process "asterisk" |
Alerte si arrêté > 1 min |
|
Nombre d'appels actifs |
AMI ou script |
Alerte si > seuil configuré |
|
Enregistrements SIP |
Script pjsip show contacts |
Alerte si endpoint Unreachable |
|
Connectivité téléphones |
ICMP ping |
Alerte si téléphone injoignable |
|
Logs d'erreurs |
Log monitoring |
Alerte sur ERROR/WARNING répétés |
05 - Script
1) Script d'administration Bash
Ce script centralise les opérations courantes d'administration de l'infrastructure VoIP.
##############################################################
# Auteur : mkermorvant #
# Date de modification : 20260511 #
# #
# Description : Management Asterisk #
# #
##############################################################
#! /bin/bash #
# #
##############################################################
# Variables :
echo ""
ASTERISK="192.168.99.9"
TEL_1000="192.168.10.67"
TEL_1001="192.168.10.66"
#Code couleur ANSI pour l'affichage terminal
VERT='\033[0;32m'
ROUGE='\033[0;31m'
JAUNE='\033[0;33m'
NEUTRE='\033[0m'
BLEU='\033[0;36m'
PS3="Qu'elle action souhaiter vous exécuter : "
OPTIONS=( "Statut Serveur Asterisk" "Ping" "Contacts" "Appels en cours" "Redémarrage Serveur Assterisk" "Rechargement Config" "Quitter" )
##############################################################
#Boucle principale : réaffiche le menu après chaque action
while true; do
clear
echo -e "${BLEU}###############################################################"
echo "# #"
echo "# Admin Asterisk #"
echo "# #"
echo "###############################################################"
echo "# #"
echo "# Liste Options : #"
echo "# #"
echo "# 1) Statut Serveur #"
echo "# 2) Ping Téléphones #"
echo "# 3) Liste Contacts #"
echo "# 4) Liste Appel #"
echo "# 5) Redémarage Asterisk #"
echo "# 6) Rechargement Config #"
echo "# 7) Quitter #"
echo "# #"
echo -e "###############################################################${NEUTRE}"
##############################################################
#Lecture du choix
echo -ne " Votre choix : "
read REPLY
#Traitement du choix via case
case $REPLY in
1)
echo -e "${VERT}=== Statut du Serveur Asterisk ===${NEUTRE}"
sudo systemctl status asterisk.service #Affiche l'état du service systemd
echo ""
;;
2)
echo -e "${VERT}=== Ping Asterisk vers Téléphones ===${NEUTRE}"
# 3 paquets ICMP envoyés, résultat coloré selon le succès ou l'échec
ping -c 3 $TEL_1000 && echo -e "${VERT}1000 OK${NEUTRE}" || echo -e "${VERT}1000 KO${NEUTRE}"
echo ""
ping -c 3 $TEL_1001 && echo -e "${VERT}1001 OK${NEUTRE}" || echo -e "${ROUGE}1001 KO${NEUTRE}"
echo ""
;;
3)
echo -e "${VERT}=== Liste contacts Asterisk ===${NEUTRE}"
sudo asterisk -rx "pjsip show contacts" #Commande exécuté dans la CLI asterisk
echo""
;;
4)
echo -e "${VERT}=== Liste d'appel en cours ===${NEUTRE}"
sudo asterisk -rx "core show channels" #Liste les canaux actifs
echo ""
;;
5)
echo -e "${VERT}=== Redémarage du Serveur Asterisk ===${NEUTRE}"
sudo systemctl restart asterisk.service #Redemmarre le service
echo ""
;;
6)
echo -e "${VERT}=== Rechargement de la Configuration ===${NEUTRE}"
sudo asterisk -rx "module reload res_pjsip.so" #Recharge le module PJSIP
sudo asterisk -rx "dialplan reload" #Recharge le plan de numérotation
echo ""
;;
7)
echo -e "${JAUNE}=== Quitter ===${NEUTRE}"
break #Sort de la boucle While
echo ""
;;
*)
#Toute saisie non reconnue
echo -e "${ROUGE}=== Option invalide, veuillez réessayer ===${NEUTRE}"
echo ""
;;
esac
#Pause avant de réafficher le menu
echo -ne "Appuie sur Entrée..."
read
done