Asterisk / pjsip transport tcp oder tls: Mehrere Nummern zu einem Provider registrieren

gehtdoch

Mitglied
Mitglied seit
3 Feb 2019
Beiträge
209
Punkte für Reaktionen
13
Punkte
18
Es gibt vermutlich öfter die Situation, wo man mehrere Nummern beim gleichen Provider registrieren muss via tcp oder tls. So z.B. bei der Telekom AllIP (MagentaZuhause). Das klingt erstmal ganz einfach - ist es aber im Detail dann doch nicht - siehe z.B. hier.

Wie ist das Default-Verhalten von Asterisk (zumindest in den Versionen 16,18), speziell bei der Nutzung von FreePBX? Einem Trunk muss ein transport zugewiesen werden. V.a. bei FreePBX verwendet man da dann den vorhandenen transport. Für jeden Trunk. Was dazu führt, dass bei gleichen Destinations nur eine einzige, statische tcp-Verbindung verwendet wird, über die das komplette Signaling für alle registrierten Trunks durchgeführt wird (sowohl für ein- als auch für ausgehende Calls). Solange der Provider dieses Vorgehen unterstützt bzw. man selbst alle relevanten Einstellungen korrekt durchgeführt hat, ist das dann ja auch ok.

Was ist aber, wenn die Unterstützung nicht vorhanden ist oder die Thematik nur rudimentär funktioniert? Wie z.B. bei AllIP der Telekom: zunächst geht es per Default ganz gut, aber im Detail gibt es dann doch unter bestimmten Umständen Probleme, z.B. bei der reRegistrierung oder auch beim unregister einer Nummer. Bei letzterem kappt die Telekom AllIP-Plattform nämlich einfach die Verbindung und die bestehenden Nummern hängen plötzlich in der Luft bzw. Asterisk führt zwar einen Verbindungsneuaufbau durch. Trotzdem nicht immer schön ... .

Das Verhalten in Asterisk / PJSIP ist also wie folgt: Alle Trunks, die man einem transport zugeordnet hat und die zur gleichen Destination gehen, werden in einer einzigen Verbindung abgearbeitet.

Wie bringt man Asterisk / pjsip dazu, für mehrere Trunks an die gleiche Destination tatsächlich individuelle Verbindungen aufzumachen? Indem man mehrere, an sich gleiche transports, aber mit unterschiedlichem Namen, anlegt und diese dann dem jeweiligen Trunk zuordnet. Mehrere transports anzulegen ist v.a. in FreePBX in der GUI nicht vorgesehen, d.h., da muss man über den Config Editor gehen und im korrekten File die zusätzlichen transports anlegen. Z.B. für tls die folgenden beispielhaften drei transports in pjsip.transports_custom.conf:

Code:
[trunk1]
type=transport
protocol=tls
bind=0.0.0.0:0
ca_list_file=/etc/pki/tls/certs/ca-bundle.crt
method=tlsv1_2
verify_server=yes
allow_reload=no
tos=0xb8
cos=3

[trunk2]
type=transport
protocol=tls
bind=0.0.0.0:0
ca_list_file=/etc/pki/tls/certs/ca-bundle.crt
method=tlsv1_2
verify_server=yes
allow_reload=no
tos=0xb8
cos=3

[trunkn]
type=transport
protocol=tls
bind=0.0.0.0:0
ca_list_file=/etc/pki/tls/certs/ca-bundle.crt
method=tlsv1_2
verify_server=yes
allow_reload=no
tos=0xb8
cos=3
Nachdem Asterisk durchgestartet wurde, verifzieren, dass die neuen transports korrekt angelegt wurden mit
Code:
asterisk -r
pjsip show transports
...
pjsip show transport trunk1
CLI> pjsip show transport t-432 

Transport:  <TransportId........>  <Type>  <cos>  <tos>  <BindAddress....................>
==========================================================================================

Transport:  trunk1                   tls      3    184  0.0.0.0:5061

 ParameterName              : ParameterValue
 =============================================================
 allow_reload               : false
 async_operations           : 1
 bind                       : 0.0.0.0:5061
 ca_list_file               : /etc/pki/tls/certs/ca-bundle.crt
 ca_list_path               : 
 cert_file                  : 
 cipher                     : 
 cos                        : 3
 domain                     : 
 external_media_address     : 
 external_signaling_address : 
 external_signaling_port    : 0
 local_net                  : 
 method                     : tlsv1_2
 password                   : 
 priv_key_file              : 
 protocol                   : tls
 require_client_cert        : No
 symmetric_transport        : false
 tos                        : 184
 verify_client              : No
 verify_server              : Yes
 websocket_write_timeout    : 100
Auf Betriebssystemebene verifizieren, dass keine zusätzlichen Listener aufgemacht wurden:
Code:
netstat -tulpn | grep asterisk | grep tcp
[[email protected] ~]# netstat -tulpn | grep asterisk
tcp        0      0 0.0.0.0:5061            0.0.0.0:*               LISTEN      28097/asterisk      
tcp        0      0 0.0.0.0:5038            0.0.0.0:*               LISTEN      28097/asterisk
Im nächsten Schritt muss nun der jeweilige transport einem trunk zugeordnet werden. Da FreePBX es nicht vorsieht, selbst angelegte transports über die GUI einem Trunk zuzuweisen, muss man hier einen Kniff anwenden, um zum Ziel zu gelangen. Man editiert im Config Editor die Datei pjsip.registration_custom_post.conf wie folgt:
Code:
[eigener_angelegter_trunkname](+type=registration)
transport=trunk1

[zweiter_angelegter_trunkname](+type=registration)
transport=trunk2

...
Auch die endpoint-Konfiguration in pjsip.endpoint_custom_post.conf muss angepasst werden:
Code:
[eigener_angelegter_trunkname](+type=endpoint)
transport=trunk1

[zweiter_angelegter_trunkname](+type=endpoint)
transport=trunk2

...
Auf diese Art und Weise wird die Standardkonfiguration von FreePBX für die gegebenen Optionen überschrieben.

Als Funktionskontrolle folgendes ausführen:
Code:
asterisk -r
pjsip show endpoint eigener_angelegter_trunkname
...
transport                          : trunk1
...
pjsip show registration trunk1
...
 transport                : trunk1
Auf Betriebssystemebene kontrollieren mit
Code:
netstat -n | grep 5061
Ich habe hier auf 5061 gesucht, weil ich mit TLS arbeite. Wer unverschlüsselt unterwegs ist, nimmt 5060. Hier müssen nun genauso viele Einträge vorhanden sein, wie Trunks angelegt sind zur entsprechenden Destination.

Achtung: hier wird nur das grundsätzliche Vorgehen dargestellt - security relevante Punkte sind zu beachten und entsprechend anzugehen! Dieses Verhalten habe ich verifiziert mit Asterisk 18.0 - ich gehe aber davon aus, dass das auch mit 16 funktionieren sollte.