Asterisk PJSIP
Diese Anleitung beschreibt die Einrichtung eines sipcall sip trunk oder einer sipcall virtual pbx-Rufnummer mit Asterisk (LTS-Version 22) unter Verwendung von PJSIP.
Voraussetzungen
- Asterisk ist bereits installiert
- Root- oder Sudo-Zugriff auf den Server
- Linux Grundkenntnisse
- Netzwerk- und Firewallkenntnisse
- Zugangsdaten von sipcall (SIP-Server, Benutzerkennung, VoIP-Passwort):
Die sipcall-Zugangsdaten finden Sie im Kundenportal unter "Rufnummern" -> "Rufnummernübersicht". Klicken Sie auf die gewünschte Rufnummer, um die Konfigurationsdaten (innerhalb der Karte "SIP-Daten") einsehen zu können.
Konfiguration
Die Asterisk-Konfigurationsdateien legen Sie im Ordner /etc/asterisk/ ab.
Das System prüft und liest diese automatisch beim Starten des Asterisk-Dienstes.
Rufnummer registrieren
Um die sipcall-Rufnummer mit Asterisk zu registrieren, benötigen Sie folgende PJSIP-Objekte in der Datei
pjsip.conf: registration, endpoint, auth und aor.
Vollständigkeitshalber leiten Sie die Konfiguration mit dem Objekttyp transport ein.
Die folgende Beispielkonfiguration kann als Vorlage verwendet werden.
; ******* TRANSPORT *******
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060
; ******* sipcall RN <Benutzerkennung> https://kb.sipcall.ch/enddevices/phonesystems/asterisk *******
[sipcall]
type = registration
transport = transport-udp
server_uri = sip:<SIP-Server>:5060
client_uri = sip:<Benutzerkennung>@<SIP-Server>
contact_user = <Benutzerkennung>
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 = <Benutzerkennung>
password = <VoIP-Passwort>
[sipcall]
type = aor
contact = sip:<SIP-Server>:5060
- Ersetzen Sie die Platzhalter
<Benutzerkennung>,<SIP-Server>und<VoIP-Passwort>mit den bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.
Erklärungen
type = transport: Definiert allgemeine Netzwerkparameter, auf die der Asterisk-Service lauscht.type = registration: Registrierungsparameter des sipcall sip trunks/der sipcall-Rufnummer (virtual pbx/free/classic/home). Ersetzen Sie die Platzhalter<SIP-Server>und<Benutzerkennung>mit den bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.type = endpoint: Definiert die Audioeinstellungen und Logik.type = auth: Definiert die Authentifizierung. Ersetzen Sie die Platzhalter<VoIP-Passwort>und<Benutzerkennung>mit den bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.type = aor: Die Kontaktadresse für ausgehende Anrufe (Address of Record). Ersetzen Sie den Platzhalter<SIP-Server>durch den Wert der bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.
Neustart
Starten Sie Asterisk neu, um die Konfiguration zu laden:
sudo asterisk -rx "core restart now"
Anrufe empfangen
- Fügen Sie den folgenden Dialplan-Kontext in der extensions.conf hinzu:
; ****** sipcall inbound calls ******
[from-pstn-toheader]
exten = _X.,1,Set(to_user=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)})
same = n,GoTo(<Kontext-Name>,${to_user},1)
- Ersetzen Sie den Platzhalter
<Kontext-Name>durch einen gültigen Kontext.
Erklärungen
Um Anrufe korrekt zu verarbeiten, wird ein Dialplan-Kontext benötigt, der in der Datei extensions.conf definiert wird.
Bei der Registrierung der Rufnummer wurde mit context = from-pstn-toheader definiert, dass dieser Dialplan-Kontext ausgeführt wird.
Dieser nimmt die Rufnummer aus der "SIP-To"-Zeile und leitet diese an <Kontext-Name> weiter.
Im Feld <Kontext-Name> muss ein gültiger Kontext gesetzt werden. Diesen können Sie frei benennen.
In der Praxis wäre dies beispielsweise from-external oder für einen Test hello-world.
Eingehende Anrufe von extern mit "Hello World" testen
- Setzen Sie im Dialplan-Kontext
from-pstn-toheader, beim Platzhalter<Kontext-Name>, den Werthello-world. - Fügen Sie in der Datei den folgenden Dialplan-Kontext hinzu:
[hello-world]
exten = <Benutzerkennung>,1,NoOp(sipcall eingehender Anruf <Benutzerkennung>)
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()
- Ersetzen Sie den Platzhalter
<Benutzerkennung>durch den Wert der bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.
Erklärungen
Wenn Ihre Rufnummer angerufen wird, spielt Asterisk die Datei hello-world ab und beendet den Anruf.
Eingehende Anrufe von extern an einen internen Benutzer weiterleiten
- Fügen Sie in der Datei den folgenden Dialplan-Kontext
from-externalhinzu:
- Eine Rufnummer (sipcall virtual pbx, sipcall free/classic/pro)
- Mehrere Rufnummern (sipcall sip trunk)
[from-external]
; sipcall-Rufnummer wird an den Endpoint 200 geroutet
exten = <Benutzerkennung>,1,Dial(PJSIP/200)
same = n,Hangup()
- Ersetzen Sie den Platzhalter
<Benutzerkennung>durch den Wert der bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.
Erklärungen
Der Abschnitt leitet den eingehenden Anruf an die interne Nebenstelle 200 weiter.
Dabei wird sichergestellt, dass nur Anrufe auf die hinterlegte Rufnummer (<Benutzerkennung>) verarbeitet werden.
Dies stellt sicher, dass die Nebenstelle keine Ghost Calls erhält.
[from-external]
; Die sipcall-Trunk-Hauptnummer wird an den Endpoint 200 geroutet
exten = <Benutzerkennung>,1,Dial(PJSIP/200)
same = n,Hangup()
; Der sipcall-Trunk-Teilnehmer DDI2 wird an den Endpoint 202 geroutet
exten = <DDI2>,1,Dial(PJSIP/202)
same = n,Hangup()
; Der sipcall-Trunk-Teilnehmer DDI3 wird an den Endpoint 203 geroutet
exten = <DDI3>,1,Dial(PJSIP/203)
same = n,Hangup()
- Ersetzen Sie den Platzhalter
<Benutzerkennung>durch den Wert der bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal. - Ersetzen Sie
<DDIx>durch eine Rufnummer aus Ihrem sipcall sip trunk im internationalen Format ohne+, z. B.:41442005000.
Erklärungen
- Der erste Abschnitt leitet den eingehenden Anruf der Trunk-Hauptnummer an die interne Nebenstelle
200weiter. - Der zweite Abschnitt leitet die Direktwahlnummer (Platzhalter
<DDI2>) an die interne Nebenstelle202weiter. - Der dritte Abschnitt leitet die Direktwahlnummer (Platzhalter
<DDI3>) an die interne Nebenstelle203weiter.
Dabei wird sichergestellt, dass nur Anrufe auf die hinterlegten Rufnummern (Benutzerkennung/DDI's) verarbeitet werden.
Weitere Informationen finden Sie in der Asterisk-Dokumentation.
Endgeräte an Asterisk registrieren
Um Endgeräte an Asterisk anzubinden, legen Sie interne "Endpoints" in der Datei pjsip.conf an.
In unserem Beispiel ist dies eine SIP-Nebenstelle mit der internen Rufnummer 200.
; interne Nebenstelle 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 = sicheres Passwort ; Passwort für die interne Nebenstelle
username = 200
[200]
type = aor
max_contacts = 2
Erklärungen
callerid: Dient als interner Wert: Der Anzeigename wird mit""definiert, die interne Rückrufnummer mit<>. Wenn der Anruf extern geht, wird die Caller ID mit der Benutzerkennung überschrieben.
Ausgehende Anrufe
In unserem Beispiel haben wir der internen Nebenstelle 200 den Kontext from-internal zugewiesen.
Damit Nebenstellen ausgehende Anrufe tätigen können, benötigen wir diesen Dialplan-Kontext in der Datei extensions.conf.
; ****** sipcall outbound calls RN <Benutzerkennung> ******
[from-internal]
include = notrufe
; ***** interne Anrufe *****
exten = _NXX,1,NoOp(Internal Call to User with 3 Digits)
same = n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30)
same = n,Hangup()
; ***** externe Anrufe *****
exten = _0X.,1,NoOp(Internal Call to external Numbers with 0)
same = n,Set(CALLERID(num)=<Benutzerkennung>)
same = n,Dial(PJSIP/${EXTEN}@sipcall)
exten = _+X.,1,NoOp(Internal Call to external Numbers with +)
same = n,Set(CALLERID(num)=<Benutzerkennung>)
same = n,Dial(PJSIP/${EXTEN}@sipcall)
- Ersetzen Sie den Platzhalter
<Benutzerkennung>durch den Wert der bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.
Erklärungen
include = notrufebindet den Dialplan-Kontext für Notrufnummern ein.- Im Abschnitt "interne Anrufe" werden Anrufe nach dem Muster
_NXX(dreistellig, Zahlen, erste Zahl ist keine 0 und keine 1) intern geroutet. - Falls das Muster nicht zutrifft, wird der zweite Abschnitt ausgeführt. Hier wird nach dem Muster
_0X.(Rufnummer mit führender0) extern über sipcall geroutet. - Wenn auch dies nicht zutrifft, wird der dritte Abschnitt ausgeführt. Hier wird nach dem Muster
_+X.(Rufnummer mit+am Anfang) extern über sipcall geroutet. - Im zweiten und dritten Abschnitt wird die Caller ID der Nebenstelle mit der Benutzerkennung überschrieben.
Weitere Möglichkeiten finden Sie in der Pattern-Matching-Dokumentation.
Notrufnummern
Für die Erreichbarkeit der Notrufnummern wird ein zusätzlicher Dialplan-Kontext benötigt. Dieser ist im Dialplan-Kontext [from-internal] mit der Zeile include = notrufe bereits eingebunden.
Diesen Dialplan-Kontext können Sie direkt in Ihren Dialplan kopieren:
; ****** Notrufe für RN <Benutzerkennung> ******
[notrufe]
; Europäische Notrufnummer
exten = 112,1,GoSub(notrufe-handler,${EXTEN},1)
; Polizeinotruf
exten = 117,1,GoSub(notrufe-handler,${EXTEN},1)
; Feuerwehrnotruf
exten = 118,1,GoSub(notrufe-handler,${EXTEN},1)
; Opferhilfenotruf
exten = 142,1,GoSub(notrufe-handler,${EXTEN},1)
; Dargebotene Hand
exten = 143,1,GoSub(notrufe-handler,${EXTEN},1)
; Sanität, Ambulanz
exten = 144,1,GoSub(notrufe-handler,${EXTEN},1)
; Vergiftungen
exten = 145,1,GoSub(notrufe-handler,${EXTEN},1)
; Jugendnotruf
exten = 147,1,GoSub(notrufe-handler,${EXTEN},1)
; Air Zermatt, Rettungsflugwacht
exten = 1410,1,GoSub(notrufe-handler,${EXTEN},1)
; Rega Rettungsflugwacht
exten = 1414,1,GoSub(notrufe-handler,${EXTEN},1)
; Air-Glaciers, Rettungsflugwacht
exten = 1415,1,GoSub(notrufe-handler,${EXTEN},1)
; EU-Hotline für Opfer von Gewalt gegen Frauen
exten = 116016,1,GoSub(notrufe-handler,${EXTEN},1)
; EU-Hotline für Kinder
exten = 116111,1,GoSub(notrufe-handler,${EXTEN},1)
; EU-Hotline für Opfer von Verbrechen
exten = 116006,1,GoSub(notrufe-handler,${EXTEN},1)
; EU-Hotline für vermisste Kinder
exten = 116000,1,GoSub(notrufe-handler,${EXTEN},1)
[notrufe-handler]
exten = _X.,1,NoOp(Calling ${EXTEN})
same = n,Set(CALLERID(num)=<Benutzerkennung>)
same = n,Dial(PJSIP/${EXTEN}@sipcall)
same = n,Hangup()
- Ersetzen Sie den Platzhalter
<Benutzerkennung>durch den Wert der bereitgestellten Konfigurationsdaten aus dem sipcall-Kundenportal.
Hinweise zum CLIP
sipcall unterbindet CLIP Spoofing. Stimmt die gesetzte Caller ID nicht mit den Kriterien überein, wird der CLIP überschrieben. Weitere Informationen dazu finden Sie unter der Funktionsbeschreibung "Rufnummernanzeige (CLIP)" im Abschnitt Ausgehende Anrufe.
Sicherheitshinweise
Achten Sie bei der Konfiguration auf folgende Punkte:
- Passwortsicherheit: Verwenden Sie für interne Endgeräte starke Passwörter.
- Fail2Ban: Es wird empfohlen, Fail2Ban, Crowdsec oder ähnliche Applikationen zu installieren, um Brute-Force-Angriffe zu verhindern.
- Firewall: Schränken Sie den externen Zugriff auf den SIP-Port ein, um Ghost Calls und SIP-Scanner bereits auf der Firewall zu blockieren. Die Liste unserer SIP-Server-IP-Adressen finden Sie hier.
- Kontexte trennen: Trennen Sie interne und externe Kontexte strikt, um unbefugtes Telefonieren nach aussen zu vermeiden.
Änderungen übernehmen
Um die Änderungen zu übernehmen, ohne das gesamte System neu zu starten, verwenden Sie folgende Befehle innerhalb der Asterisk-CLI:
pjsip reload(lädt die PJSIP-Konfiguration neu)dialplan reload(lädt den Dialplan neu)
Alternativ starten Sie den Dienst neu:
sudo asterisk -rx "core restart now"
Testen
Testen Sie nun Ihr VoIP-Telefon. Hierzu können Sie einen eingehenden sowie ausgehenden Anruf tätigen.
Anrufe auf andere sipcall-Rufnummern sind dabei ohne Guthaben möglich, Anrufe ins kostenpflichtige Fest- oder Mobilfunknetz erfordern einen ausreichenden Saldo auf Ihrem sipcall-Konto.
Sollten Sie Probleme haben, steht Ihnen unser Kundendienst sehr gerne zur Verfügung.
Weitere Ressourcen
Weitere Informationen über die Konfiguration von Asterisk finden Sie auf der Projekt-Homepage: