Blog

  • Kamailio : tutoriel découverte partie 1

    Kamailio : tutoriel découverte partie 1

    J’ai découvert Kamailio il y a un an alors que mon besoin était de développer un SBC (Session Border Controller) qui avait pour fonction principale de protéger une instance Asterisk. Entre temps, le besoin initial a évolué et par définition la solution technique également. J’ai pu monter en compétence sur le logiciel et par la même occasion acquis de la souplesse avec celui-ci dans une stack technique VoIP.

    Alors que les ressources en ligne concernant les cas d’usage de Kamailio s’avèrent relativement limitées, je vais essayer d’expliquer ce logiciel au travers d’une série d’articles avec des exemples de configuration.

    En premier lieu et avant de engouffrer plus largement dans cet tutoriel, il est recommandé d’avoir des connaissances en SIP (RFC 3261).

    Définitions

    Pour mieux comprendre les concepts mentionnés dans cet article et l’écosystème Kamailio en général, voici une liste des définitions essentielles.

    Rôles SIP fondamentaux

    • SIP (Session Initiation Protocol) : Un protocole de signalisation de la couche application utilisé pour initier, maintenir et terminer des sessions en temps réel incluant de la voix, de la vidéo et de la messagerie.
    • UAC (User Agent Client) : Une entité logique qui crée une nouvelle requête SIP. Par exemple, lorsque vous décrochez un téléphone VoIP pour composer un numéro, le téléphone agit comme un UAC pour initier la requête INVITE.
    • UAS (User Agent Server) : Une entité logique qui génère une réponse à une requête SIP. Lorsqu’un téléphone reçoit un INVITE et renvoie un 180 Ringing ou un 200 OK, il agit en tant qu’UAS.
    • B2BUA (Back-to-Back User Agent) : Contrairement à un proxy, un B2BUA agit simultanément comme un UAS et un UAC. Il termine le segment d’appel (call leg) entrant et en initie un nouveau sortant, ce qui lui donne un contrôle complet sur les médias et la signalisation (ex. : Asterisk ou FreeSWITCH).

    Remarque : La plupart des points de terminaison SIP (comme les téléphones IP ou les PBX) agissent à la fois comme UAC et UAS, selon qu’ils émettent ou reçoivent un appel.

    Composants VoIP

    • Proxy SIP : Un serveur qui agit comme un intermédiaire, relayant les requêtes SIP vers une autre entité. La force principale de Kamailio est d’agir comme un proxy programmable à haute performance.
    • Registrar : Un serveur qui accepte les requêtes REGISTER et stocke les informations reçues (l’association entre l’URI d’un utilisateur et son adresse IP actuelle) dans un service de localisation (location service).
    • SBC (Session Border Controller) : Un équipement spécialisé ou un logiciel (comme Kamailio) utilisé pour protéger et gérer les flux de signalisation et de médias à la « bordure » d’un réseau. Il gère la sécurité (masquage de la topologie interne), la traversée de NAT et la normalisation des protocoles.
    • AoR (Address of Record) : Une URI SIP qui pointe vers un domaine disposant d’un service de localisation où l’utilisateur peut être joint. Par exemple : sip:user@example.com.
    • RTPEngine : Un proxy pour le trafic RTP. Étant donné que Kamailio ne gère généralement que la signalisation (SIP), il utilise souvent RTPEngine pour relayer les données audio/vidéo réelles (RTP) entre différentes interfaces réseau et différents utilisateurs.

    Qu’est-ce que Kamailio ?

    Kamailio (anciennement OpenSER) est un serveur SIP gratuit et open source. Il est écrit en C avec une attention toute particulière pour la performance. Kamailio est hautement configurable et peut agir comme registrar, proxy ou encore load-balancer SIP, grâce à son architecture modulaire.

    Contrairement à ce que l’on pourrait penser, Kamailio n’est pas un PBX et diffère d’Asterisk, FreeSwitch et consorts. Kamailio n’est pas non plus un B2BUA (Back-to-Back User Agent) et ne gère que la signalisation (SIP) là où un PBX va en plus gérer les médias (voix) ou encore avoir des fonctions de call-center.

    Pour répondre à un besoin avec Kamailio vous devez le configurer. La configuration initiale de Kamailio ne fait rien, cependant elle donne un aperçu des possibilités du logiciel. C’est aussi en ce sens qu’il est nécessaire d’avoir des connaissances en SIP, car vous devez avoir une idée des requêtes et réponses nécessaires au bon fonctionnement de ce logiciel.

    Note : Kamailio ne gère pas les médias. Pour cela je vous invite à utiliser RTPEngine de SIPWise.

    Où trouver la documentation Kamailio ?

    Sur le site officiel de Kamailio vous pouvez retrouver deux documentations : le wiki officiel et celle des modules. La documentation officielle est très complète et aussi bien le Wiki, que les pages des modules, éclairent très bien la configuration de Kamailio.

    En revanche, lorsqu’il s’agit des cas d’usage et des architectures avec des composants tiers, il est plus difficile d’avoir un aperçu de haut niveau. Des personnages comme Fred POSNER font souvent les éloges de Kamailio et de grâce, il existe la chaîne YouTube Kamailio World. En somme, il est aussi possible de s’inspirer de la documentation OpenSIPS et de ses tutoriels, cependant on y trouve très vite de divergences.

    Installer Kamailio

    Kamailio est disponible sur Linux et BSD. Sur Ubuntu, installez Kamailio depuis les dépôts officiel : $ sudo apt install kamailio

    Éditez la configuration : /etc/kamailio.cfg .

    Il est aussi possible d’utiliser Kamailio avec Docker avec une configuration comme ci-après :

    networks:
      default:
      # database:
      #   external: true
    
    services:
      # Primary Kamailio instance
      kamailio:
        image: ghcr.io/kamailio/kamailio:6.0.4-bookworm
        restart: unless-stopped
        volumes:
          - ./kamailio:/etc/kamailio
          - ./kamailio/logs/kamailio:/var/log/kamailio
        network_mode: host # Expose 5060 for TCP/UDP and 5061 for TLS
    
      # RTP Engine service
      rtpengine:
        image: fonoster/rtpengine:latest
        container_name: rtpengine
        restart: unless-stopped
        network_mode: "host" # At the moment this option only works in Linux
        environment:
          # RTPENGINE_PUBLIC_IP: ${DOCKER_HOST_ADDRESS:-192.168.1.210} When commented, use Netdiscover (https://github.com/fonoster/rtpengine/blob/main/Dockerfile)
          RTPENGINE_BIND_NG_IP: ${RTPENGINE_BIND_NG_IP:-127.0.0.1}
          RTPENGINE_BIND_NG_PORT: ${RTPENGINE_BIND_NG_PORT:-2223}
          RTPENGINE_PORT_MIN: 10000
          RTPENGINE_PORT_MAX: 20000
          RTPENGINE_LOG_LEVEL: "6"

    Notez tout de même que network_mode=host n’est supporté que sur Linux. Aussi, les protocoles SIP et RTP apprécient moyennement d’être confrontés à du NAT (Network Address Translation) si vous décidez d’exposer les ports de Kamailio et RTPEngine avec Docker.

    Quelques notions de SIP

    Pour ce premier article je vais lister lister quelque-unes des requêtes SIP à connaître. Ils vous seront utiles aussi bien pour travailler avec Kamailio que pour n’importe quel autre PBX.

    Requête SIPDescription
    INVITEInitie une session d’appel.
    ACKConfirme la réception d’une réponse finale (ex. après INVITE).
    BYETermine une session existante.
    CANCELAnnule une requête INVITE en attente avant qu’elle ne soit répondue.
    REGISTEREnregistre la localisation d’un utilisateur auprès d’un serveur SIP.
    OPTIONSInterroge les capacités d’un serveur ou d’un point d’extrémité.
    INFOTransporte des informations de contrôle en cours de session (ex. DTMF).
    PRACKAccuse réception des réponses provisoires fiables lorsqu’elles sont utilisées.
    UPDATEModifie les paramètres de la session sans refaire un INVITE.
    REFERDemande au destinataire d’initier une nouvelle requête (souvent pour le transfert d’appel).

    Découvrir Kamailio

    C’est parti pour démarrer ce tutoriel avec Kamailio. Voici quelques notions de SIP qui vous seront utiles si vous êtes débutant. À défaut cela fera tout de même un rappel.

    Exemple de requête INVITE

    Prenons l’exemple d’une requête SIP qui permet de passer un appel : INVITE. Imaginons comme deux utilisateurs 1001 et 1002 et que 1001 souhaite appeler 1002.

    Selon la RFC 3261, 1001 doit émettre une requête SIP à destination de 1002, cependant cela implique de savoir l’adresse IP et le port sur lequel 1002 est disponible. Dans la pratique, cela ne se passe jamais comme ça et 1001 va émettre cette requete à un serveur SIP qui se chargera de la relayer (à la façon d’un proxy) ou d’en émettre une nouvelle à la façon d’un PBX (B2BUA).

    INVITE sip:1002@voip.operateur.re SIP/2.0

    Dans un schéma avec deux téléphones, cette requête fait « sonner » le téléphone de 1002. Si nous envoyions ce message à un PBX générique, celui-ci aurait la logique nécessaire pour savoir qu’il dispose d’une extension 1001 et ferait sonner l’extension 1002.

    Avec un PBX

    Un PBX générique examine l’URI de requête dans le message INVITE qu’il a reçu et dispose d’une logique prédéfinie pour savoir que 1002 est un appareil qu’il a enregistré et que nous voulons nous connecter à cet appareil. Il envoie donc l’appel à l’appareil correspondant (1002). Ceci est le fonctionnement « classique » d’Asterisk, de FreeSwitch ou de n’importe quel PBX. Pour en dire plus à ce sujet, si nous envoyons cette requête à Asterisk, celui-ci vérifierai qu’il dispose des utilisateurs (endpoint dans PJSIP) et si le dialplan le permet redirigerai la requête vers le destinataire (exemple de ligne de dialplan : Dial(PJSIP/{EXTEN},30,tTr)). La gestion des réponses est automatique avec un PBX et celui se concentre sur la logique coeur, c’est à dire établir des appels entre les utilisateurs, qu’ils soient locaux ou distants par le biais d’un trunk par exemple.

    Avec Kamailio

    Kamailio fonctionne d’une toute autre façon. Si vous souhaitez que Kamailio réagisse à cette requête il faut l’écrire dans sa configuration et lui indiquer – à la façon d’un langage de programmation – les actions à prendre. Sommairement cela reviendrait à programmer Kamailio pour accepter les requêtes INVITE, vérifier si l’adresse d’enregistrement du destinataire (AoR : Address of Record) se trouve en mémoire, de répondre par un 100 Trying puis de transférer l’INVITE à la destination puis de répondre à l’appelant 200 OK, ce qui donne le diagramme suivant :

    Flux d’appel utilisant Kamailio

    Ici, j’ai omis le fait que nous devons également gérer les réponses 4XX si l’appelé est occupé ou absent, les utilisateurs ou encore les médias voix (RTP). Bien que tout cela semble difficile à gérer, il ne s’agit ici que de « programmation » au sens large du terme.

    Même si cet exemple peut paraitre bateau, il vous permet de comprendre comment le système gère et achemine vos messages SIP. En somme, cela ouvre la porte à beaucoup de fonctionnalités, comme le fait de pouvoir gérer des autorisations d’appels pré-payé ou affranchi (post-paid), de sauvegarder le détail des communications (Call Detail Records), de faire du firewalling, du load-balancing, du LCR (Least Cost Routing), etc.

    Le mot de la fin

    Kamailio est un logiciel difficile à prendre en main. Les premières approches que vous aurez peuvent rebuter et vous aurez parfois l’envie d’abandonner. Avec un peu d’expérience il est possible de faire beaucoup de choses avec Kamailio qui peut être utilisé comme softswitch de classe 5 (pour entreprise) ou de classe 4 (pour opérateur).

  • Comment connecter deux instances Asterisk en trunk avec PJSIP

    Comment connecter deux instances Asterisk en trunk avec PJSIP

    La VoIP (Voice over IP) révolutionne la téléphonie en utilisant Internet pour les appels. L’interconnexion de serveurs Asterisk change la donne pour les petits FAI et les entreprises multi-sites cherchant une solution téléphonique flexible et scalable.

    Ce guide pratique explique comment configurer un trunk SIP avec Asterisk et PJSIP pour relier deux serveurs. Idéal pour fournir des trunks SIP à des clients ou connecter des bureaux distants. Il couvre les bases du trunking VoIP, la configuration et la gestion des endpoints SIP (utilisateurs finaux).

    Qu’est-ce qu’Asterisk ?

    Logo Asterisk, logiciel open-source VoIP

    Asterisk est un logiciel open-source gratuit pour créer des systèmes de téléphonie VoIP. Développé initialement par Digium (racheté par Sangoma en 2018), il gère appels vocaux, vidéo et messagerie sur IP.

    Polyvalent, il va du PBX simple (central téléphonique) au softswitch avancé ou SBC (Session Border Controller) pour gérer les flux médias. Il équipe PBX d’entreprises et centres d’appels complexes.

    Personnalisable, Asterisk supporte SIP via le module PJSIP (implémentation maintenue à ce jour), XMPP pour les SMS et SMTP pour les e-mails. Pour un petit FAI, il peut centraliser les appels entre endpoints (téléphones ou clients) et les services PSTN (réseau téléphonique commuté).

    Comprendre les trunks en VoIP

    Un trunk est une liaison qui transporte plusieurs appels simultanés entre serveurs ou opérateurs.

    Autrefois des lignes physiques en E1 (Europe) ou en T1 (USA) commercialisés par des opérateurs comme France Télécom ou AT&T, les trunks sont aujourd’hui virtuels et sur Internet grâce à la VoIP. En l’occurence, cela rend la configuration de trunk avec Asterisk accessible aux entreprises et aux administrateurs désireux d’en apprendre plus.

    Sur Asterisk, considère un trunk comme une liaison qui relie votre serveur à un opérateur VoIP (OVH, Telnyx) ou autre client IPBX.

    En comparaison à son homologue historique, le trunk VoIP amène des avantage non négligeables :

    • Économies : Nécessite seulement un accès Internet, sans matériel dédié.
    • Scalabilité : De 10 à 10 000 appels en ajoutant des ressources serveur, ce qui en fait un cas d’usage idéal pour les centres d’appels.
    • Flexibilité : Routage intelligent par heure, par identifiant (numéro de téléphone) ou selon des règles personnalisées.

    SIP : le cœur de la VoIP

    SIP (Session Initiation Protocol, norme RFC 3261) lance, maintient et arrête les sessions VoIP. Il gère la signalisation : création d’appels, transferts, fins ou messages d’indisponibilité.

    Note : SIP ne transporte pas l’audio ; c’est RTP qui s’en charge.

    Gestion des médias (audio et vidéo)

    SIP orchestre les connexions, mais les médias (voix, vidéo) circulent séparément via RTP (Real-time Transport Protocol) sur UDP. Asterisk les gère avec des codecs comme G.711 ou Opus pour compresser et transmettre le flux.

    Présentation du lab et mise en oeuvre

    Pour imager et vous permettre d’atteindre votre objectif, dans cet article j’ai fait le choix de limiter ce guide à deux instances d’Asterisk.

    D’un côté nous aurons l’instance A qui sera l’instance « master«  et qui sera attachée à un trunk SIP opérateur (ITSP), qu’on peut imaginer chez OVH, Orange, SFR ou Twilio ou autre. De l’autre, nous aurons l’instance B qui sera l’instance « slave«  qui aura un trunk SIP à destination de l’instance master. L’instance A est donc le fournisseur et l’instance B le client. En somme ce scénario fonctionne aussi si vous êtes une entreprise avec des bureaux distants où vous souhaitez de la téléphonie fixe.

    Schéma d’architecture du projet d’interconnexion des instances Asterisk

    Configurer un trunk pour interconnecter deux instances Asterisk

    Ce guide suppose d’utiliser Asterisk 18+ avec PJSIP. Si ce n’est pas le cas, je vous invite à faire une mise à jour sur les dernières versions qui apportent pas de flexibilité en comparaison au driver SIP historique.

    Par défaut, les paquets officiels disponibles sur CentOS (RIP) et Ubuntu installent les configurations dans le dossier suivant : /etc/asterisk.

    Les fichiers importants pour notre usage sont pjsip.conf et extensions.conf. On considère que :

    • Les deux serveurs sur des réseaux stables avec des adresses IP publiques.
    • Les ports de pare-feu ouverts : 5060 UDP/TCP (SIP), 10000-20000 UDP.

    Installer Asterisk

    La première étape est d’installer Asterisk sur les instances Linux. Le paquet est disponible de manière native sur de nombreuses distributions dont Ubuntu.

    • Sur CentOS : sudo dnf install asterisk
    • Sur Ubuntu : sudo apt install asterisk

    Faire une sauvegarde de la configuration originale :

    cp /etc/asterisk/pjsip.conf /etc/asterisk/pjsip.conf.bak

    Configurer serveur A : côté fournisseur

    Cette partie prend place sur le serveur A qui est le master. Nous allons éditer la configuration PJSIP pour déclarer l’instance B qui sera à même de s’enregistrer et s’identifier pour recevoir et émettre des appels.

    Configurer PJSIP

    Sur le serveur A, ajoutez les configurations suivantes dans pjsip.conf :

    Définissez les protocoles supportés par Asterisk pour la signalisation et les médias :

    ; Définition des transports en IPv4 et IPv6
    
    [transport-tcp] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=tcp ; Ici uniquement TCP
    bind=0.0.0.0:5060 ; On écoute sur toutes les interfaces IPv4 en TCP 5060
    
    [transport-udp6] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=udp ; Ici uniquement UDP
    bind=[::]:5060 ; Écoute toutes les interfaces IPv6 sur le port 5060
    
    [transport-tcp6] 
    type=transport
    protocol=tcp
    bind=[::]:5060
    
    [transport-udp] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=udp ; Ici uniquement UDP
    bind=0.0.0.0:5060 ; On écoute sur toutes les interfaces IPv4 sur le port 5060 (standard SIP)
    

    Définissez le client (à savoir le serveur B) :

    ; Définition du client (serveur B)
    
    [trunk-customer-b]
    type=endpoint
    ; transport=transport-udp ; On peut omettre cette ligne pour être éligible à IPv4 et IPv6 tout aussi bien en UDP qu'en TCP
    context=subscriber  ; Contexte ou dialplan auquel sera affecté le client. Voir la suite de cet article.
    disallow=all ; Interdit tous les codecs
    allow=opus,g711,alaw,ulaw  ; Autoriser un nombre limité de codecs
    auth=trunk-customer-b-auth ; Identifiants associés à cet endpoint (utilisateur)
    aors=trunk-customer-b ; Adresse d'enregistrement de l'endpoint, nécessaire pour 
    direct_media=no  ; Force le passage des médias audio par Asterisk. Utile dans un contexte où le client se trouve derrière un NAT.

    Définissez les paramètres d’identification du serveur B :

    [trunk-customer-b-auth]
    type=auth
    auth_type=userpass
    username=trunkuser  ; Nom d'utilisateur du client
    password=strongpass123 ; Mot de passe
    ; realm=asterisk ; Optionel et par défaut définit à 'asterisk'
    
    [trunk-customer-b-aor]
    type=aor ; AoR = Address of Record / Addresse d'Enregistrement
    max_contacts=1 ; Autorise un seul enregistrement de l'instance B
    ; contact=sip:192.0.2.2:5060  ; A définir sur le client possède une IP fixe et qu'il ne s'enregistre pas sur le serveur A avec la requête REGISTER pour s'identifier. En activant cette ligne l'instance B est considérée comme stateless.

    Ces lignes configurent le serveur A comme un fournisseur de trunk SIP avec une identification obligatoire pour le client (serveur B). La section auth impose un nom d’utilisateur/mot de passe pour l’authentification PJSIP dans Asterisk, empêchant l’accès non autorisé.

    Le fichier complet pour le serveur A est le suivant :

    ; Définition des transports en IPv4 et IPv6
    
    [transport-tcp] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=tcp ; Ici uniquement TCP
    bind=0.0.0.0:5060 ; On écoute sur toutes les interfaces IPv4 en TCP 5060
    
    [transport-udp6] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=udp ; Ici uniquement UDP
    bind=[::]:5060 ; Écoute toutes les interfaces IPv6 sur le port 5060
    
    [transport-tcp6] 
    type=transport
    protocol=tcp
    bind=[::]:5060
    
    [transport-udp] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=udp ; Ici uniquement UDP
    bind=0.0.0.0:5060 ; On écoute sur toutes les interfaces IPv4 sur le port 5060 (standard SIP)
    
    ; Définition du client (serveur B)
    
    [trunk-customer-b]
    type=endpoint
    ; transport=transport-udp ; On peut omettre cette ligne pour être éligible à IPv4 et IPv6 tout aussi bien en UDP qu'en TCP
    context=subscriber  ; Contexte ou dialplan auquel sera affecté le client. Voir la suite de cet article.
    disallow=all ; Interdit tous les codecs
    allow=opus,g711,alaw,ulaw  ; Autoriser un nombre limité de codecs
    auth=trunk-customer-b-auth ; Identifiants associés à cet endpoint (utilisateur)
    aors=trunk-customer-b ; Adresse d'enregistrement de l'endpoint, nécessaire pour 
    direct_media=no  ; Force le passage des médias audio par Asterisk. Utile dans un contexte où le client se trouve derrière un NAT.
    
    [trunk-customer-b-auth]
    type=auth
    auth_type=userpass
    username=trunkuser  ; Nom d'utilisateur du client
    password=strongpass123 ; Mot de passe
    ; realm=asterisk ; Optionel et par défaut définit à 'asterisk'
    
    [trunk-customer-b-aor]
    type=aor ; AoR = Address of Record / Addresse d'Enregistrement
    max_contacts=1 ; Autorise un seul enregistrement de l'instance B
    ; contact=sip:192.0.2.2:5060  ; A définir sur le client possède une IP fixe et qu'il ne s'enregistre pas sur le serveur A avec la requête REGISTER pour s'identifier. En activant cette ligne l'instance B est considérée comme stateless.

    Configurer le plan de numérotation

    Je définis ici un plan de numérotation simple. Mon objectif est de permettre à l’instance B de pouvoir joindre les téléphones de l’instance A et inversement. Sur les deux instances, le trunk sera assigné au contexte subscriber tout comme les téléphones qui y seront enregistrés.

    Le plan de numérotation est dans /etc/asterisk/extensions.conf. On y autorise les téléphones du contexte à se joindre entre-eux :

    [subscriber]
    exten => _X.,1,NoOp(Incoming from customer) 
    
    same => n,Dial(PJSIP/${EXTEN},30,tTr)  ; Permet au client d'appeler un utilisateur dans le même contexte avec 5 sonneries (30 secondes) et le suivi de l'état de la sonnerie.
    
    same => n,Hangup()

    Cela gère les appels entrants, les redirigeant vers les extensions locales. Pour les appels sortants vers le Serveur B, nous le verrons dans la section suivante.

    Configuration du serveur B : côté client

    Le serveur B est celui détenue par le client. Cette instance Asterisk s’enregistre sur le serveur A qui est le fournisseur du trunk. En somme des téléphones peuvent également s’enregistrer sur l’instance B pour communiquer entre eux ou pour

    Configurer PJSIP

    Configurer le plan de numérotation

    A comme client trunk. Dans /etc/asterisk/pjsip.conf :

    ; Définition des transports en IPv4 et IPv6
    
    [transport-tcp] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=tcp ; Ici uniquement TCP
    bind=0.0.0.0:5060 ; On écoute sur toutes les interfaces IPv4 en TCP 5060
    
    [transport-udp6] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=udp ; Ici uniquement UDP
    bind=[::]:5060 ; Ecoute toutes les interfaces IPv6 sur le port 5060
    
    [transport-tcp6] 
    type=transport
    protocol=tcp
    bind=[::]:5060
    
    [transport-udp] 
    type=transport ; On définit un type de transport pour la gestion du SIP
    protocol=udp ; Ici uniquement UDP
    bind=0.0.0.0:5060 ; On écoute sur toutes les interfaces IPv4 sur le port 5060 (standard SIP)
    
    ; Définition du serveur A : fournisseur du trunk
    
    [trunk-isp-a]
    type=endpoint
    ; transport=transport-udp ; Ouvert à tous les transports
    context=from-runk  ; Context for calls from Server A
    disallow=all
    allow=g.711,alaw,ulaw
    auth=trunk-isp-a-auth
    aors=trunk-isp-a-aor
    outbound_auth=trunk-isp-a-auth
    from_user=trunkuser
    from_domain=192.0.2.1
    
    [trunk-isp-a-auth]
    type=auth
    auth_type=userpass
    username=trunkuser
    password=strongpass123
    ; realm=192.0.2.1
    
    [trunk-isp-a-aor]
    type=aor
    ; contact=sip:192.0.2.1:5060

    Ici, le Serveur B s’authentifie auprès du Serveur A, activant un trunking VoIP bidirectionnel.

    Pour les appels sortants vers le trunk FAI :

    Dans /etc/asterisk/extensions.conf :

    [from-internal]
    exten => _9NXXNXXXXXX,1,NoOp(Outbound to ISP) 
    same => n,Set(CALLERID(num)=${CALLERID(num)})  ; Preserve caller ID 
    same => n,Dial(PJSIP/${EXTEN:1}@trunk-isp-a)  ; Strip 9 prefix, dial via trunk 
    same => n,Hangup()
    
    [from-isp] 
    exten => _X.,1,NoOp(Incoming from ISP trunk) 
    same => n,Dial(Local/${EXTEN}@internal-extensions)  ; Route to local users same => n,Hangup()

    Testez la configuration : Depuis le Serveur B, appelez une extension sur le Serveur A (ex. Dial(PJSIP/100@trunk-isp-a)). Utilisez pjsip show endpoints en CLI Asterisk pour vérifier l’enregistrement.

    Dépannage des problèmes courants dans les interconnexions Asterisk PJSIP

    • Audio unidirectionnel : Activez direct_media=yes ou vérifiez les ports RTP/pare-feu.
    • Échec d’enregistrement : Vérifiez que les identifiants d’authentification et les realms correspondent.
    • Incompatibilité de codecs : Alignez allow/disallow des deux côtés.

    Pour un dépannage avancé d’Asterisk, activez les logs de débogage : pjsip set logger on.

    Meilleures pratiques pour des trunks VoIP sécurisés et évolutifs

    • Utilisez TLS pour SIP (ajoutez protocol=tls dans les transports) pour chiffrer la signalisation.
    • Implémentez des ACL dans pjsip.conf pour restreindre les IP.
    • Surveillez avec des outils comme sngrep pour l’analyse du trafic SIP.
    • Évoluez avec plusieurs trunks pour l’équilibrage de charge dans les environnements multi-Asterisk.

    En suivant ce guide d’interconnexion Asterisk PJSIP, vous aurez un trunk VoIP robuste opérationnel.

  • Comprendre et utiliser Kamailio partie 1

    Il y a quelques semaines de cela je me suis lancé dans un projet de créer un SBC (Session Border Controller) avec des logiciels open source pour le fun et le profit; Dans l’espoir de pouvoir commercialiser des offres de téléphonie mais aussi plus largement pour apprendre et surtout comprendre le fonctionnement de la téléphonie (fixe dans un premier temps).

    Dans cette séries d’articles, je vais vous présenter les outils qui affèrent à la VoIP (Voice over IP) et