Im ersten und zweiten Teil einer Artikelserie haben wir herausgefunden, wie eine IP-PBX (IP-PBX) auf einem VPS von RuVDS unter Ubuntu installiert und grundlegende Funktionen mithilfe des Kanaltreibers chan_sip konfiguriert werden. Dieser Ansatz ist veraltet und die Unterstützung von chan_sip wird in zukünftigen Versionen von Asterisk eingestellt. Verwenden Sie stattdessen besser die Open-Source-Multimedia-Bibliothek PjSIP. Trotz der dramatischen Unterschiede in den Konfigurationsdateien ist der Übergang nicht so schwierig, wie es auf den ersten Blick erscheinen mag.
Was ist PjSIP?
Es ist wichtig zu verstehen, dass PjSIP kein neues Protokoll ist, sondern eine ganze Bibliothek für die Arbeit mit einem Stapel von Protokollen, die Sprachkommunikation bereitstellen: SIP, RTP, SDP, STUN usw. Es handelt sich um eine ganze Reihe von Modulen, die sich in der Konfigurationsdatei pjsip.conf widerspiegeln (sie ersetzt die herkömmliche sip.conf). Die Datei ist in Abschnitte unterteilt, und das Modul res_pjsip arbeitet hauptsächlich damit, wobei jeder Abschnitt die Konfiguration eines Objekts definiert. Abschnittsnamen werden traditionell in eckige Klammern gesetzt, und ein Abschnitt muss die Konstruktion "type =" enthalten, die seinen Typ definiert.
Die Arten von Abschnitten können wie folgt sein:
ENDPOINT - Analog zum Peer in sip.conf, der die Optionen für das SIP-Protokoll und die Interaktion mit AOR, AUTH und TRANSPORT definiert. Notwendigerweise mit mindestens einem AOR-Abschnitt verbunden;
AOR- beschreibt, wie man ENDPOINT kontaktiert;
TRANSPORT - In diesem Abschnitt werden die Protokolleinstellungen der Transportschicht, Websockets und Verschlüsselungsmethoden (wie im Allgemeinen in sip.conf beschrieben) beschrieben. Kann eine für verschiedene ENDPOINTs sein oder für einen Punkt eindeutig sein;
REGISTRIERUNG - verantwortlich für ausgehende Registrierungen, z. B. Amtsleitungen zu Anbietern;
AUTH - Enthält Optionen und Berechtigungen für eingehende und ausgehende Registrierungen. Damit verbunden sind ENDPOINT und REGISTRIERUNGEN;
IDENTIFY - hier können Sie die Quell-IP für ENDPOINT festlegen.
ACL - wird von res_pjsip verwendet, um eingehende Verbindungen zu steuern, die nicht an ENDPOINT gebunden sind.
DOMAIN_ALIAS - Domain-Aliase;
KONTAKT- muss den SIP-URI in Dialplan nicht explizit angeben;
System - Systemoptionen;
Global - globale Optionen;
Abschnittsnamen können in den meisten Fällen beliebig sein, aber beispielsweise müssen ENDPOINT und AOR identisch mit dem SIP-URI-Header benannt werden.
Unsere Hilfe kann kaum als erschöpfend bezeichnet werden, da hinter den Kulissen viele interessante Chips zurückbleiben, wie beispielsweise der PjSIP-Konfigurationsassistent: Während wir über die Migration in eine neue Bibliothek mit wenig Blut sprechen. Sie können sich später mit den Nuancen und Feinheiten befassen.
Konvertieren Sie sip.conf in pjsip.conf
Aufgrund der Modularität ist die Struktur der Konfigurationsdatei pjsip.conf in einer dünnen Schicht über viele Abschnitte verteilt - sie ist viel komplexer als die gute alte sip.conf. Asterisk-Entwickler dachten an einfache Administratoren und erstellten ein Skript zum Konvertieren. Es ist in Python geschrieben, und wenn Sie Software aus dem Quellcode erstellen, befindet es sich bereits in der Distribution: im Verzeichnis contrib / scripts / sip_to_pjsip / . Wir haben Asterisk von einem Binärpaket installiert, das im Ubuntu-Repository enthalten ist, daher mussten die Skripte von GitHub heruntergeladen werden.
Obwohl sich das Format der Konfigurationsdateien für verschiedene Versionen von IP-PBX nicht wesentlich geändert hat, ist es besser, Skripte aus der von Ihnen installierten Asterisk-Version anstelle der neuesten Standardeinstellung auszuwählen - in unserem Fall 16.2.

Die Asterisk-Version kann in der IP-PBX-Konsole mit dem Befehl show show version angezeigt werden .
Sie benötigen alle Python-Dateien aus dem Verzeichnis ontrib / scripts / sip_to_pjsip / im GitHub-Repository. Sie müssen zu einem lokalen Verzeichnis hinzugefügt werden, in das Verzeichnis mit Asterisk-Konfigurationen (normalerweise / etc / asterisk) wechseln und das Skript sip_to_pjsip.py mit Superuser-Berechtigungen ausführen . Die Hauptaufgabe besteht darin, die Eingabedatei sip.conf zu lesen und eine neue pjsip.conf zu erstellen (Einzelheiten finden Sie im Asterisk-Wiki ).

Das Skript erstellt pjsip.conf und muss dann manuell poliert werden. Wenn Sie Asterisk gemäß unseren Artikeln installiert haben, müssen Sie auch das Laden von Modulen in /etc/asterisk/modules.conf konfigurieren und den Aufruf der Dial-Anwendung in Dialplan ( /etc/asterisk/extensions.conf ) ändern .
Die vom Konverter erstellte Datei /etc/asterisk/pjsip.conf erwies sich in der Praxis als nicht funktionsfähig:
pjsip.conf
;--
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[general]
allowoverlap = no
[office]
call-limit = 2
[sipnet]
remotesecret =
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--;
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0
[sipnet]
type = aor
contact = sip:@sipnet.ru
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru
[sipnet]
type = endpoint
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user =
from_domain = sipnet.ru
aors = sipnet
[1001]
type = aor
max_contacts = 1
[1001]
type = auth
username = 1001
password =
[1001]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid = <1001>
auth = 1001
outbound_auth = 1001
aors = 1001
[acl]
type = acl
permit = XXX.XXX.XXX.XXX
deny = 0.0.0.0/0.0.0.0
[1002]
type = aor
max_contacts = 1
[1002]
type = auth
username = 1002
password =
[1002]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid = <1002>
auth = 1002
outbound_auth = 1002
aors = 1002
Die Syntax ist unkompliziert, Details finden Sie im Asterisk-Wiki . Es ist eine manuelle Bearbeitung erforderlich, um die Konfigurationsdatei sauber zu machen.
Korrigiert /etc/asterisk/pjsip.conf (wie in sip.conf können Vorlagen darin verwendet werden):
Korrigiert /etc/asterisk/pjsip.conf
;===============TRANSPORT
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0
;===============ACL
[acl]
type = acl
deny = 0.0.0.0/0.0.0.0
permit = XXX.XXX.XXX.XXX
;===============SIPNET TRUNK
[sipnet]
type = registration
transport = transport-udp
outbound_auth = sipnet
server_uri = sip:sipnet.ru
client_uri = sip:@sipnet.ru
retry_interval = 60
[sipnet]
type = auth
auth_type = userpass
password =
username =
[sipnet]
type = aor
contact = sip:@sipnet.ru
[sipnet]
type = endpoint
transport = transport-udp
; Dialplan
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user =
from_domain = sipnet.ru
outbound_auth=sipnet
aors = sipnet
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru
;===============USER TEMPLATES
[endpoint-template](!)
type = endpoint
transport = transport-udp
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
[auth-template-userpass](!)
type = auth
auth_type = userpass
[aor-template-single-reg](!)
type = aor
; PjSIP
max_contacts = 1
;===============User 1001
[1001](endpoint-template)
auth = auth1001
aors = 1001
callerid = <1001>
[auth1001](auth-template-userpass)
username = 1001
password =
[1001](aor-template-single-reg)
;===============User 1002
[1002](endpoint-template)
auth = auth1002
aors= 1002
callerid = <1002>
[auth1002](auth-template-userpass)
username = 1002
password =
[1002](aor-template-single-reg)
Mit Vorlagen gibt es weniger Papierkram, aber es gibt auch eine interessantere Möglichkeit, das Leben des Administrators zu vereinfachen - den Konfigurationsassistenten. Vielleicht ist dies einer der bequemsten PjSIP-Tricks, auf die wir im nächsten Artikel eingehen werden.
Dialplan umschreiben
Der einfachste Teil: Es reicht aus, SIP im Anruf der Dial-Anwendung durch PJSIP zu ersetzen. Während wir den einfachsten Test-Dialplan aus dem vorherigen Artikel leicht modifiziert haben , werden wir uns später mit komplexeren Dingen befassen .
Konfigurationsdatei /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no
priorityjumping=no
autofallthrough=yes
clearglobalvars=no
;
[default]
exten => _X.,1,NoOp()
same => n,Busy()
same => n,HangUp()
; homeoffice
[homeoffice]
;
exten => _1XXX,1,Dial(PJSIP/${EXTEN})
; SIPNET
exten => _.7XXXXXXXXXX,1,Dial(PJSIP/${EXTEN:1}@sipnet)
; sipnet-trunk, SIPNET
[sipnet-trunk]
;
Der Übergang von chan_sip zu PjSIP war nicht besonders schwierig, erforderte jedoch einiges an manueller Arbeit. Es ist uns nicht gelungen, die Konfiguration automatisch zu konvertieren: Das Skript erzeugte eine nicht funktionsfähige Version, die manuell neu geschrieben werden musste. Im nächsten Artikel werden wir uns den Konfigurationsassistenten ansehen und schließlich den Wählplan erweitern, um eingehende Anrufe zu empfangen, Konferenzen zu organisieren und andere Anrufweiterleitungsaufgaben zu lösen.
