Déployer Asterisk 22 LTS sur Debian 13
Monter un IPBX Asterisk sur Debian 13 réserve une mauvaise surprise dès la première commande : le paquet n’existe plus. Il faut compiler, ce qui change la nature de l’exercice et engage sur le suivi de sécurité. Voici la procédure complète, avec les cinq endroits où j’ai réellement buté.
Pourquoi compiler plutôt qu’installer un paquet
Section intitulée « Pourquoi compiler plutôt qu’installer un paquet »Sur Debian 13, apt install asterisk échoue :
apt-cache policy asteriskasterisk: Installé : (aucun) Candidat : (aucun)Le paquet a été retiré de Debian avant la sortie de trixie, faute de mainteneurs
pour absorber la charge de suivi des failles. Seuls survivent dans les dépôts
les paquets de sons (asterisk-core-sounds-fr, asterisk-prompt-fr-armelle),
dont la source amont est distincte du moteur. Asterisk est revenu dans testing
en 22.10.1 le 26 juillet 2026, donc trop tard pour trixie, et aucun
trixie-backports ne le fournit.
Trois voies restent ouvertes, une seule est raisonnable :
| Méthode | Verdict |
|---|---|
| Compilation depuis les sources | Retenue. Version amont récente, modules à la carte, maintenance manuelle assumée |
| Épinglage APT du paquet testing | À éviter. Tire des dépendances de testing sur un système stable, casse au premier apt upgrade |
| Conteneur Docker | Défendable, mais complique le RTP, qui demande le mode host ou une large plage de ports publiée |
Ce que fait Asterisk
Section intitulée « Ce que fait Asterisk »Asterisk est un IPBX logiciel. Il enregistre des téléphones SIP, les authentifie, route les appels selon un plan de numérotation, et transporte la voix en RTP. Autour de ce noyau viennent la messagerie vocale, les serveurs vocaux interactifs, les files d’attente, l’enregistrement et le raccordement aux opérateurs.
Cet article monte le socle : deux postes internes qui s’appellent, plus deux numéros de service pour valider la chaîne audio. Le raccordement à un trunk opérateur et le durcissement feront l’objet d’articles distincts.
Architecture retenue
Section intitulée « Architecture retenue »/usr/sbin/asterisk <- binaire/usr/lib/asterisk/modules/ <- 327 modules .so/etc/asterisk/ <- configuration├── asterisk.conf <- runuser, rungroup, chemins├── pjsip.conf <- transport, endpoints, auth, aors├── extensions.conf <- plan de numerotation└── logger.conf <- journalisation/var/lib/asterisk/sounds/fr/ <- 1069 fichiers, core-fr 1.6.1/var/log/asterisk/ <- messages.log + full/var/spool/asterisk/ <- messagerie, enregistrements/var/run/asterisk/ <- socket CLI, pidPlan de numérotation cible :
| Numéro | Rôle |
|---|---|
6001, 6002 |
postes internes, enregistrement SIP avec authentification |
600 |
test d’écho, valide le RTP dans les deux sens |
601 |
annonce de l’heure, valide la langue et les sons |
1. Prérequis
Section intitulée « 1. Prérequis »La machine de test : 4 vCPU, 1,9 Go de RAM, 40 Go libres, adresse fixe
192.168.1.76/24.
sudo apt updatesudo apt install -y build-essential pkg-config autoconf automake libtool \ wget curl git bison flex bzip2 patch xmlstarlet \ libedit-dev libjansson-dev libsqlite3-dev uuid-dev libxml2-dev \ libssl-dev libncurses-dev libcurl4-openssl-dev libsrtp2-dev \ libopus-dev libogg-dev libvorbis-dev libspeex-dev libspeexdsp-dev \ libgsm1-dev libsndfile1-dev libunbound-devLes cinq bibliothèques de la troisième ligne sont les seules réellement obligatoires. Le reste ouvre les codecs, le SRTP et la résolution DNS de PJSIP.
Vérification :
cat /etc/debian_version # 13.6gcc --version | head -1 # gcc (Debian 14.2.0-19) 14.2.02. Récupération des sources
Section intitulée « 2. Récupération des sources »mkdir -p ~/src && cd ~/srcwget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gztar xzf asterisk-22-current.tar.gzcd asterisk-22.11.0Le lien asterisk-22-current suit la branche 22, qui est la LTS courante. Une
LTS Asterisk est maintenue quatre ans, avec correctifs de sécurité pendant cinq.
Ne partez pas sur une branche impaire, elle est en support standard un an
seulement.
3. Configuration du build
Section intitulée « 3. Configuration du build »./configure --with-pjproject-bundled --with-jansson-bundled \ --prefix=/usr --sysconfdir=/etc --localstatedir=/varDeux points méritent l’attention.
--with-pjproject-bundled compile la pile SIP PJPROJECT fournie avec les
sources, ici la 2.17, plutôt que d’utiliser celle du système. C’est la méthode
recommandée en amont : Asterisk applique ses propres correctifs à PJPROJECT, et
une version système divergente est une source classique de plantages difficiles
à diagnostiquer.
Les trois chemins alignent l’installation sur l’arborescence Debian. Sans eux,
tout atterrit sous /usr/local, ce qui fonctionne mais complique les unités
systemd et les scripts de sauvegarde.
Sortie de fin de configuration :
configure: Package configured for:configure: OS type : linux-gnuconfigure: Host CPU : x86_644. Sélection des modules avec menuselect
Section intitulée « 4. Sélection des modules avec menuselect »make menuselect.makeoptsLes modules SIP sont déjà actifs par défaut, inutile d’y toucher :
menuselect/menuselect --list-options menuselect.makeopts \ | grep -E "chan_pjsip|res_pjsip |res_srtp"+ chan_pjsip MENUSELECT_CHANNELS+ res_pjsip MENUSELECT_RES+ res_srtp MENUSELECT_RESLe + signale un module retenu. En revanche les sons livrés par défaut sont en
anglais, il faut demander le français explicitement :
menuselect/menuselect \ --enable CORE-SOUNDS-FR-WAV \ --enable CORE-SOUNDS-FR-G722 \ --enable CORE-SOUNDS-FR-GSM \ --enable MOH-OPSOUND-WAV \ --enable MOH-OPSOUND-G722 \ menuselect.makeoptsTrois formats pour une raison simple : Asterisk choisit le fichier dont le codec correspond à celui négocié, ce qui évite un transcodage. G.722 pour la HD sur le LAN, GSM en repli, WAV pour le reste.
L’interface interactive reste disponible avec make menuselect si vous préférez
naviguer dans les catégories.
5. Compilation et installation
Section intitulée « 5. Compilation et installation »make -j2Durée relevée : 3 min 36 s pour 4 vCPU à -j2.
+--------- Asterisk Build Complete ---------+ + Asterisk has successfully been built, and + + can be installed by running: + + make install + +-------------------------------------------+Créer le compte de service avant l’installation, pour que les répertoires soient créés avec les bons propriétaires :
sudo groupadd -f asterisksudo useradd -r -d /var/lib/asterisk -g asterisk -s /usr/sbin/nologin asterisksudo make installsudo make samplesmake install télécharge au passage les archives de sons sélectionnées à
l’étape précédente. make samples dépose les configurations d’exemple dans
/etc/asterisk, abondamment commentées : c’est la documentation de référence la
plus utile, gardez-la.
Contrôle :
/usr/sbin/asterisk -Vls /var/lib/asterisk/sounds/fr/ | wc -lAsterisk 22.11.010696. Droits et compte de service
Section intitulée « 6. Droits et compte de service »sudo chown -R asterisk:asterisk /etc/asterisk /var/lib/asterisk \ /var/log/asterisk /var/spool/asterisk /usr/lib/asterisksudo mkdir -p /var/run/asterisksudo chown asterisk:asterisk /var/run/asteriskPuis décommenter les deux directives d’abaissement de privilèges dans
/etc/asterisk/asterisk.conf :
sudo sed -i 's/^;runuser = asterisk/runuser = asterisk/; s/^;rungroup = asterisk/rungroup = asterisk/' /etc/asterisk/asterisk.confgrep -E '^(runuser|rungroup)' /etc/asterisk/asterisk.confrunuser = asteriskrungroup = asteriskUn Asterisk qui tourne en root est une faute : le service parle SIP à des inconnus, c’est exactement le profil de processus qu’il faut contenir.
7. Service systemd
Section intitulée « 7. Service systemd »Les sources fournissent un script sysvinit via make config, daté. Une unité
native vaut mieux.
[Unit]Description=Asterisk PBXDocumentation=https://docs.asterisk.org/After=network-online.targetWants=network-online.target
[Service]Type=simpleUser=asteriskGroup=asteriskExecStart=/usr/sbin/asterisk -f -C /etc/asterisk/asterisk.confExecReload=/usr/sbin/asterisk -rx 'core reload'Restart=on-failureRestartSec=5RuntimeDirectory=asteriskRuntimeDirectoryMode=0750AmbientCapabilities=CAP_NET_BIND_SERVICECapabilityBoundingSet=CAP_NET_BIND_SERVICENoNewPrivileges=truePrivateTmp=trueProtectSystem=fullProtectHome=trueProtectKernelTunables=trueProtectControlGroups=trueRestrictSUIDSGID=true
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadsudo systemctl enable --now asterisksystemctl is-active asteriskLe -f maintient Asterisk au premier plan, ce qu’attend Type=simple. Sans
lui, le processus se détache et systemd considère le service comme terminé
aussitôt. RuntimeDirectory=asterisk recrée /var/run/asterisk à chaque
démarrage, ce qui règle définitivement la question du tmpfs.
8. Configuration PJSIP
Section intitulée « 8. Configuration PJSIP »PJSIP remplace l’ancien pilote chan_sip, supprimé depuis Asterisk 21. Sa
configuration est plus verbeuse, mais chaque objet a un rôle net :
| Objet | Rôle |
|---|---|
transport |
socket d’écoute, protocole, réseau local |
endpoint |
identité d’appel : codecs, contexte, langue |
auth |
identifiants de connexion |
aor |
où joindre le poste, alimenté par l’enregistrement |
Le fichier /etc/asterisk/pjsip.conf testé, avec des modèles pour ne pas
répéter les mêmes réglages à chaque poste :
[transport-udp]type=transportprotocol=udpbind=0.0.0.0:5060local_net=192.168.1.0/24
[endpoint-interne](!)type=endpointcontext=internedisallow=allallow=g722,alaw,ulawdirect_media=nortp_symmetric=yesforce_rport=yesrewrite_contact=yeslanguage=fr
[auth-userpass](!)type=authauth_type=userpass
[aor-simple](!)type=aormax_contacts=1remove_existing=yesqualify_frequency=30
[6001](endpoint-interne)auth=6001aors=6001callerid=Poste 6001 <6001>
[6001](auth-userpass)username=6001password=Trixie2026-6001
[6001](aor-simple)
[6002](endpoint-interne)auth=6002aors=6002callerid=Poste 6002 <6002>
[6002](auth-userpass)username=6002password=Trixie2026-6002
[6002](aor-simple)La syntaxe (!) déclare un modèle, (nom-du-modele) en hérite. Ajouter un
poste se réduit alors à six lignes.
Quelques directives qui méritent d’être comprises plutôt que recopiées :
| Directive | Effet |
|---|---|
disallow=all puis allow= |
liste blanche de codecs, dans l’ordre de préférence. Sans le disallow, tous les codecs compilés sont proposés |
direct_media=no |
le RTP transite par Asterisk. Indispensable dès qu’il y a du NAT, de l’enregistrement ou de la supervision |
rtp_symmetric et force_rport |
renvoient les flux vers l’adresse réellement observée, pas celle annoncée dans le SDP |
remove_existing=yes |
avec max_contacts=1, le dernier enregistrement chasse le précédent, plutôt que d’être refusé |
language=fr |
fait chercher les sons dans sounds/fr/ avant sounds/en/ |
9. Plan de numérotation
Section intitulée « 9. Plan de numérotation »/etc/asterisk/extensions.conf :
[general]static=yeswriteprotect=noclearglobalvars=no
[globals]SONNERIE=20
[interne]
exten => _600[12],1,NoOp(Appel interne vers ${EXTEN} depuis ${CALLERID(num)}) same => n,Dial(PJSIP/${EXTEN},${SONNERIE}) same => n,Goto(s-${DIALSTATUS},1)
exten => s-BUSY,1,NoOp(Poste occupe) same => n,Busy(5) same => n,Hangup()
exten => s-NOANSWER,1,NoOp(Pas de reponse) same => n,Playback(vm-nobodyavail) same => n,Hangup()
exten => _s-.,1,NoOp(Echec d'appel : ${DIALSTATUS}) same => n,Congestion(5) same => n,Hangup()
exten => 600,1,NoOp(Test d'echo) same => n,Answer() same => n,Wait(1) same => n,Playback(demo-echotest) same => n,Echo() same => n,Playback(demo-echodone) same => n,Hangup()
exten => 601,1,NoOp(Annonce de l'heure) same => n,Answer() same => n,Wait(1) same => n,SayUnixTime(,Europe/Paris,kM) same => n,Hangup()Le contexte interne est celui déclaré dans le modèle d’endpoint. Un poste ne
peut composer que ce que son contexte expose : c’est le mécanisme de
cloisonnement de base d’Asterisk, et le premier rempart contre la fraude à la
taxation.
_600[12] est un motif qui couvre 6001 et 6002 en une seule règle. Dial
renseigne ${DIALSTATUS}, que le Goto transforme en branchement vers
s-BUSY ou s-NOANSWER, avec _s-. en filet pour les autres cas.
Appliquer et contrôler :
sudo systemctl reload asterisksudo asterisk -rx "dialplan show interne" '600' => 1. NoOp(Test d'echo) [extensions.conf:38] '601' => 1. NoOp(Annonce de l'heure) [extensions.conf:47] 's-BUSY' => 1. NoOp(Poste occupe) [extensions.conf:25] 's-NOANSWER' => 1. NoOp(Pas de reponse) [extensions.conf:29] '_600[12]' => 1. NoOp(Appel interne vers ${EXTEN}...) [extensions.conf:21] '_s-.' => 1. NoOp(Echec d'appel : ${DIALSTATUS}) [extensions.conf:33]
-= 6 extensions (24 priorities) in 1 context. =-10. Validation avec deux clients SIP
Section intitulée « 10. Validation avec deux clients SIP »Un softphone graphique fait l’affaire (Zoiper, Linphone, MicroSIP). Pour valider
sans interface, baresip est packagé dans trixie et se pilote en ligne de
commande :
sudo apt install -y baresip-coremkdir -p ~/sip/6001 ~/sip/6002for n in 6001 6002; do baresip -f ~/sip/$n -t 1 >/dev/null 2>&1; doneSur un serveur sans carte son, il faut remplacer le pilote ALSA par un
périphérique factice, dans ~/sip/6001/config et ~/sip/6002/config :
audio_player aubridge,dummyaudio_source aubridge,dummyaudio_alert aubridge,dummy#module alsa.somodule aubridge.somodule g711.somodule g722.soLes comptes, un par fichier accounts :
<sip:[email protected]>;auth_pass=Trixie2026-6001;regint=60<sip:[email protected]>;auth_pass=Trixie2026-6002;regint=60;answermode=autoL’answermode=auto du 6002 lui fait décrocher seul, ce qui permet de tester
sans deuxième opérateur.
Démarrer le 6002 en tâche de fond, puis vérifier côté Asterisk :
nohup baresip -f ~/sip/6002 > ~/sip/6002.log 2>&1 &sleep 5sudo asterisk -rx "pjsip show endpoints" Endpoint: 6001/6001 Unavailable 0 of inf Endpoint: 6002/6002 Not in use 0 of inf Contact: 6002/sip:[email protected]: b82211ca2b Avail 0.342Un contact Avail avec son temps d’aller-retour prouve que le transport,
l’authentification et l’AOR sont corrects.
Piloter le client après enregistrement
Section intitulée « Piloter le client après enregistrement »L’option -e de baresip exécute la commande au démarrage, avant que le compte
soit enregistré, ce qui échoue avec could not find UA for 6002. Il faut passer
par un tube nommé :
FIFO=/tmp/ctl6001mkfifo $FIFObaresip -f ~/sip/6001 < $FIFO > ~/sip/6001.log 2>&1 &exec 3> $FIFOsleep 6 # laisser l'enregistrement aboutirecho "/dial 6002" >&3sleep 6sudo asterisk -rx "core show channels"echo "/hangup" >&3echo "/quit" >&3exec 3>&-Résultats relevés
Section intitulée « Résultats relevés »Appel vers le test d’écho :
PJSIP/6001-00000002 600@interne:4 Up Playback(demo-echotest)1 active channel1 active call
ChannelId UpTime Codec Rx:Count Lost Pct Jitter Tx:Count Lost Pct Jitter 6001-00000002 00:00:05 g722 252 0 0 0.000 202 0 0 0.001Appel de poste à poste :
PJSIP/6001-00000003 6002@interne:2 Up Dial(PJSIP/6002,20)PJSIP/6002-00000004 (None) Up AppDial((Outgoing Line))2 active channels1 active call
BridgeId ChannelId UpTime Codec Rx:Count Lost Pct Tx:Count Lost Pct b65d1ef7 6002-00000004 00:00:06 g722 302 0 0 302 0 0Deux canaux pontés, G.722 négocié, aucun paquet perdu dans les deux sens. La chaîne complète est validée : signalisation SIP, authentification, plan de numérotation, pontage et transport RTP.
11. Journalisation
Section intitulée « 11. Journalisation »Par défaut, /etc/asterisk/logger.conf ne consigne que les avertissements et
les erreurs. Pour tracer le déroulé des appels :
[logfiles]console => notice,warning,error,verbosemessages.log => notice,warning,errorfull => notice,warning,error,verbose(5),dtmfsudo asterisk -rx "logger reload"sudo asterisk -rx "logger show channels"On obtient alors la résolution effective des fichiers audio, ce qui confirme la prise en compte de la langue :
sudo grep -oE "Playing [^ ]+ \(language .[a-z]*.\)" /var/log/asterisk/fullPlaying 'demo-echotest.g722' (language 'fr')Playing 'digits/14.g722' (language 'fr')Playing 'digits/50.g722' (language 'fr')Playing 'digits/oclock.g722' (language 'fr')Les trois derniers viennent de SayUnixTime sur le 601, qui a annoncé 14 h 50
en français.
Penser à la rotation, /etc/logrotate.d/asterisk :
/var/log/asterisk/full/var/log/asterisk/messages.log { daily rotate 30 missingok notifempty compress delaycompress postrotate /usr/sbin/asterisk -rx 'logger rotate' > /dev/null 2>&1 || true endscript su asterisk asterisk}12. Dépannage
Section intitulée « 12. Dépannage »| Symptôme | Cause | Correction |
|---|---|---|
apt install asterisk : paquet introuvable |
retiré de Debian 13 | compiler depuis les sources |
install_prereq échoue |
paquets disparus de trixie | utiliser la liste de la section 1 |
| Compilation tuée sans message | mémoire insuffisante sur PJPROJECT | make -j2, ou ajouter du swap |
| Le service s’arrête aussitôt lancé | -f absent de ExecStart |
ajouter -f, exigé par Type=simple |
Unable to connect to remote asterisk |
/var/run/asterisk absent après reboot |
RuntimeDirectory=asterisk dans l’unité |
Poste jamais Avail |
auth ou aors non référencés dans l’endpoint |
pjsip show endpoint 6001, vérifier les trois objets |
| Appel décroché puis coupé net | source audio incompatible avec le codec | côté baresip, aubridge et non ausine |
| Sonnerie mais audio muet | RTP bloqué | ouvrir 10000-20000/udp, direct_media=no |
| Sons en anglais | language non posé sur l’endpoint |
language=fr, sans préfixer les Playback |
/var/log/asterisk/full vide |
niveau de verbosité non précisé | verbose(5) et non verbose |
could not find UA au lancement |
-e s’exécute avant l’enregistrement |
piloter baresip par tube nommé |
cdr_custom declined to load |
section absente de cdr_custom.conf |
sans effet, ou renseigner la section |
13. Maintenance
Section intitulée « 13. Maintenance »Aucune mise à jour ne viendra d’APT. Le cycle est manuel :
cd ~/srcwget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gztar xzf asterisk-22-current.tar.gz && cd asterisk-22.<nouvelle version>./configure --with-pjproject-bundled --with-jansson-bundled \ --prefix=/usr --sysconfdir=/etc --localstatedir=/varcp ../asterisk-22.11.0/menuselect.makeopts . # reprendre la selection precedentemake -j2sudo systemctl stop asterisksudo make installsudo systemctl start asterisksudo asterisk -rx "core show version"make install ne touche pas à /etc/asterisk, les configurations sont
préservées. Recopier menuselect.makeopts évite de refaire la sélection des
sons à chaque version.
S’abonner à la liste de sécurité amont est la contrepartie du choix de compiler. Les bulletins sont publiés sur le portail des avis de sécurité Asterisk, avec les versions correctives associées.
Commandes de supervision courantes :
sudo asterisk -rx "core show uptime"sudo asterisk -rx "pjsip show endpoints"sudo asterisk -rx "pjsip show registrations"sudo asterisk -rx "core show channels"sudo asterisk -rx "pjsip show channelstats"sudo asterisk -rx "module show like pjsip"Pour une session interactive : sudo asterisk -rvvv, puis core set verbose 3
et pjsip set logger on pour voir passer la signalisation SIP en clair.
Suites possibles
Section intitulée « Suites possibles »Ce socle laisse volontairement de côté trois chantiers, chacun conséquent :
- Messagerie vocale et SVI :
voicemail.conf,app_voicemail, arborescenceBackgroundetWaitExten - Raccordement opérateur : objets
registration,identifyetendpointcôté trunk, plan de numérotation entrant et sortant, gestion du NAT - Durcissement :
fail2bansur les tentatives d’authentification, restriction des ACL PJSIP, TLS et SRTP, garde-fous contre la fraude à la taxation
Références
Section intitulée « Références »- Documentation Asterisk : docs.asterisk.org
- Téléchargements et branches LTS : downloads.asterisk.org
- Configuration PJSIP : Configuring res_pjsip
- Suivi du paquet Debian : tracker.debian.org/pkg/asterisk
- baresip : github.com/baresip/baresip