Asterisk PJSIP

Asterisk PJSIP

Diese Anleitung beschreibt die Einrichtung eines guest-voip.ch Trunks oder einer guest-voip.ch 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 guest-voip.ch (VoIP-Server, VoIP-Benutzername, VoIP-Passwort): Die Zugangsdaten finden Sie in Ihrem Mail von uns.

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 guest-voip.ch-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.

Datei: /etc/asterisk/pjsip.conf

; ******* TRANSPORT *******
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060

; ******* guest-voip.ch <VoIP-Benutzername> ******* 
[guest-voip.ch]
type = registration
transport = transport-udp
server_uri = sip:<VoIP-Server>:5060
client_uri = sip:<VoIP-Benutzername>@<VoIP-Server>
contact_user = <VoIP-Benutzername>
outbound_auth = guest-voip.ch
expiration = 60
endpoint = guest-voip.ch
line = yes
max_retries = 10000
fatal_retry_interval = 30
forbidden_retry_interval = 30

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

[guest-voip.ch]
type = auth
auth_type = digest
username = <VoIP-Benutzername>
password = <VoIP-Passwort>

[guest-voip.ch]
type = aor
contact = sip:<VoIP-Server>:5060

Ersetzen Sie die Platzhalter <VoIP-Benutzername>, <VoIP-Server> und <VoIP-Passwort> in diesen Beispielen jeweils mit mit den von uns gelieferten Angaben.
Starten Sie anschliessend 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:
Datei /etc/asterisk/extensions.conf

; ****** guest-voip.ch inbound calls  ******
[from-pstn-toheader]
exten = _X.,1,Set(to_user=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)})
same = n,GoTo(from-external,${to_user},1)

[from-external]
; guest-voip.ch-Rufnummer wird an den Endpoint 200 geroutet
exten = <VoIP-Benutzername>,1,Dial(PJSIP/200)
same = n,Hangup()

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.

Datei /etc/asterisk/pjsip.conf

; 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

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.

Datei /etc/asterisk/extensions.conf

; ****** guest-voip.ch outbound calls ******
[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)=<VoIP-Benutzername>)
same = n,Dial(PJSIP/${EXTEN}@guest-voip.ch)

exten = _+X.,1,NoOp(Internal Call to external Numbers with +)
same = n,Set(CALLERID(num)=<VoIP-Benutzername>)
same = n,Dial(PJSIP/${EXTEN}@guest-voip.ch)

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:

Datei /etc/asterisk/extensions.conf

; ****** Notrufe ******
[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)

[notrufe-handler]
exten = _X.,1,NoOp(Calling ${EXTEN})
same = n,Set(CALLERID(num)=<VoIP-Benutzername>)
same = n,Dial(PJSIP/${EXTEN}@guest-voip.ch)
same = n,Hangup()

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 VoIP-Server-IP-Adressen finden Sie hier.
  • Kontexte trennen: Trennen Sie interne und externe Kontexte strikt, um unbefugtes Telefonieren nach aussen zu vermeiden.