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 :

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.

tel.png

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.

1.png

2.png

Vous pouvez aussi ajouter les musiques d’attente en format aLAW.

3.png

Lancer la compilation et l’installation.

make

kkkk.png

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.

[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

Accès à l'interface web : ouvrir un navigateur et saisir http://<IP_du_téléphone>. 

Naviguer vers Account → Account 1 et renseigner les champs suivants :

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


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

image.png