Aller au contenu principal

Asterisk PJSIP

Ce guide décrit la configuration d'un sipcall sip trunk ou d'un numéro sipcall virtual pbx avec Asterisk (version LTS 22) en utilisant PJSIP.

Prérequis

  • Asterisk est déjà installé
  • Accès root ou sudo au serveur
  • Connaissances de base en Linux
  • Connaissances en réseau et pare-feu
  • Données d'accès de sipcall (SIP serveur, identification de l'utilisateur, mot de passe VoIP) :

    Vous trouverez les données de configuration dans le portail client sous "Numéros de téléphone" -> "Aperçu des numéros de téléphone". Cliquez sur le numéro souhaité pour consulter les données de configuration (dans la section "Références SIP").

Configuration

Placez les fichiers de configuration Asterisk dans le répertoire /etc/asterisk/.

Le système vérifie et lit automatiquement ces fichiers au démarrage du service Asterisk.

Enregistrer le numéro de téléphone

Pour enregistrer le numéro sipcall avec Asterisk, vous avez besoin des objets PJSIP suivants dans le fichier pjsip.conf : registration, endpoint, auth et aor.
Pour être complet, commencez la configuration avec le type d'objet transport.

L'exemple de configuration suivant peut être utilisé comme modèle.

/etc/asterisk/pjsip.conf
; ******* TRANSPORT *******
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060

; ******* sipcall RN <Identification de l'utilisateur> https://kb.sipcall.ch/enddevices/phonesystems/asterisk *******
[sipcall]
type = registration
transport = transport-udp
server_uri = sip:<SIP serveur>:5060
client_uri = sip:<Identification de l'utilisateur>@<SIP serveur>
contact_user = <Identification de l'utilisateur>
outbound_auth = sipcall
expiration = 60
endpoint = sipcall
line = yes
max_retries = 10000
fatal_retry_interval = 30
forbidden_retry_interval = 30

[sipcall]
type = endpoint
transport = transport-udp
context = from-pstn-toheader
disallow = all
allow = g722,alaw,ulaw
rtp_keepalive = 1
outbound_auth = sipcall
aors = sipcall
rewrite_contact = yes
direct_media = no
force_rport = no

[sipcall]
type = auth
auth_type = digest
username = <Identification de l'utilisateur>
password = <Mot de passe VoIP>

[sipcall]
type = aor
contact = sip:<SIP serveur>:5060

  • Remplacez les espaces réservés <Identification de l'utilisateur>, <SIP serveur> et <Mot de passe VoIP> par les données de configuration fournies depuis le portail client sipcall.
Explications
  • type = transport : Définit les paramètres généraux du réseau sur lesquels le service Asterisk écoute.
  • type = registration : Paramètres d'enregistrement du sipcall sip trunk/numéro sipcall (virtual pbx/free/classic/home). Remplacez les espaces réservés <SIP serveur> et <Identification de l'utilisateur> par les données de configuration fournies depuis le portail client sipcall.
  • type = endpoint : Définit les paramètres audio et la logique.
  • type = auth : Définit l'authentification. Remplacez les espaces réservés <Mot de passe VoIP> et <Identification de l'utilisateur> par les données de configuration fournies depuis le portail client sipcall.
  • type = aor : L'adresse de contact pour les appels sortants (Address of Record). Remplacez l'espace réservé <SIP serveur> par la valeur des données de configuration fournies depuis le portail client sipcall.

Redémarrage

Redémarrez Asterisk pour charger la configuration :

sudo asterisk -rx "core restart now"

Recevoir des appels

  • Ajoutez le contexte de dialplan (contexte du plan de numérotation) suivant dans le fichier extensions.conf :
/etc/asterisk/extensions.conf
; ****** sipcall inbound calls ******
[from-pstn-toheader]
exten = _X.,1,Set(to_user=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)})
same = n,GoTo(<Nom-du-contexte>,${to_user},1)
  • Remplacez l'espace réservé <Nom-du-contexte> par un contexte valide.
Explications

Pour traiter correctement les appels, un contexte de dialplan est nécessaire, défini dans le fichier extensions.conf.

Lors de l'enregistrement du numéro, context = from-pstn-toheader a été défini pour exécuter ce contexte de dialplan. Celui-ci extrait le numéro de téléphone de l'en-tête « SIP-To » et le transmet à <Nom-du-contexte>.

Dans le champ <Nom-du-contexte>, un contexte valide doit être défini. Vous pouvez le nommer librement. En pratique, il s'agirait par exemple de from-external ou pour un test de hello-world.

Tester les appels entrants externes avec « Hello World »

  • Dans le contexte de dialplan from-pstn-toheader, définissez la valeur hello-world pour l'espace réservé <Nom-du-contexte>.
  • Ajoutez le contexte de dialplan suivant dans le fichier :
/etc/asterisk/extensions.conf
[hello-world]
exten = <Identification de l'utilisateur>,1,NoOp(sipcall appel entrant <Identification de l'utilisateur>)
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()
  • Remplacez l'espace réservé <Identification de l'utilisateur> par la valeur des données de configuration fournies depuis le portail client sipcall.
Explications

Lorsque votre numéro est appelé, Asterisk lit le fichier hello-world et termine l'appel.

Transférer les appels entrants externes vers un utilisateur interne

  • Ajoutez le contexte de dialplan from-external suivant dans le fichier :
/etc/asterisk/extensions.conf
[from-external]
; Le numéro sipcall est routé vers l'endpoint 200
exten = <Identification de l'utilisateur>,1,Dial(PJSIP/200)
same = n,Hangup()
  • Remplacez l'espace réservé <Identification de l'utilisateur> par la valeur des données de configuration fournies depuis le portail client sipcall.
Explications

Cette section transfère l'appel entrant vers le poste interne 200. Elle garantit que seuls les appels vers le numéro enregistré (<Identification de l'utilisateur>) sont traités. Cela empêche le poste de recevoir des appels fantômes (ghost calls).

Pour plus d'informations, consultez la documentation Asterisk.

Enregistrer des terminaux sur Asterisk

Pour connecter des terminaux à Asterisk, créez des « endpoints » internes dans le fichier pjsip.conf. Dans notre exemple, il s'agit d'un poste SIP avec le numéro interne 200.

/etc/asterisk/pjsip.conf
; poste interne 200
[200]
type = endpoint
transport = transport-udp
context = from-internal
callerid = "Max Muster" <200>
disallow = all
allow = g722,alaw,ulaw
aors = 200
auth = 200
force_rport = no
rtp_symmetric = yes
rewrite_contact = yes
direct_media = no

[200]
type = auth
auth_type = userpass
password = mot de passe sécurisé ; Mot de passe pour le poste interne
username = 200

[200]
type = aor
max_contacts = 2
Explications
  • callerid : Sert de valeur interne : Le nom d'affichage est défini avec "", le numéro de rappel interne avec <>. Lorsque l'appel est externe, l'identifiant de l'appelant est remplacé par l'identification de l'utilisateur.

Appels sortants

Dans notre exemple, nous avons attribué le contexte from-internal au poste interne 200.

Pour que les postes puissent effectuer des appels sortants, nous avons besoin de ce contexte de dialplan dans le fichier extensions.conf.

/etc/asterisk/extensions.conf
; ****** sipcall outbound calls RN <Identification de l'utilisateur> ******
[from-internal]
include = appels-urgence

; ***** appels internes *****
exten = _NXX,1,NoOp(Internal Call to User with 3 Digits)
same = n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30)
same = n,Hangup()


; ***** appels externes *****
exten = _0X.,1,NoOp(Internal Call to external Numbers with 0)
same = n,Set(CALLERID(num)=<Identification de l'utilisateur>)
same = n,Dial(PJSIP/${EXTEN}@sipcall)

exten = _+X.,1,NoOp(Internal Call to external Numbers with +)
same = n,Set(CALLERID(num)=<Identification de l'utilisateur>)
same = n,Dial(PJSIP/${EXTEN}@sipcall)
  • Remplacez l'espace réservé <Identification de l'utilisateur> par la valeur des données de configuration fournies depuis le portail client sipcall.
Explications
  • include = appels-urgence intègre le contexte de dialplan pour les numéros d'urgence.
  • Dans la section « appels internes », les appels correspondant au modèle _NXX (trois chiffres, le premier chiffre n'est ni 0 ni 1) sont routés en interne.
  • Si le modèle ne correspond pas, la deuxième section est exécutée. Ici, les appels correspondant au modèle _0X. (numéro commençant par 0) sont routés en externe via sipcall.
  • Si cela ne correspond pas non plus, la troisième section est exécutée. Ici, les appels correspondant au modèle _+X. (numéro commençant par +) sont routés en externe via sipcall.
  • Dans les deuxième et troisième sections, l'identifiant de l'appelant du poste est remplacé par l'identification de l'utilisateur.

D'autres possibilités sont décrites dans la documentation du pattern matching.

Numéros d'urgence

Pour l'accessibilité des numéros d'urgence, un contexte de dialplan supplémentaire est nécessaire. Celui-ci est déjà inclus dans le contexte de dialplan [from-internal] avec la ligne include = appels-urgence.

Vous pouvez copier ce contexte de dialplan directement dans votre dialplan :

/etc/asterisk/extensions.conf
; ****** Appels d'urgence pour RN <Identification de l'utilisateur> ******
[appels-urgence]
; Numéro d'urgence européen
exten = 112,1,GoSub(urgence-handler,${EXTEN},1)

; Urgence police
exten = 117,1,GoSub(urgence-handler,${EXTEN},1)

; Urgence pompiers
exten = 118,1,GoSub(urgence-handler,${EXTEN},1)

; Aide aux victimes
exten = 142,1,GoSub(urgence-handler,${EXTEN},1)

; La Main Tendue
exten = 143,1,GoSub(urgence-handler,${EXTEN},1)

; Ambulance, services médicaux d'urgence
exten = 144,1,GoSub(urgence-handler,${EXTEN},1)

; Intoxications
exten = 145,1,GoSub(urgence-handler,${EXTEN},1)

; Ligne d'aide pour les jeunes
exten = 147,1,GoSub(urgence-handler,${EXTEN},1)

; Air Zermatt, sauvetage aérien
exten = 1410,1,GoSub(urgence-handler,${EXTEN},1)

; Rega, sauvetage aérien
exten = 1414,1,GoSub(urgence-handler,${EXTEN},1)

; Air-Glaciers, sauvetage aérien
exten = 1415,1,GoSub(urgence-handler,${EXTEN},1)

; Ligne d'aide UE pour les victimes de violences envers les femmes
exten = 116016,1,GoSub(urgence-handler,${EXTEN},1)

; Ligne d'aide UE pour les enfants
exten = 116111,1,GoSub(urgence-handler,${EXTEN},1)

; Ligne d'aide UE pour les victimes de crimes
exten = 116006,1,GoSub(urgence-handler,${EXTEN},1)

; Ligne d'aide UE pour les enfants disparus
exten = 116000,1,GoSub(urgence-handler,${EXTEN},1)


[urgence-handler]
exten = _X.,1,NoOp(Calling ${EXTEN})
same = n,Set(CALLERID(num)=<Identification de l'utilisateur>)
same = n,Dial(PJSIP/${EXTEN}@sipcall)
same = n,Hangup()
  • Remplacez l'espace réservé <Identification de l'utilisateur> par la valeur des données de configuration fournies depuis le portail client sipcall.

Remarques sur le CLIP

sipcall empêche le CLIP spoofing (usurpation d'identité CLIP). Si l'identifiant de l'appelant défini ne correspond pas aux critères, le CLIP est remplacé. Pour plus d'informations, consultez la description de la fonction « Affichage du numéro d'appel (CLIP) » dans la section Appels sortants.

Consignes de sécurité

Lors de la configuration, veillez aux points suivants :

  • Sécurité des mots de passe : Utilisez des mots de passe forts pour les terminaux internes.
  • Fail2Ban : Il est recommandé d'installer Fail2Ban, Crowdsec ou des applications similaires pour prévenir les attaques par force brute.
  • Pare-feu : Limitez l'accès externe au port SIP pour bloquer les appels fantômes et les scanners SIP au niveau du pare-feu. Vous trouverez la liste de nos adresses IP de serveurs SIP ici.
  • Séparer les contextes : Séparez strictement les contextes internes et externes pour éviter les appels non autorisés vers l'extérieur.

Appliquer les modifications

Pour appliquer les modifications sans redémarrer l'ensemble du système, utilisez les commandes suivantes dans la CLI Asterisk (interface en ligne de commande d'Asterisk) :

  • pjsip reload (recharge la configuration PJSIP)
  • dialplan reload (recharge le dialplan)

Alternativement, redémarrez le service :

  • sudo asterisk -rx "core restart now"

Ressources supplémentaires

Pour plus d'informations sur la configuration d'Asterisk, consultez la page du projet :