Software PBX Asterisk

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.

Inhaltsverzeichnis

Eigenschaften meines Asterisk Servers:

  • Verbindung zu 2 weiteren Asterisk Instanzen via IAX2 Protokoll
  • integrierte Blacklist zur Abwehr von Spam Anrufen, Hinzufügen oder Löschen von Nummern per Kurzwahl möglich (PIN-geschützt)
  • "Sonderbehandlung" für erkannte SPAM-Anrufe
  • Ein Testfax kann mit einer Kurzwahl an eine beliebige Nummer geschickt werden
  • ein Fax kann per eMail geschickt werden (PDF oder PNG/JPG möglich)
  • 2 feste aussenliegende Nebenstellen sowie mobile Nebenstellen
  • teilweise Integration in meine Heimautomation mit FHEM
  • Benachrichtigungen mittels XMPP über entgangene Anrufe und erhaltene SPAM-Anrufe
  • Transport- und Gesprächsverschlüsselung zu Sipgate und Deutsche Telekom Trunks
  • Morsetrainer
  • diverse Radiostreams und Podcasts
  • Wettervorhersage anhand der Postleitzahl
  • testweise Kurzwahlen zu xmpp-Adressen für Audiocalls
  • Anbindung von sip2sip und antisip

zum Anfang der Seite

Konfiguration für Sipgate mit Gesprächs- und Transportverschlüsselung

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!!!

zum Anfang der Seite

Dt. Telekom Magenta Zuhause mit Transport- und Gesprächsverschlü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:

  • transport (Transportweg)
  • registration (Registrierung beim Provider)
  • auth (Authentifizierung)
  • endpoint (Eigenschaften für ankommende u. abgehende Gespräche)
  • aor
  • identify (Sicherheit, um unberechtigte SIP-Anfragen zu unterbinden)

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.

zum Anfang der Seite

Konfiguration der Transport- und Gesprächsverschlüsselung für Clients

17.01.2024

Allgemein

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)

Vorbereitung

  • Portweiterleitungen im Router auf die IP des Asterisk-Servers
    • 1 SIP-Port (TCP), der in der pjsip.conf unter Transport steht (hier: 5088)
    • pro Gespräch 2 UDP Ports für die Gesprächsdaten, diese sind in der rtp.conf anzugeben
  • Zertifikate über let's encrypt besorgen, um den Server über TLS ansprechen zu können

pjsip.conf

1. Transportverschlüsselung (TLS)
[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
  • cert_file: Let's encrypt Fullchain Datei für den DynDNS-Namen
  • priv_key_file: Let's encrypt Key Datei für den DynDNS-Namen
  • bind: Adresse des Asterisk, gefolgt von dem Port, auf den Clients connecten sollen
  • local_net: Hier kommt das lokale Netz sowie das localhost Netz rein
  • external_*: die aktuelle externe IP-Adresse des Anschlusses, muss durch ein Script automatisch bei IP-Wechsel geändert werden
2. Gesprächsverschlüsselung / Client-Konfiguration
; ==== 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

  • media_encryption: wir wollen RSTP mit SDES machen
  • media_encryption_optimistic: falls die Gegenseite keine Gesprächsverschlüsselung unterstützt, trotzdem verbinden ohne Gesprächs-Verschlüsselung
  • disallow, all: Hier kommen die Codecs rein, die die Clients nachher nutzen sollen, in der hier angegebenen Reihenfolge wird abgearbeitet (G722 zuerst, dann u-LAW, dann Opus)
  • rewrite_contact: Interne Adressen werden durch die externe ersetzt (wichtig für NAT)
  • direct_media: Clients können nur über Asterisk den Stream schicken, nicht untereinander
  • force_rport, rtp_symmetric: Nutze die in der rtp.conf angegebenen RTP-Ports
3. Rest der Client-Konfiguration
; ==== 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.

zum Anfang der Seite

Diverse Softclients (für Gesprächs- u. Transportverschlüsselung)

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

zum Anfang der Seite