Asterisk Vodafone NGN Trunk
Back to current versionRestore this version

Was ist ein Vodafone NGN Trunk? #

Zur Ersatz unseres alten ISDN Anlagenanschluss (also einen Firmenanschluss mit Durchwahlen) wurde uns in 2021 von Vodafone nahegelegt, auf einen sogenannten VoIP Anschluss umzustellen. Inzwischen habe ich - durch intensive Suche nach Hilfe im Internet - gelernt, das es da ziemlich viele verschiedene Varianten von Anschlüssen und entsprechenden Konfigurations-Schemata aus der langen Geschichte von Vodafone und Arcor und Unitymedia und wasweissich gibt, die alle durch das Internet geistern.

Was ich hier habe, ist etwas, das man im Internet am ehesten als NGN Trunk bezeichnet (Next Generation Network). Ein Trunk bezeichnet bei Telefonanlagen immer einen Anschluss eines Netzbetreibers (also die Asterisk-Verbindung nach draussen ins Telefonnetz.) Im Grunde meint NGN hier wohl so etwas wie einen VoIP-Anschluss auf Speed. Die Telefongesellschaft bietet (angeblich) erweiterte Quality of Service, die einem Festnetzanschluss vergleichbar sein soll, das Übertragungsverfahren ist aber letztlich eine ganz normale SIP-Verbindung (wie bei VoIP üblich). Wie man so liest, dient das letztlich auch dazu, mit jedem Telefonanschluss direkt einen Internetanschluss mitzuverkaufen...

In den mir von Vodafone zugesandten Anschlussdaten steht auch eine SIP-Domain, die auf ngn.vodafone.de endet. Das scheint mir ein aktuelles charakteristisches Merkmal dieser Art von Anschluss zu sein.

Welche Unterschiede ergeben sich daraus für Asterisk? #

Allerdings ist die Konfiguration nun auch etwas anders. Dank dem sehr guten Buch Asterix - The Definitive Guide habe ich erst verstanden, das es Provider gibt, die im Business-Bereich Anschlüsse einsetzen, die sich etwas anders verhalten als das, was man normalerweise in Anleitungen über SIP-Anschlüsse so liest:

konkrete Konfigurationsdateien #

Wie können SIP-Geräte in Asterisk konfiguriert werden und wie mache ich das hier? #

Im Laufe der Entwicklung von Asterisk hat sich die Konfiguration von SIP-Anschlüssen stark gewandelt. Hier habe ich viel gelernt...

sip.conf #

In klassischen Asterisk-Versionen gab es ein SIP-Modul, das durch eine Datei namen sip.conf recht einfach konfiguriert werden konnte. Hier gab es immer genau einen Konfigurations-Eintrag für einen Anschluss (also für jeden internen Endpunkt wie ein SIP-Telefon und für den Trunk nach draussen ins Telefonnetz).

pjsip.conf #

Aber natürlich gibt es kein Stück Software, das man nicht verbessern und ersetzen kann und mit einer viel komplizierteren Konfiguration noch viel flexibler, mächtiger und schwieriger machen kann. Also wurde in neueren Asterisk-Versionen auf das neuere PJSIP-Modul umgestellt, das durch die Datei pjsip.conf konfiguriert wird. sip.conf ist inzwischen deutlich deprecated, obwohl es natürlich noch viele Anleitungen im Internet (das ja bekanntlich nichts vergisst) hierzu gibt.

In der Datei pjsip.conf ist die Konfiguration auf verschiedene Entitäten aufgeteilt, so das Geräte, Endpunkte, Authentifizierung, Registrierung etc. eigene Einträge haben, die sich dann jeweils aufeinander beziehen, so das sich eine funktionierende Einstellung ergibt. So mache ich das hier in meinem Beispiel.

pjsip.conf auf verschiedene Dateien aufgeteilt #

Durch die Fähigkeit Asterisks, das man #include Befehle verwendet, um andere Dateien mit einzulesen, kann man diese Konfiguration nun aufteilen. Da viele INstallationen von Asterisk mit irgendeiner graphischen Oberfälche oder einem sonstigen Generator für die Konfiguration laufen, kann man so die Einstellungen auf verschiedene, automatisch generierte und getrennt zu verwaltende Dateien aufdröseln. Daher ist es auch schon mal üblich, das es Dateien wie pjsip_trunks.conf oder pjsip_endpoints.conf oder gar pjsip_endpoints.d/*.conf oder so gibt. Das ist letztlich eine Frage, wie man das installiert und aufbaut. Wer sich in bestehenden Anleitungen oder laufenden Installationen umschaut, sollte das aber schonmal gehört haben.

pjsip.conf in einer Datenbank #

Letztlich geht die Aufteilung aber noch viel weiter. In den aktuelleren Asterisk-Versionen ist es möglich (und wird in vielen neueren Anleitungen, z.B. auch in o.g. Buch, auch standardmäig verwendet), alle diese Einstellungen in einer Datenbank abzulegen. Es gibt dann also eine Tabelle für Endpoints, die sozusagen die Datei pjsip_endpoints.conf ersetzt. Ich selber habe damit noch nicht gearbeitet, freue mich aber, da auch irgendwann mit herumzuspielen. Blöd an dieser Lösung ist, das die Konfiguration für ein einfaches Problem (Anschluss Vodafone) sehr kompliziert über mehrere Befehle und Tabellen verteilt wird und hinterher nicht mehr an einem Platz zu finden ist.

Meine pjsip.conf #

Hier seht ihr nun mein Beispiel für eine pjsip.conf Datei zum Anschluss eines Vodafone NGN Trunks. Alle Namen und Adressen habe ich anonymisiert, aber als Beispiel sollte das klar sein.

  [general]
  language=de
  _
  [transport-udp]
  type=transport
  protocol=udp
  bind=192.168.1.5
  _
  [transport-tcp]
  type=transport
  protocol=tcp
  bind=12.34.56.78
  _
  [vodafone_aor]
  type = aor
  contact = sip:021514555990@2.207.165.114:5060
  _
  [vodafone_identity]
  type = identify
  endpoint = vodafone
  match = 2.207.165.114
  _
  [vodafone]
  type = endpoint
  context = vodafone-in
  dtmf_mode = rfc4733
  disallow = all
  allow = alaw
  ;allow=g722,ulaw,alaw,gsm,g726
  timers = yes
  ; Wird from_user hier angegeben, wird das immer als Absender verwendet
  ; und es kann keine andere CallerID mehr angegeben werden.
  ;from_user = 021514555990
  from_domain = thomasbayen.ngn.vodafone.de
  language = de
  aors = vodafone_aor
  transport=transport-tcp

Hierbei habe ich folgende Bemerkungen notiert:

Netzwerkkonfiguration #

Nachdem ich extrem grosse und langwierige Schwierigkeiten bei der Konfiguration hatte, habe ich irgendwann entschieden, alle theoretischen Probleme mit dem Netzwerkrouting und NAT aus dem Weg zu räumen und die Asterisk-Maschine sozusagen direkt mit eigener IP-Adresse ins Internet gestellt. Wie man das am besten macht, liegt an der Konfiguration des Routers und übersteigt das Thema dieses Artikels hier.

Au jeden Fall habe ich eine virtuelle Maschine mit zwei Netzwerkschnittstellen erzeugt, die mit einer Schnittstelle direkt auf der Adresse 12.34.56.78 im Internet ist und mit der zweiten Schnittstelle im lokalen Netz hängt.

Firewall #

Auch die Einrichtung einer Firewall geht über das Thema dieses Artikels hinaus. Ich möchte aber die Details, die ich hier in meine nftables-Konfiguration eingebaut haben, kurz anreissen:

  table ip filter {       
     chain input {                
        type filter hook input priority 0; policy drop;
        ct state established,related accept 
        meta iifname ens3 ip saddr {192.168.1.1-192.168.1.255} ip daddr 192.168.1.5 counter accept
        ...
     }
     chain output {               
        type filter hook output priority 0; policy drop;
        meta oifname ens3 ip daddr {192.168.1.1-192.168.1.255} ip saddr 192.168.200.5 counter accept
        meta oifname ens9 ip saddr 12.34.56.78 ip daddr 2.207.165.114 counter accept
        meta oifname ens3 tcp dport {80,443} counter accept
        ...
     }
  }

Und was hat die meisten Probleme gemacht? #

Noch so zum Ende der Geschichte ein Schmankerl, über das ich zuerst gar nicht lachen konnte...: Nachdem ich tatsächlich ungefähr 6 Wochen lang immer wieder gekämpft und konfiguriert und getrackt und geloggt und recherchiert und neu konfiguriert hatte und immer wieder Mails mit einem (technisch eher unbedarften, sehr freundlichen und manchmal sogar antwortenden) Servicemitarbeiter ausgetauscht habe, hat der dann irgendwann endlich einen echten Techniker angeschrieben, der auch geantwortet hat. Juhu! Der hat dann geschrieben, das sich wohl ein paar Wochen zuvor der SBC aufgehängt hat (er meinte, vielleicht durch meine ersten Versuche mit falschen Nachrichten - meine Theorie ist ja, der hatte noch nie gelaufen) und er den mal neu konfiguriert und neu gestartet hätte. Und Zack! ab dem Moment ging's problemlos... Wenn das mal keine typische Lösung ist. Seufz!

Auf jeden Fall hat mich das so viele Nerven gekostet und ich habe so wenig Beispiele für diesen konkreten Fall gefunden und ich habe so viel Sachen dabei gelernt, das ich dann geschworen habe, das in diesem Artikel hier mal alles richtig zu erklären.