13.06.2024
Ich selber betreibe aktiv einen Asterisk Server (z. Zt. in Version 20.5.1) unter Debian Bookworm in meinem privaten LAN hinter einem NAT-Router. Hier möchte ich einige Konfigurationen teilen, wo ich persönlich lange nach suchen musste, da es Konfigurationen so entweder noch gar nicht gab oder sie veraltert waren oder schlicht nicht funktionierten. Die Konfigurationen beziehen sich alle auf PJSIP, da dies laut den Entwicklern von asterisk die alte sip.conf ersetzen soll. Eventuell kann es der eine oder andere brauchen. Für mich ist er eine Art "Dauerbaustelle", wo ich immer mal wieder etwas ergänze oder ausprobiere, ähnlich wie bei meiner Heimautomation.
Sämtliche hier vorgestellten Konfigurationen sind bei mir im Wirkbetrieb und geprüft nach bestem Wissen und Gewissen. Trotzdem übernehme ich keinerlei Gewährleistung oder Garantie, dass das beim Nachmachen funktioniert.
16.06.2024
Bei der Konfiguration für Sipgate habe ich mich für den Weg über die pjsip_wizard.conf Datei entschieden. Dieser Weg ist etwas übersichtlicher als die klassische PJSIP-Konfiguration.
Als erstes müssen wir einen eigenen Transport erstellen (das sollte man bei TLS für jede registrierte Rufnummer / jedes registrierte Konto machen). Diese habe ich in eine eigene Datei ausgelagert und pjsip-tls-transports.conf genannt. Diese Datei muss dann in der pjsip.conf eingebunden werden mittels dem Befehl #include pjsip-tls-transports.conf
. Der Inhalt sieht wie folgt aus, das lokale Netz mit local_net ist natürlich anzupassen, ggf. auch der Pfad zur Datei, die sämtliche ca-Zertifikate enthält:
[transport-sipgate-tls]
type = transport
protocol = tls
bind = 0.0.0.0:0
local_net=192.168.2.0/24
ca_list_file = /etc/ssl/certs/ca-certificates.crt
method = tlsv1_2
verify_server = yes
allow_reload = no
tos = 0xb8
cos = 3
Die Datei pjsip_wizard.conf wurde für sipgate um folgendes ergänzt:
[trunk_defaults](!)
type = wizard
sends_auth = yes
sends_registrations = yes
endpoint/allow_subscribe = no
endpoint/allow = !all,g722,alaw
endpoint/rewrite_contact = yes
endpoint/rtp_symmetric = true
endpoint/direct_media = no
endpoint/language = de
aor/qualify_frequency = 30
registration/expiration = 1800
Dieser Abschnitt ist ein sogenanntes Template (oder eine Vorlage), auf der man sämtliche anderen Konten aufbauen kann, ohne sich mit den Anweisungen wiederholen zu müssen. Erkennbar ist dies an dem (!) hinter der Konfigurations-Definition.
Nachfolgend die Konfiguration für ein sipgate-Konto. Die Kontodaten müssen natürlich angepasst werden, ebenso der entsprechende Kontext, in dem ankommende Gespräche abgefangen werden sollen. Die benutzten Server-Bereiche in der Identify-Sektion konnte ich den Hilfeseiten von Sipgate entnehmen. Zu beachten ist, dass ankommende Gespräche in die s-Extension fallen, sobald das Konto über den PJSIP-Wizard erstellt worden ist. Ob man dies gezielt ändern kann, weiß ich nicht. Die Sipgate-Konfiguration "erbt" die Einstellungen des Abschnitts trunk_defaults
;==== sipgate Config ====
[sipgate](trunk_defaults)
transport = transport-sipgate-tls
endpoint/context = sipgate-in
remote_hosts = sipgate.de
accepts_registrations = no
endpoint/send_rpid = yes
endpoint/send_pai = yes
endpoint/from_user = sipgate-benutzername
endpoint/from_domain = sipgate.de
client_uri_pattern = sip:sipgate-benutzername@sip.sipgate.de
server_uri_pattern = sip:sip.sipgate.de
contact_pattern = sip:sipgate.de
endpoint/force_rport = true
endpoint/incoming_call_offer_pref = remote
outbound_auth/username = sipate-benutzername@sipgate.de
outbound_auth/password = sipgate-sip-passwort
endpoint/outbound_proxy = sip:sip.sipgate.de\;lr
aor/outbound_proxy = sip:sip.sipgate.de\;lr
registration/outbound_proxy = sip:sip.sipgate.de\;lr
identify/match = 217.10.64.0/20,217.116.112.0/20,212.9.32.0/19
endpoint/disallow = all
endpoint/allow = g722,ulaw,alaw
endpoint/media_encryption = sdes
Wie man erkennen kann, ist die Medien-Verschlüsselung mittels sdes aktiviert. Mit dieser Konfiguration sollte es nun möglich sein, Transport- und Gesprächsverschlüsselung über sipgate einzurichten. ACHTUNG: Die Gesprächsverschlüsselung gilt nur bis zum Endpunkt bei sipgate. Es ist noch keine Ende-zu-Ende Verschlüsselung!!!
19.06.2024
Die Konfiguration, um einen Dt. Telekom Magenta Zuhause Anschluss über den Asterisk an's Laufen zu bekommen, beruht, im Gegensatz zur oben beschriebenen Sipgate Konfiguration, nicht auf der PJSIP-Wizard Datei, sondern wird komplett in der pjsip.conf Datei hinterlegt. Ob eine funktionierende Konfiguration mit dem Wizard erstellt werden kann, habe ich nicht ausprobiert, sollte aber grundsätzlich möglich sein. Wie schon in der Konfiguration bei Sipgate erwähnt, sollte für jede registrierte Rufnummer ein eigener Transport definiert werden.
Wie bei jedem Trunk (d. h. Verbindung zu einem Telefonanbieter) und pjsip bei Asterisk gibt es 6 verschiedene Definitonsbereiche. Diese lauten:
Nachfolgend meine (anonymisierte) Konfiguration für die virtuelle Rufnummer 0228-123456:
[transport-telekom-tls-1]
type = transport
protocol = tls
bind = 0.0.0.0:0
local_net=192.168.2.0/24
ca_list_file = /etc/ssl/certs/ca-certificates.crt
method = tlsv1_2
verify_server = yes
allow_reload = no
tos = 0xb8
cos = 3
;==== Templates ====
[regt](!)
retry_interval = 60
fatal_retry_interval = 0
forbidden_retry_interval = 10
max_retries = 10000
expiration = 660
auth_rejection_permanent = yes
line = yes
[endpt](!)
context = telekom-in
disallow = all
allow = g722,alaw,ulaw
send_connected_line=false
from_domain = tel.t-online.de
language = de
user_eq_phone = no
t38_udptl = no
t38_udptl_ec = none
fax_detect = no
trust_id_inbound = no
t38_udptl_nat = no
direct_media = no
rewrite_contact = yes
rtp_symmetric = yes
dtmf_mode = rfc4733
tos_audio=0xb8
rtp_timeout=120
media_encryption = sdes
[telekom_123456_reg](regt)
type = registration
transport = transport-telekom-tls-1
outbound_auth = telekom_123456_auth
server_uri = sip:tel.t-online.de
client_uri = sip:+49228123456@tel.t-online.de
contact_user = +49228123456
endpoint = telekom_123456
[telekom_123456_auth]
type = auth
auth_type = userpass
password = irgend:etwas-0001@tel.t-online.de
username = +49228123456
[telekom_123456](endpt)
type = endpoint
transport = transport-telekom-tls-1
message_context = messaging
outbound_auth = telekom_123456_auth
aors = telekom_123456_aor
from_user = +49228123456
contact_user = +49228123456
[telekom_123456_aor]
type = aor
contact = sip:+49228123456@tel.t-online.de
qualify_frequency=240
remove_existing=yes
[telekom_123456_identify]
type = identify
endpoint = telekom_123456
match = tel.t-online.de
Nachfolgend noch ein paar Hinweise: Solange die Registrierung am heimischen Anschluss (zu dem die Rufnummern gehören) erfolgt, ist das Passwort in der in der auth-Sektion tatsächlich egal, da die Telekom hier einen anderen Weg zur Überprüfung des Benutzers benutzt.
Die Gesprächsverschlüsselung erkennt man an der Option media_encryption = sdes
. Diese gilt, genau wie bei der Sipgate-Konfiguration auch, zwischen Asterisk und (in diesem Falle) der Telekom und darf nicht mit einer Ende-zu-Ende Verschlüsselung verwechselt werden!
Auch hier gilt: local_net ist auf das lokale Netz anzupassen, der Pfad für die ca_list_file Datei ist evtl. auch anzupassen (das ist die Datei, in der sämtliche Zertifizierungsstellen aufgeführt sind).
Die Sektionen regt und endpt sind wieder Vorlagen (Templates), um sich entsprechende (sich wiederholende) Einträge bei den einzelnen Rufnummern sparen zu können.
Als Codecs benutze ich G722 (das entspricht HD-Voice) sowie alaw (das ist die Generation vor HD-Voice, normale Gesprächsqualität) sowie ulaw (ob das von Telekom unterstützt wird, weiß ich nicht, da es immer schon vorher eine Einigung auf G722 gibt).
Bei Problemen lohnt es sich immer mal, auf der Asterisk Kommandozeile den SIP-Logging einzuschalten. Für PJSIP geht das mit dem Befehl pjsip set logger on
. Dabei ist zu beachten, dass es bei mehreren Rufnummern durchaus einige Logging-Meldungen gibt, so dass entsprechende Meldung erst zugeordnet werden müssen. Sobald man die gewünschten Informationen hat, kann das Logging mit pjsip set logger off
wieder beendet werden.
17.01.2024
Mit der nachfolgenden Konstellation ist es mir gelungen, verschlüsselte Telefonate zu führen, unabhängig vom angebundenen Netz (Mobilfunk, Heimnetz hinter NAT, Freifunk, lokales Netz)
[transport-tls]
type=transport
protocol=tls
bind=192.168.178.23:5088
cert_file=/etc/asterisk/certs/asterisk.cert
priv_key_file=/etc/asterisk/certs/asterisk.key
method=tlsv1_2
local_net = 192.168.178.0/24
local_net = 127.0.0.1/32
external_media_address=123.234.123.23
external_signaling_address=123.234.123.23
; ==== Templates ====
[ext-srtp](!)
media_encryption=sdes
media_encryption_optimistic=yes
disallow=all
allow=g722,ulaw,opus
rewrite_contact=yes
direct_media=no
force_rport=yes
rtp_symmetric=yes
Diese Vorlage wird für alle Clients, die nachher verschlüsselt arbeiten sollen, 1x erstellt
; ==== Teilnehmer ====
[1000](ext-srtp)
type=endpoint
context=from-internal
callerid="Tester 1"
auth=1000
aors=1000
[1000]
type=auth
auth_type=userpass
password=strenggeheim
username=1000
[1000]
type=aor
max_contacts=2
Der Rest der Client-Konfiguration ist identisch zum nicht-verschlüsselten Client. Dabei entspricht die 1000 der "Nebenstellennummer". Wichtig ist, die Vorlage (ext-srtp) dahinter zu setzen, damit das Template aus der vorherigen Sektion übernommen wird. Der Rest ist die Authentifizierung sowie die Anzahl der maximal gleichzeitigen Registrierungen.
Diese Tabelle ist vom Stand 19.12.2023 und gibt meine persönlichen Erfahrung speziell in Bezug auf die Transport- und Gesprächsverschlüsselung wider.
Den aktuellen Stand finde ich nicht sehr befriedigend.
Mein aktueller Favorit ist Sipnetic, vom GUI her ist Zoiper klar vorne, aber für Verschlüsselung nur abgehend brauchbar.
Clientname | Plattform | Tauglichkeit / Auffälligkeiten |
---|---|---|
Zoiper 2.22.3 | Android | gut konfigurierbar, abgehende Gespräche funktionieren einwandfrei, ankommende Gespräche funktionieren gar nicht und werfen je nach Gegenseite unterschiedliche Fehlermeldungen. Sobald die Gesprächsverschlüsselung entfernt wird, funktionieren beide Richtungen. |
SessionTalk 6.1 | Android | Funktioniert ankommend und abgehend ohne Probleme, GUI ist Geschmackssache |
Sipnetic/1.0.52 | Android | Anfangs hatte die Registrierung genau 1x funktioniert, danach nicht mehr, warum weiß ich nicht. Derzeit funktioniert sie wieder und es funktionieren abgehende und ankommende Gespräche. Schickeres GUI als SessionTalk. Läuft sowohl auf Handy als auch auf Tablet. Manchmal werden Gespräche nicht als beendet erkannt. Gut: Man erkennt auf Anhieb die Transportverschlüsselung und während des Gesprächs die Gesprächsverschlüsselung |
LinPhone 5.1.4 | Android | Trotz erfolgreichem Verbindungsaufbaus werden im Asterisk CLI Warnungen bzgl. des Zertifikat-Handshakes geworfen. GUI stark gewöhnungsbedürftig. Gut: In der rechten oberen Ecke sieht man während des Gesprächs, ob Verschlüsselung aktiviert ist |
baresip+ | Android | hier ist mir die Konfiguration nicht gelungen |