A509

Challenge A509 22/12/2025

Proxmox VEDebianpfSenseVPNOpenVPNAsterisk/VoIPSQLiBashGitDNSNAT/PATSSH
Retour au cours

Challenge A509 22/12/2025

Pitch de l’exercice 🧑‍🏫

⌨️ On va installer la dernière version disponible d'Asterisk, en le compilant depuis le code source, sur une VM Debian 13.

Atelier Asterisk : https://github.com/O-clock-Aldebaran/SA5-atelier-Asterisk

Cours A508.

📚 Ressources :

https://berenger-benam.over-blog.com/2023/06/mise-en-place-de-la-telephonie-sur-ip-avec-asterisk-pjsip.html


1. Install VM Debian 13 sur Proxmox

Voir Challenge d'hier sur debian12

10 Go de Disque, 2go de RAM, Carte réseau Intel e1000e (vmbr2 chez moi), décocher firewall.

debian13

2. Préparation du serveur : sudo, IP statique & SSH

On va se connecter en SSH, installer sudo, ajouter notre utilisateur au groupe sudo, mettre à jours les paquets, installer qemu agent et resolvconf pour pas avoir de problème de dns en ip fixe

su -
apt update
apt upgrade
apt install sudo
usermod -aG sudo freed
exit
sudo apt install qemu-guest-agent

On va passer notre serveur en IP fixe en modifiant le fichier network/interfaces

sudo nano /etc/network/interfaces/

allow-hotplug ens18
iface ens18 inet static
  address 10.0.0.61
  netmask 255.255.0.0
  network 10.0.0.0
  gateway 10.0.0.1
  dns-nameservers 10.0.0.1 8.8.8.8

sudo nano /etc/resolv.conf/

nameserver 10.0.0.1

OK

3. Installation d'Asterisk

On ne peut malheureusement pas installer Asterisk depuis les dépôts Debian car il n'est pas disponible sur notre version (Debian 13, Trixie). On va donc le compiler depuis le code source (ce qui nous permettra aussi d'avoir la toute dernière version disponible, 22.7).

On installe git et on télécharge dans le dossier usr/src le code source, et les 2 dépendances qu'on va devoir compiler au préalable : dahdi et libpri

sudo apt update
sudo apt install -y git
cd /usr/src
sudo git clone https://github.com/asterisk/asterisk.git
sudo git clone https://github.com/asterisk/dahdi-linux-complete.git
sudo git clone https://github.com/asterisk/dahdi-linux.git linux
sudo git clone https://github.com/asterisk/dahdi-tools.git tools
sudo git clone https://github.com/asterisk/libpri.git

On doit installer un compilateur pour la suite

sudo apt update
sudo apt install build-essential linux-headers-$(uname -r)

Dahdi

Maintenant on va installer dahdi (qui sert normalement aux interfaces physiques d'un vrai serveur)

cd /usr/src/dahdi-linux-complete
sudo make all

Il faut installer les bibliothèques manquantes

sudo apt -y install gcc g++ automake autoconf libtool make libncurses5-dev flex bison patch linux-headers-$(uname -r) sqlite3 libsqlite3-dev
sudo sudo apt -y install libusb-1.0-0-dev libglib2.0-dev

Maintenant on peut lancer `sudo make install``

install

Et sudo make install-config

OK

Libpri

On passe à Libpri

cd /ust/src/libpri
make
sudo make install

ok

Asterisk

On va installer les dépendances pour Asterisk et vérifier avec les prérequis s'il en manque encore

cd ./asterisk
sudo apt install -y build-essential git wget libssl-dev libxml2-dev \
libncurses-dev libsqlite3-dev uuid-dev libjansson-dev libedit-dev \
pkg-config curl subversion
sudo contrib/scripts/install_prereq install

ok

On peut lancer l'installation en le forçant à bien utiliser nos configurations précédentes

sudo ./configure --with-dahdi --with-pri --with-jansson

ok

On va ajouter des modules nécessaires à notre installation

sudo make menuselect

[*] Add-ons -> format_mp3

[*] Core Sound Packages -> CORE-SOUNDS-FR-WAV FR-ULAW FR-ALAW

[*] Extras Sound Packages -> EXTRA-SOUNDS-FR-WAV FR-ULAW FR-ALAW

[*] Music On Hold File Packages -> -WAV -ULAW -ALAW

F12

menu

Téléchargement du module mp3 sudo contrib/scripts/get_mp3_source.sh

Compilation sudo make

ok

Installation sudo make install

ok

On complète l'installation en ajoutant la documentation relative à Asterisk ainsi que les fichiers de configuration par défaut. sudo make samples

sudo make config On crée les scripts pour que la commande systemctl fonctionne

sudo ldconfig On met à jour les liens des librairies

On vérifie avec systemctl status asterisk

ok

Facultativement, on peut aussi installer un script de rotation des logs (très utile en prod, moins dans notre lab) :

sudo make install-logrotate

4. Configuration

Sécurité

Par sécurité on va créer un utilisateur système asterisk et son groupe, puis ajouter notre utilisateur dedans, et leur donner les droits pour que'Asterisk ne soit pas directement en root

groupadd asterisk
useradd -r -d /var/lib/asterisk -g asterisk asterisk
usermod -aG audio,dialout asterisk 
usermod -aG asterisk freed
chown -R asterisk:asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib/asterisk
chmod -R 775 /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib/asterisk

On doit maintenant configurer l'utilisateur dans Asterisk, et décommenter (enlever le ; devant runuser et rungroup)

sudo nano /etc/asterisk/asterisk.conf

[options]
runuser = asterisk
rungroup = asterisk

Démarrage

On peut démarrer Asterisk maintenant

sudo systemctl start asterisk

sudo asterisk -rvvv

ok

Activer le démarrage automatique au boot du serveur

sudo systemctl enable asterisk

Fichiers de configuration

On va backup puis configurer le fichier pjsip

cd /etc/asterisk/
sudo mv pjsip.conf pjsip.conf.backup
sudo nano /etc/asterisk/pjsip.conf

Transport : Crée un transport UDP qui écoute sur toutes les adresses IP (0.0.0.0)

Endpoint 123 : Définit un téléphone numéro 123, qui utilise les codecs alaw et ulaw, et qui est placé dans le contexte lab

Auth : Définit l'utilisateur 123 avec le mot de passe rocknroll

; --- Transport ---
[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0

; --- Endpoint (Le téléphone) ---
[123]
type = endpoint
context = lab              ; C'est le contexte qu'on va utiliser dans extensions.conf
disallow = all
allow = alaw
allow = ulaw
auth = auth123
aors = 123.                ; Lien vers la section AOR ci-dessous
force_rport = yes          ; Recommandé : aide à traverser les routeurs/NAT
rewrite_contact = yes      ; Recommandé : assure que le retour audio trouve le chemin
direct_media = no          ; Recommandé : Asterisk gère l'audio (plus stable pour les tests)

; --- AOR (Address of Record - Où joindre le téléphone) --
[123]                 
type = aor
max_contacts = 1

; --- Auth (Mot de passe) ---
[auth123]
type = auth
auth_type = userpass
password = rocknroll
username = 123

On recharge la configuration sudo asterisk -rx "pjsip reload"

ok

Maintenant on va backup et configurer le fichier extensions.conf pour avoir un dialplan

sudo mv extensions.conf extensions.conf.backup
sudo nano /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no

[lab]
; Test Hello World sur le 999
exten => 999,1,Answer()
 same => n,Wait(1)               ; Petite pause d'une seconde
 same => n,Playback(hello-world) ; Joue le fichier son
 same => n,Hangup()

; Permet aux autres extensions de joindre l'utilisateur 123
exten => 123,1,Dial(PJSIP/123)

Pour valider les changements on recharge le plan de numérotation sudo asterisk -rx "dialplan reload"

ok

On va vérifier que Asterisk "écoute" bien le port 5060

sudo ss -anup | grep asterisk

socket statistics

-a : All (tout afficher) ou -l (Listening) pour voir seulement ce qui écoute.

-n : Numeric (affiche les ports en chiffres, ex: 5060 au lieu de "sip").

-u : UDP (le protocole qu'on veut vérifier).

-p : Process (affiche quel programme utilise le port).

ok

5. Lancement et utilisation

On va aller dans la console (sudo asterisk -rvvv) pour demander à Asterisk d'afficher tous les messages réseaux (paquets SIP) qui entrent et sortent.

pjsip set logger on

log

Client Mac : Connexion et test

On va télécharger et installer un Softphone : Zoiper https://www.zoiper.com/en/voip-softphone/download/current

zoiper

On reçoit bien la demande côté serveur qui transmet sa réponse.

aste

On est bien connectés !

ok

On peut call le 999 pour test la réponse echo "Hello World"

test

et le log de l'appel avec la réponse Hello Word

log

Client Smartphone

Pour se connecter à notre serveur Aserisk sur Proxmox depuis un smartphone on va installer Openvpn pour se connecter à noter pfsense proxmox et l'appli Zoiper pour les appels. On doit aussi activer la duplication de connection dans notre tunnel sur pfsense : VPN>OpenVPN>Servers>Edit

pfsense

On va ajouter un nouvel utilisateur vu qu'on va devoir par la suite s'appeler entre les 2 machines

; --- Endpoint 456 (Smartphone) ---
[456]
type = endpoint
context = lab
disallow = all
allow = alaw
allow = ulaw
auth = auth456
aors = 456_aor
force_rport = yes
rewrite_contact = yes
direct_media = no

; --- AOR 456 ---
[456]
type = aor
max_contacts = 1

; --- Auth 456 ---
[auth456]    
type = auth
auth_type = userpass
password = rocknroll
username = 456

Puis reload sudo asterisk -rx "dialplan reload"

Il faut également modifier le diaplan pour ajouter

; (456)
exten => 456,1,Dial(PJSIP/456,30)
 same => n,Hangup()

Test depuis le téléphone

phone

Test entre le téléphone et le macbook

test

logs

Configuration d'un serveur avec services interactifs

Messagerie Vocale (Voicemail)

On va créer une boîte vocale pour chaque utilisateur.

Dans le fichier /etc/asterisk/voicemail.conf tout à la fin (ctrl V plusieurs fois) on ajoute

[default]
123 => 1234,Utilisateur Mac,root@localhost
456 => 1234,Utilisateur Smartphone,root@localhost
; Syntaxe : numero => mot_de_passe,Nom Complet,Email

Puis dans Fichier /etc/asterisk/extensions.conf on ajoute

[lab]
; Si pas de réponse au bout de 10s, on va sur la messagerie
exten => 123,1,Dial(PJSIP/123,10)
 same => n,VoiceMail(123@default,u) ; u = unavailable
 same => n,Hangup()

exten => 456,1,Dial(PJSIP/456,10)
 same => n,VoiceMail(456@default,u)
 same => n,Hangup()

; Consulter sa messagerie en composant le 888
exten => 888,1,Answer()
 same => n,VoiceMailMain(@default)
 same => n,Hangup()

On reload nos configurations avec

sudo asterisk -rx "voicemail reload"
sudo asterisk -rx "dialplan reload"

Test d'appel du 456 sur le 123 en laissant un message, et rappel la messagerie au 888 pour l'écouter

messageok

Logs

logs

Appels Vidéo

Zoiper gratuit est limité donc test impossible.

Dans le fichier /etc/asterisk/pjsip.conf on ajoute

; Tout au début du fichier
[global]
user_agent=Asterisk PBX

; Dans les sections Endpoint [123] et [456]
allow = h264,vp8      ; Ajoute les codecs vidéo
support_video = yes   ; (Optionnel sur certaines versions, activé par défaut)

On reload sudo asterisk -rx "pjsip reload"

Interception d'appels (Call Pickup)

Permet de composer un code (ex: *8) pour prendre l'appel qui sonne sur le téléphone du collègue.

Dans le fichier /etc/asterisk/pjsip.conf on ajoute ces deux lignes dans les sections Endpoint [123] et [456] :

call_group = 1    ; Je fais partie du groupe 1
pickup_group = 1  ; J'ai le droit d'intercepter le groupe 1

Dans le fichier /etc/asterisk/extensions.conf on ajoute le code dans [lab]

; Compose *8 pour intercepter un appel qui sonne
exten => *8,1,Pickup(1@lab) ; Ou simplement Pickup()
 same => n,Hangup()

On reload

sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "dialplan reload"

Salle de Conférence

On va utiliser le module moderne ConfBridge (remplaçant de MeetMe).

Dans le fichier /etc/asterisk/confbridge.conf

[default_bridge]
type=bridge
max_members=10

[default_user]
type=user
music_on_hold_when_empty=yes

Dans le fichier /etc/asterisk/extensions.conf on ajoute le numéro 9000 pour rejoindre la salle :

; Salle de conférence
exten => 9000,1,Answer()
 same => n,ConfBridge(1,default_bridge,default_user)
 same => n,Hangup()

On reload

sudo asterisk -rx "module reload app_confbridge"
sudo asterisk -rx "dialplan reload"`

On est bien acceuillis dans la conférence, musique de fond, qui se coupe lorsque l'autre utilisateur se connecte

conf

Serveur Vocal Interactif (IVR)

Le fameux "Tapez 1 pour..."

Dans le fichier /etc/asterisk/extensions.conf on ajoute ce bloc pour le numéro 500 :

exten => 500,1,Answer()
 same => n,Background(main-menu)       ; Joue "Tapez 1..." (fichier son par défaut)
 same => n,WaitExten(5)                ; Attend 5 secondes que tu tapes un truc

; Si on tape 1 -> Appelle le Mac
exten => 1,1,Playback(you-entered)     ; Dit "Vous avez saisi..."
 same => n,SayDigits(1)
 same => n,Dial(PJSIP/123,20)

; Si on tape 2 -> Salle de conf
exten => 2,1,Goto(lab,9000,1)

; Si on se trompe ou que ça time-out
exten => i,1,Playback(invalid)
exten => t,1,Playback(vm-goodbye)
 same => n,Hangup()

On reload sudo asterisk -rx "dialplan reload"

On peut tout reload d'Asterisk avec sudo asterisk -rx "core reload"

En testant le serveur vocal interactif il n'y a pas de son et il raccroche, il faut donc analyser les logs

logs

Il essaie de jouer le fichier son "main-menu" (qui dirait par exemple "Bonjour, tapez 1 pour..."), mais ce fichier n'existe pas car nous ne l'avons pas créé

On va ajouter ça dans extensions.conf (contexte [lab]) :

; --- Le Dictaphone ---
; Appelle le 200, attends le BEEP, parle, et appuie sur # pour finir.
exten => 200,1,Answer()
 same => n,Wait(1)
 same => n,Playback(beep)             ; Le signal pour commencer
 same => n,Record(main-menu.wav)      ; Enregistre dans le fichier "main-menu.wav"
 same => n,Wait(1)
 same => n,Playback(main-menu)        ; Te fait réécouter pour confirmer
 same => n,Hangup()

On peut appeler le 200 et au "BEEP" on dit "Bonjour, tapez 1 pour appeler le Mac, ou tapez 2 pour la conférence." et on appuie sur # (dièse) pour terminer

On appele le 500 et maintenant on entend bien un message qui nous renvoie dans la salle de conférence enf aisant le 2 par exemple

500

Rendre le serveur accessible pour l'extérieur

On va créer une config visiteur sur pfsense

System > User Manager > Add

On le paramètre (username, passwd, nom, not admin, créer un nouveau certificat)

On va récupérer le fichier de config dans VPN > OpenVPN > Client Export > Guest > Inline config > Most clients

guest

On va maintenant créer un compte générique que tout le monde pourra utiliser une fois connecté au VPN. Dans le fichier : /etc/asterisk/pjsip.conf

; --- LE COMPTE VISITEUR (PUBLIC) ---
[guest]
type = endpoint
context = public_lab       ; <--- IMPORTANT : On l'enferme dans une zone sécurisée
disallow = all
allow = alaw
allow = ulaw
auth = auth_guest
aors = guest
force_rport = yes
rewrite_contact = yes

[guest]
type = aor
max_contacts = 10          ; Jusqu'à 10 personnes peuvent se connecter en même temps

[auth_guest]
type = auth
auth_type = userpass
password = welcome
username = guest

On reload sudo nano /etc/asterisk/pjsip.conf

On rajoute une boite vocale dans /etc/asterisk/voicemail.conf

[default]
; ... autres lignes
9999 => 0000,Guest,root@localhost

On reload sudo asterisk -rx "module reload app_confbridge"

Dans /etc/asterisk/extensions.conf, on va ajouter le contexte [public_lab] pour donner des droits au visiteur, joindre le 1000, un nouveau serveur vocal interactif. On va modifier notre dictaphonne pour enregistrer le message.

Modifie juste temporairement ton extension 200 pour qu'elle enregistre sous le nom menu-guest au lieu de main-menu. (Dans extensions.conf, change Record(main-menu.wav) par Record(menu-guest.wav)).

[lab]

; Ecouter la boite Guest
exten => 9999,1,VoiceMailMain(9999@default)
 same => n,Hangup()

; --- Le Dictaphone ---
; Appelle le 200, attends le BEEP, parle, et appuie sur # pour finir.
exten => 200,1,Answer()
 same => n,Wait(1)
 same => n,Playback(beep)             ; Le signal pour commencer
 same => n,Record(menu-guest.wav)      ; Enregistre dans le fichier "menu-guest.wav"
 same => n,Wait(1)
 same => n,Playback(menu-guest)        ; Fait réécouter pour confirmer
 same => n,Hangup()

[public_lab]
; --- Zone Visiteur isolée ---
; --- Standard Automatique Visiteur ---

; Le numéro unique d'entrée (1000)
exten => 1000,1,Answer()
 same => n,Wait(1)
 same => n,Background(menu-guest)     ; Joue le message "Tapez 1 ou 2..."
 same => n,WaitExten(10)              ; Attend 10 secondes une réponse

; --- Les Choix ---

; Choix 1 : Boîte Vocale
exten => 1,1,Playback(vm-intro)
 same => n,VoiceMail(9999@default,s)
 same => n,Hangup()

; Choix 2 : Conférence
exten => 2,1,Goto(lab,9000,1)

; --- Gestion des erreurs ---

; Si il ne tape rien (Timeout)
exten => t,1,Playback(vm-goodbye)
 same => n,Hangup()

; Si il tape n'importe quoi (Invalid)
exten => i,1,Playback(invalid)
 same => n,Goto(1000,1)               ; On le renvoie au début du menu

On reload sudo asterisk -rx "dialplan reload" sudo asterisk -rx "pjsip reload"

On peut test en utilisant le fichier config openvpn

Et depuis un softphone : guest@10.0.0.61 psswd(welcome)

Logs nouveau message menu-guest

log

En essayant de se connecter avec le nouveau guest, erreur 503

logs

On tente un reload pjsip puis avec sudo asterisk -rx "pjsip show endpoints" on vérifie nos endpoints

endpoints

On relance la connection depuis le softphone et c'est bon !

On peut maintenant appeler en faisant le 1000.

Option 1 renvois sur la boite vocale(9999), logs :

logs

Je peux écouter le message laissé en appelant le 9999 depuis la machine qui n'est pas Guest (pswwd 0000), logs :

logs

repondeur9999

Option 2 renvois bien sur réunion(9000), logs :

9000

Maintenant créons un petit guide pour des utilisateurs/clients :

📞 Guide de Connexion : Accès au Serveur Vocal

Bonjour ! Voici la procédure simple en 3 étapes pour vous connecter à notre serveur de téléphonie sécurisé depuis votre smartphone.

1️⃣ Étape 1 : Le Tunnel Sécurisé (VPN)

Pour accéder au serveur, vous devez d'abord activer la connexion privée.

  1. Téléchargez l'application OpenVPN Connect (disponible sur App Store ou Google Play).
  2. Ouvrez le fichier de configuration .ovpn que je vous ai transmis. .ovpn
  3. Choisissez "Ouvrir avec OpenVPN" (ou importez-le depuis l'application onglet File).
  4. Cliquez sur ADD, puis activez l'interrupteur pour vous connecter.
  5. Si besoin, User : Guest, Password : Rocknroll123
  • Indicateur : L'écran doit passer au vert (Connected).

2️⃣ Étape 2 : Le Téléphone (Zoiper)

Une fois le VPN connecté, configurez votre ligne.

  1. Téléchargez l'application Zoiper Lite (gratuite).
  2. Ouvrez l'appli et allez dans Paramètres (Settings) > Comptes (Accounts).
  3. Cliquez sur le + et choisissez "SIP Account" (ou configuration manuelle).
  4. Remplissez uniquement ces 3 champs :
  • Account Name : Guest
  • Host / Domain : 10.0.0.61
  • Username : guest
  • Password : welcome
  1. Validez (Register).
  • Indicateur : Le compte doit afficher "Account is Ready" ou un point vert.

3️⃣ Étape 3 : Passez l'appel

Tout est prêt. Depuis le clavier de Zoiper :

  • Composez le 1000 📞
  • Vous accéderez à notre menu interactif (laissez un message ou rejoignez la conférence).

Note : Assurez-vous de laisser l'application OpenVPN active en arrière-plan pendant votre appel.