[Frage] Anrufzuordnung bei eingehenden Anrufen

ca.funke

Neuer User
Mitglied seit
17 Jan 2005
Beiträge
117
Punkte für Reaktionen
0
Punkte
16
Hallo allerseits,

ich frage mich welche Parameter bei eingehenden Anrufen genau bestimmen, wohin Anrufe wie gehen.

Bisher habe ich die Provider immer "irgendwie" konfiguriert bekommen, aber wirklich verstanden habe ich es nicht.

Ich nehme mal sipgate.de als Beispiel:

1.:
in der sip.conf steht:

register => 1234567: [email protected]/7654321
wobei
"register" der Befehl ist, "1234567" die sipgate-sip-ID, "sipgate.de" der Server und hinter dem "/" steht die Extension "7654321", welche später in extensions.conf gematcht wird?

Dadurch sagt der Asterisk sipgate.de sozusagen Bescheid: "wenn ein Anruf kommt, schick ihn zu mir", und bei sich denkt der Asterisk noch "und wenn sipgate mir was schickt, dann behandle ich das intern als Extension 7654321"?

2.:
immer noch in sip.conf steht dann später der Konfigurationsabschnitt:
[sipgate_incoming]
type=peer
fromdomain=sipgate.de
host=sipgate.de
disallow=all
allow=ulaw
context=incoming

Hier werden die technischen Parameter bestimmt. Die letzte Zeile sagt, "wenn ein Anruf hier landet, dann bearbeite ihn weiter in der extensions.conf, undzwar im Context "incoming"".

Aber welcher Parameter sorgt dafür, dass dies nur die sipgate.de Anrufe betrifft? fromdomain? host? Das ist mir ein Rätsel.

3.:
Nun springt Asterisk zu "extensions.conf" und findet den context "incoming":

[incoming]
exten => 7654321,1,Dial,SIP/35|40|r

Das "7654321" ist ja die "Extension", welche bei eingehenden Anrufen in dem Sinne ja eigentlich gar nicht existieren dürfte. Wird das tatsächlich mit der extension abgegelichen, welche man im "register" Abschnitt hinter dem "/" festlegt? Könnte man das also theoretisch ändern wie man will? Und warum wird dieser Parameter überhaupt für eingehende Anrufe benutzt?

Ich hoffe die Frage ist nicht zu allgemein oder ungenau. Ich würde es nur wirklich gerne verstehen, was wann wo gematcht wird.

Dank und Gruss,
Christian
 
Zuletzt bearbeitet:
zu 1.

Jein, streng genommen: Wenn ein Anruf von der IP zum FQDN sipgate.de eingeht, der mit dem angegebenen User (SIPGATE_ID) 1234567 authentifiziert ist, dann schicke ihn an die Extension 7654321 im Dialplan und zwar in den Context, der in sip.conf im general-Kontext angegeben ist (oder falls er dort fehlt: in den context des Namens "default") es sei denn, es gibt einen Konfigurationsabschnitt in der sip.conf, der im Host-Parameter den gleichen FQDN benutzt und eine Angabe context= hat, dann nutze diesen Kontext. *

zu 2.
Ja, host enthält entweder die FQDN oder die IP, von der ein Anruf kommen muss, um den Kontext in der sip.conf zu matchen und demnach die korrekt beschriebene Folgerung auszulösen. Gibt es mehrere Kontexte in sip.conf mit identisdchem host-Eintrag, so wird je nach Asterisk-Version der letzte oder der erste der Kontexte in der sip.conf benutzt, das ist ein wenig nervig, allerdings werden auf der Ebene bei peer bzw. friend die Userdaten bei incoming calls nicht zur Differenzierung der Kontexte benutzt (ist eine Uralt-Diskussion in der Entwicklergemeinde)

zu 3.
Ja, es muss (in den meisten Fällen, Spezialfälle jetzt mal außen vor gelassen) die Extension sein, die bei register => angegeben wurde oder aber ein diese Angabe verallgemeinerndes Pattern. Warum man das benutzt (und eben nicht mit allgemeinen Pattern arbeitet? Nun, öfter hat man mehrere eingehende Leitungen/Rufnummern und will - je nach eingehender Leitung - die Anrufe unterschiedlich handhaben. Dazu bieten sich unterschiedliche Extensions an (auch wenn es dazu Alternativlösungen gibt, je nachdem, wie man die Anrufverteilung machen will).

Hope it helps

* <Extended mode on> Bei Kontexten gilt dann noch zu berückssichtigen, dass es zwischen den 3 Sprachvarianten, Kontexte zu definieren, eine Hierarchie gibt, es gilt: extensions.conf vor extensions.ael vor extensions.lua. Implementiert man also den gleichnamigen Kontext in allen drei Dateien (in den samples ist das so), zieht immer der der extensions.conf </Extended mode off>
 
Hallo abw1oim,

ja, das hilft ganz ungemein, vielen Dank! :)

Das ganze bringt mich zu einer Folgefrage: Wenn man nun einen Anbieter hat wie netvoip.ch, welcher mit Load Balancern arbeitet und bei ankommenden Anrufen immer unterschiedliche FQDNs präsentiert. Wie kann man dafür sorgen, dass alle Anrufe von Netvoip gleich behandelt werden? Insbesondere z.B. falls Netvoip beschliesst weitere Server (FQDNs) dazuzuschalten.

Bei (d)einer Konfiguration habe ich gesehen, werden mehrere hosts definiert:

Code:
[netvoip_ch]
username=99944508xxxx01
fromuser=99944508xxxx01
secret=123456789
host=sip.netvoip.ch
fromdomain=sip.netvoip.ch
outboundproxy=sip.netvoip.ch

[netvoip_ch_in_1](external)
host=sip-1.netvoip.ch

[netvoip_ch_in_2](external)
host=sip-2.netvoip.ch

Bei pbxes wird das in der sip.conf so gehandhabt:

Code:
canreinvite=yes
context=from-pstn
disallow=h263&h263p
dtmfmode=auto
fromdomain=sip.netvoip.ch
fromuser=99944508xxxx01
host=sip.netvoip.ch
insecure=very
language=en
promiscredir=yes
qualify=no
register=99944508xxxx01:***@sip.netvoip.ch/4144508xxxx-ch
secret=***
sendrpid=no
type=peer
username=99944508xxxx01

So wie ich es jetzt verstehe, sollte es mit der PBXes Variante gar nicht funktionieren, tut es aber trotzdem?

Es kommt mir so vor, als könnte es irgendwie einfacher, und vor allem sicherer, gehen, als jeden Host separat zu definieren?

Oder bin ich auf dem Holzweg?

Dank und Gruss,
Christian
 
Zuletzt bearbeitet:
Na ja, das ist immer so eine Sache: Wenn man (und pbxes könnte das tun ... ) in der sip.conf im General-Abschnitt allowguest=yes drin hat (oder ggf. auch einfach kein allowguest=no), dann werden erst mal alle Anrufe nach default bzw. dem im General-Abschnitt definierten context geleitet.

Will man allowguests=no haben und damit nur Anrufe definierter peers entgegennehmen, muß man bei Anbietern mit Loadbalancern, die Anrufzustellungen von jedem Ihrer Server aus machen und nicht nur über die IP, an der man registriert ist, alle möglichen IPs angeben. Da Asterisk nicht mehrere FQDNs/IPs je Host=-Zeile unterstützt, braucht es mehrere Kontexte. Insoweit passt das Beispiel (es stamm glaube ich sogar von netvoip.ch). Allerdings bleibt das Problem: Neue Loadbalancer bemerkt man nicht, die Anrufe kommen nicht durch. Das merkt man nur mit allowguests=yes und entsprechenden Auswerteregeln im Defaultkontext.
Aktuell (und quasi schon immer) funktioniert für netvoip.ch:

Code:
[external-g729]
type=peer
insecure=port,invite
usereqphone=no
disallow=all
;allow=g729 ; Nur, wenn man auch g729 hat !
allow=ulaw
allow=alaw
directmedia=no
t38pt_udptl=no
dtmfmode=rfc2833
context=inc_sip

[NETVOIP](external-g729)
defaultuser=044xxx
fromuser=044xxx
secret=password#
fromdomain=sip.netvoip.ch
host=sip.netvoip.ch
outboundproxy=sip.netvoip.ch

[NETVOIP_IN_1](external-g729)
host=sip-1.netvoip.ch

[NETVOIP_IN_2](external-g729)
host=sip-2.netvoip.ch
 
Na ja, das ist immer so eine Sache: Wenn man (und pbxes könnte das tun ... ) in der sip.conf im General-Abschnitt allowguest=yes drin hat (oder ggf. auch einfach kein allowguest=no), dann werden erst mal alle Anrufe nach default bzw. dem im General-Abschnitt definierten context geleitet.
Kann man demensprechend auch sagen: Wenn "allowguest=yes" kommen Anrufe zwar an, aber bei nicht weiter definiertem Host landen diese immer im default context? Wäre einerseits logisch. Andererseits sehe ich bei pbxes im source-view für meine netvoip#:
Code:
canreinvite=yes
context=from-pstn
disallow=h263&h263p
dtmfmode=auto
fromdomain=sip.netvoip.ch
fromuser=99944508xxxx01
host=sip.netvoip.ch
insecure=very
language=en
promiscredir=yes
qualify=no
register=99944508xxxx01:***@sip.netvoip.ch/4144508xxxx-ch
secret=***
sendrpid=no
type=peer
username=99944508xxxx01
im call-monitor steht unter "ip" für Anrufe auf der netvoip# lustig die verschiedenen load balancer:
Code:
sip-1.netvoip.ch
sip-2.netvoip.ch
und trotzdem kann ich unter "inbound routing" unter Angabe des Trunknamens trunkabhängige Veränderungen vornehmen (z.B. Vorschalten von Ziffern vor die ankommende CallerID). Also müssen die Anrufe doch eigentlich, auch wenn ich nicht weiss wie, ein und demselben Trunk/Kontext zugeordnet werden, ohne dass die FQDNs definiert wurden?

Kann es vielleicht sein, dass der "register"-Befehl das irgendwie beeinflusst, dadurch dass er direkt mit im Kontext steht?

...Aktuell (und quasi schon immer) funktioniert für netvoip.ch:

Wieso funktioniert das eigentlich? Genauer: Warum müssen in den Kontexten in denen nur "host=xyz" steht nicht jeweils alle Daten erneut auftauchen?
 
Zuletzt bearbeitet:
Wieso funktioniert das eigentlich?
Weil (external-g729) hinter dem Kontext angibt, dass ein Templeate (hier: external-g729) mitgilt, d.h. alles, was in "external-g729" definiert ist, gilt mit. Da zudem über die Balancer nur Inbound abgefangen wird, sind die Nutzerangaben nicht notwenig, die stehen nur in dem Kontext, der für Outbound verwendet wird.

Wenn "allowguest=yes" kommen Anrufe zwar an, aber bei nicht weiter definiertem Host landen diese immer im default context?
Richtig. Im default Context oder aber dem context, der im General-Abschnitt der sip-conf definiert wurde.

Also müssen die Anrufe doch eigentlich, auch wenn ich nicht weiss wie, ein und demselben Trunk/Kontext zugeordnet werden, ohne dass die FQDNs definiert wurden?
Ja, allerdings kann ich Dir auch nicht sagen, wie pbxes.org das macht. "Serienmäßig"/"Out of the box" kann Asterisik das IMHO nicht.
 
Richtig. Im default Context oder aber dem context, der im General-Abschnitt der sip-conf definiert wurde.
Danke für Deine ausführlichen Erklärungen und Deine Hilfe! Das ist wirklich klasse! :groesste:

Ich frage mal direkt weiter, falls ich noch darf :) : Kann man alle Anrufe in den Default Context laufen lassen, und dort anhand der Extension differenzieren?

Vielleicht sage ich mal, was ich eigentlich erreichen will (und was auf pbxes nicht geht, daher meine reumütige Rückkehr zu Asterisk) :

Ich habe eine Schweizer (0041) und eine deutsche (0049) Nummer, welche letztlich auf einem Endgerät signalisiert werden.

Ruft mich eine Person aus Genf (innerhalb der Schweiz Vorwahl 022...) auf meiner Schweizer Rufnummer an, erscheint die Nummer im "innerschweizerischen" Format, also als "022xxxxxxx".

Ruft mich eine Person aus Bonn (innerhalb Deutschlands Vorwahl 0228...) auf meiner deutschen Rufnummer an, erscheint die Nummer im "innerdeutschen" Format, also als "0228xxxxxx".

Effektiv kann man so bei eingehenden Anrufen nicht erkennen, ob ein Anruf aus Deutschland oder aus der Schweiz kommt.

Um die Nummer ins internationale Format zu hiefen, möchte ich trunkabhängig einbauen:

  • Wenn die Rufnummer bereits mit "00" beginnt, unternehme nichts.
  • Wenn die Rufnummer mit "0" beginnt, schnibbel die erste "0" ab, und ersetze (trunkabhängig) mit "0041" bzw. "0049".

(Oder kann man das selbe noch viel einfacher erreichen?)

Peinlicherweise hatte ich das schonmal auf (m)einem Asterisk realisiert, bis der Anbieter von der Bildfläche verschwunden ist, und ich vergessen hab die aktualisierten .conf-s runterzuladen bevor der Server mit Ankündigung offline ging :blonk:

Dank und Gruss,
Christian
 
Ich würde es so nicht machen (über den default, auch wenn das ginge). Ich würde eher einen Kontext, nennen wir ihn mal inc_sip verwenden und dort dann erst mal herausfinden, wer der Provider ist. Wenn ich den habe, würde ich dann providerspezifisch die Absenderufnummer übersetzen (ins internationale Format). Wenn ich dann wiederum ein Telefon habe, das an einem bestimmten Standort steht, würde ich dann diese Rufnummer jetzt wieder in ein für dieses Telefon rückwahlfähiges Format umwandeln. Im Extremfall gibt das dann bei Gruppenrufen sogar unterschiedlicche Absenderufnummern, Beispiel:

Ein Anruf aus Bonn geht ein, Absenderufnummer 022812345, wird internationalisiert (00E164) -> 004922812345
Der Anruf wird signalisiert auf 3 Telefonen: (A) DE Bonn, (B) DE Mobilfunk und (C) CH Genf, die jeweiligen Telefone haben keine Amstvorwahl
Dann kommt als Absenderufnummer zur Anzeige:

A) 12345
B) 022812345
C) 004922812345

Das ganze macht man natürlich richtig schön generisch.

Sorry, aber dafür baue ich Dir jetzt kein Beispiel hier hin. Du kannst mir aber gerne eine PM schicken, dann können wir uns bei Bedarf über eine Aufwandsentschädigung unterhalten ...
 
Hallo abw1oim,

ich brauche alles "nur" im internationalen Format, da ich im Regelfall über Betamaxe zurückrufe.

Das ganze habe ich jetzt, hauptsächlich dank Deiner Hilfe, und mit einiger Geduld größenteils hingebogen.

Dank und Gruss,
Christian
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.