[Gelöst] ein Paar Fragen... (Dialplan und Sicherheit)

MaverrickTM

Mitglied
Mitglied seit
2 Sep 2012
Beiträge
587
Punkte für Reaktionen
1
Punkte
16
Hallo zusammen,

ich hab da mal ein Paar Fragen an Euch und hoffe das Ihr mir verzeiht, dass ich dafür eine Art Sammel-Thread aufmache.


1. In dem Default und sip_1und1_outgoing Context, ist das Answer() undbedingt notwendig? bzw. Bringt es einen Vorteil?

2. Ist meine Lösung des forbidden-Contextes so Sinnvoll oder gibt es noch einen effizienteren Weg?

3. Angenommen jemand wählt nach Amerika, so landet er ja in dem forbidden-Context. Gibt es hier einen Weg wie ich erkennen kann aus welchem Context er ursprünglich kommt? Mein Problem ist, dass ich nicht sehe ob er aus dem default oder home stammt. ${EXTEN} in forbidden liefert mir hier ein forbidden. Ich könnte natürlich GoTo(forbidden,${EXTEN}_aus_${CONTEXT},1) verwenden, das ist aber nich sonderlich schön.

4. Ist die Konfiguration so "sicher"? Könnte man hier die Sicherheit verbessern?

5. Gibt es eine Möglichkeit, die Forbidden-Info in einer Logfile auftauchen zu lassen?


Ich bedanke mich schonmal für Eure Mühe und fleissigen Antworten :)


Viele Grüße

Matthias


extensions.conf
Code:
[general]
	static=yes
	writeprotect=yes
	autofallthrough=yes
	extenpatternmatchnew=no
	clearglobalvars=no
	userscontext=default
;-----------------------------------------------------------------------------------------------------------------------------

[globals]
	CONSOLE=Console/dsp

;-----------------------------------------------------------------------------------------------------------------------------


[default]
	exten => _X.,1,Answer()
	exten => _X.,n,GoTo(forbidden,${EXTEN},1)

;-----------------------------------------------------------------------------------------------------------------------------

[sip_1und1_outgoing]

	; Verbiete sämtliche internationalen Vorwahlen
	exten => _00.,1,Answer()
	exten => _00.,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Sonderrufnummern: 0118
	exten => _0118.,1,Answer()
	exten => _0118.,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Sonderrufnummern: 01370 - 01379
	exten => _0137X.,1,Answer()
	exten => _0137X.,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Sonderrufnummern: 0138 & 0139
	exten => _013[89].,1,Answer()
	exten => _013[89].,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Mobilfunknummern
	exten => _01[567]X.,1,Answer()
	exten => _01[567]X.,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Sonderrufnummern: 018xx-Nummern
	exten => _018XX.,1,Answer()
	exten => _018XX.,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Sonderrufnummern: 0190 - 0193
	exten => _019[0-3].,1,Answer()
	exten => _019[0-3].,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete sämtliche 032-VoIP-Nummern - Kostenpflichtig
	exten => _032.,1,Answer()
	exten => _032.,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete "Persönliche Rufnummer" 0700 & 0701
	exten => _070[01].,1,Answer()
	exten => _070[01].,n,GoTo(forbidden,${EXTEN},1)

	; Verbiete Servicerufnummern: 0900 - 0905
	exten => _090[0-5].,1,Answer()
	exten => _090[0-5].,n,GoTo(forbidden,${EXTEN},1)


	; Erlaube Notruf 110 / 112
	exten => 11[02],1,Monitor(wav,${STRFTIME(${EPOCH},,%Y-%m-%d--%H%M%S)}_-_from_${CALLERID(num)}_to_${EXTEN},m)
	exten => 11[02],n,Dial(SIP/${EXTEN}@620)
	exten => 11[02],n,Hangup

	; Erlaube FreePhone
	exten => _080[01].,1,Monitor(wav,${STRFTIME(${EPOCH},,%Y-%m-%d--%H%M%S)}_-_from_${CALLERID(num)}_to_${EXTEN},m)
	exten => _080[01].,n,Dial(SIP/${EXTEN}@620)
	exten => _080[01].,n,Hangup

	; Erlaube sämtliche Vorwahlen beginnend mit 02 - 09
	exten => _0N.,1,Monitor(wav,${STRFTIME(${EPOCH},,%Y-%m-%d--%H%M%S)}_-_from_${CALLERID(num)}_to_${EXTEN},m)
	exten => _0N.,n,Dial(SIP/${EXTEN}@620)
	exten => _0N.,n,Hangup


;-----------------------------------------------------------------------------------------------------------------------------

[intern]

	exten => _XXX,1,Ringing()
;	exten => _XXX,n,Monitor(wav,${STRFTIME(${EPOCH},,%Y-%m-%d--%H%M%S)}_-_from_${CALLERID(num)}_to_${EXTEN},m)
	exten => _XXX,n,Dial(SIP/${EXTEN},20,wW)
	exten => _XXX,n,VoiceMail(${EXTEN},u)
	exten => _XXX,n,Hangup()

;-----------------------------------------------------------------------------------------------------------------------------

[home]

	; Eigenen Anrufbeantworter abfragen
	exten => asterisk,1,GoTo(0,1)
	exten => 0,1,Answer()
	exten => 0,n,Wait(1)
;	exten => 0,n,VoiceMailMain(${CALLERID(num)},s)
	exten => 0,n,VoiceMailMain(${CALLERID(num)})
	exten => 0,n,Hangup

	; Einen beliebigen Anrufbeantworter abfragen
	exten => 00,1,Answer()
	exten => 00,n,Wait(1)
	exten => 00,n,VoiceMailMain
	exten => 00,n,Hangup
	

	; Hello-World
	exten => 1,1,Answer()
	exten => 1,n,Wait(1)
	exten => 1,n,Playback(hello-world)
	exten => 1,n,Wait(1)
	exten => 1,n,Hangup()

	; Echo-Test
	exten => 2,1,Answer()
	exten => 2,n,Wait(1)
	exten => 2,n,Playback(demo-echotest)
	exten => 2,n,Echo()
	exten => 2,n,Playback(demo-echodone)
	exten => 2,n,Hangup()

	; Wartemelodie
	exten => 3,1,Answer()
	exten => 3,n,Wait(1)
	exten => 3,n,MusicOnHold()
	exten => 3,n,Hangup


	include => sip_1und1_outgoing
	include => intern

;-----------------------------------------------------------------------------------------------------------------------------

[sip_1und1_incoming]
	exten => 620,1,Ringing()
;	exten => 620,n,Monitor(wav,${STRFTIME(${EPOCH},,%Y-%m-%d--%H%M%S)}_-_from_${CALLERID(num)}_to_${EXTEN},m)
	exten => 620,n,Dial(SIP/200,20)
	exten => 620,n,VoiceMail(200,u)

;-----------------------------------------------------------------------------------------------------------------------------

[forbidden]

	exten => i,1,NoOp(! FORBIDDEN ! ==> Anruf von "${CALLERID(num)}" nach "${INVALID_EXTEN}" am "${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)})"
	exten => i,n,Wait(1)
	exten => i,n,Playback(invalid)
	exten => i,n,Hangup()

sip.conf
Code:
[general]
;	bindaddr=0.0.0.0
	udpbindaddr=0.0.0.0:5060

	transport=udp

	localnet=10.0.0.0/255.255.255.0
	localnet=192.168.179.0/255.255.255.0	; Workaround wg. AVM-Firmware-Bug

	externhost=xxxxxxxxxx.dyndns.org
	externrefresh=10

	context=default
	deny=0.0.0.0/0.0.0.0
	permit=10.0.0.0/255.255.255.0
	permit=192.168.179.1				; Workaround wg. AVM-Firmware-Bug
	allowguest=no
	alwaysauthreject=yes

	directmedia=yes

	useragent=Asterisk PBX

	language=en

	disallow=all
	allow=alaw
	allow=ulaw
	allow=gsm


;-----------------------------------------------------------------------------------------------------------------------------

	register => 620:<komplexes Passwort>@192.168.179.1/620

;-----------------------------------------------------------------------------------------------------------------------------

[t_internal_sip-phones](!)	; Template für die internen IP-Telefone
	type=friend
	call-limit=2
	context=home
	language=de
	dtmfmode=inband
	deny=0.0.0.0/0.0.0.0
	permit=10.0.0.0/255.255.255.0
	host=dynamic
	qualify=yes


[t_sip_fb7390](!)		; Template für die SIP-Konten der FritzBox
	qualify=yes
	context=sip_1und1_incoming
	insecure=port,invite

;-----------------------------------------------------------------------------------------------------------------------------


[200](t_internal_sip-phones)
;	callerid=Telefon 1 <200>
	secret=<Komplexes Passwort>
	mailbox=200

[201](t_internal_sip-phones)
;	callerid=Telefon 2 <201>
	secret=<Komplexes Passwort>
	mailbox=201

[202](t_internal_sip-phones)
;	callerid=Telefon 3 <202>
	secret=<Komplexes Passwort>
	mailbox=202


[620](t_sip_fb7390)
	type=friend
	defaultuser=620
	fromuser=620
	secret=<Komplexes Passwort>
	host=192.168.179.1
 
Zuletzt bearbeitet:
1. Das Answer() sorgt dafür, dass der Anruf sofort von Asterisk angenommen wird, sonst würde das erst implizit durch das Playback erfolgen. Wenn Du vereinfachen willst, setz das Answer vor das Wait(1) in der i-extension.

2. Es hat gewisse Vorteile, eine i-extension direkt im default zu definieren. Damit werden zB. nicht-numerische Ziele von nicht angemeldeten Usern (=Hacker) abgefangen. siehe ab #11. Ansonsten spricht nichts gegen Deine Lösung.
Eine andere Möglichkeit ist, die Wahlregeln positiv zu gestalten und den Rest mit der i-extension _X. (siehe #11) abzufangen, aber da ist imho die Gefahr größer, dass man was übersieht.

3. Warum nicht sonderlich schön? Ich würds genau so machen. Wenn gewünscht, kannst Du's nachher mit CUT wieder zerlegen.

4. Sieht auf den ersten Blick nicht schlecht aus. Informationen zu Fail2Ban findest Du im "Wichtig"-Thread zum Thema Hacker und Asterisk.

5. Klar, zB. System(echo ... >>logfile), oder meinst Du ein bestimmtes Logfile?
 
Nabend zusammen,

vielen Dank für Deine Antwort und Tipps, rentier-s :) Werd gleich mal die Sachen umsetzen / Anwenden.

Die Überlegung, Positive Wahlregeln zu erstellen und den Rest mit der i-ext abzufangen hatte ich auch. Nur, wie du selbst schreibst, war mir da auch die Gefahr zu groß etwas zu übersehen. Der Hacker-Thread war da sehr lehrreich, wenn man lesen muss welche Kosten da auf einen zukommen können sollte ein grober Fehler in der Konfig existieren... Das würde mir mein Finanz-Minister extrem übel nehmen.... xD

Spricht was dagegen, wenn ich forbidden auflöse, die i-extension nach default verlege und dann alles in default werfe? Das würde den Dialplan ein wenig übersichtlicher und einfacher gestalten.


Viele Grüße

Matthias
 
3. Angenommen jemand wählt nach Amerika, so landet er ja in dem forbidden-Context. Gibt es hier einen Weg wie ich erkennen kann aus welchem Context er ursprünglich kommt? Mein Problem ist, dass ich nicht sehe ob er aus dem default oder home stammt. ${EXTEN} in forbidden liefert mir hier ein forbidden. Ich könnte natürlich GoTo(forbidden,${EXTEN}_aus_${CONTEXT},1) verwenden, das ist aber nich sonderlich schön.

Das kann man anders lösen: Im ursprünglichen Context steht CONTEXT wie du selbst erkannt hast, ja als Variable zur Verfügung, darüber hinaus auch noch EXTEN, wenn man noch genauer differenzieren will. Wenn Du diese Informationen in eine Channelvariable aka

Code:
Set(fromCONTEXT=${CONTEXT})

vor dem Absprung zu forbidden umspeichert, kann man das in forbidden auch wieder auswerten ...
 
Hallo,

danke für Eure Antworten :)

@ abw1oim
das war auch meine Überlegung. Es gibt hierbei nur ein arges Problem. Es gibt Szenarien, in dennen die Variable durch einen anderen Wert überschrieben wird, bevor der ursprüngliche Wert überhaupt ausgewertet wurde. Das ist leider nicht zuverlässig genug. Daher bleibts wohl bei der Ursprünglichen Idee, da dort extension und Quell-Context immer zueinander passen. Aber danke für Deine Idee :)

Viele Grüße

Matthias
 
Zuletzt bearbeitet:
Sorry fürs doppelposten. Das Edit hat scheinbar niemand mitbekommen daher nochmal die Frage:


Wählt jemand eine ungültige Nummer, so landet er in default und es greift die i-ext. Testweise habe ich ein Telefon direkt in den default-context gesteckt und eine Nummer gewählt. Hier greift diesmal nicht die i-ext :confused:

Kann mir jemand erklären warum das so ist?


extension.conf
Code:
[default]
        exten => i,1,Answer()
        exten => i,n,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} -- \\"${CUT(INVALID_EXTEN,-,2)}\\"  -- \\"${CALLERID(num)}\\" ==\\> \\"${CUT(INVALID_EXTEN,-,1)}\\" >> /var/log/asterisk/forbidden.log)
        exten => i,n,Wait(1)
        exten => i,n,Playback(invalid)
        exten => i,n,Hangup()


Viele Grüße

Matthias
 
Hallo Rentier-S,

danke für deine bisherige Hilfe :)

Es passiert das übliche, wenn keine extension greift:

console - verbose 5
Code:
[Sep 25 17:05:34] NOTICE[1652]: chan_sip.c:22671 handle_request_invite: Call from '201' (10.0.0.201:1024) to extension '030123456' rejected because extension not found in context 'default'.

[EDIT]
Asterisk 1.8.12.2
&
Asterisk 1.8.15.1
[/EDIT]


Viele Grüße

Matthias
 
Zuletzt bearbeitet:
Ich glaube, ich sollte meine bisherige Auffassung über die i-extension überdenken. :gruebel:

Das einzige was ich mir vorstellen könnte ist, dass Asterisk die i ignoriert, weil es in dem Sinn keine nicht passende extension gibt. Kannst Du mal testweise eine dummy exten=>_X,1,Noop() oder so einbauen?
 
Hallo ihr beiden,
die i-Extension fängt AFAIK genau das beschriebene Szenario nicht ab, da sie dafür nicht gedacht ist. "Invalid" (i) wird genau dann als exception von asterisk-core geworfen (und damit eine entsprechende i- oder e-Extension angesprochen), wenn eine Nutzereingabe keine treffende extension findet, damit greift i auch (vollautomatisch) nur im Rahmen von IVRs.
Will man i im Sinne von "von mir nicht gewünschte extension" nutzen, muss man so vorgehen, dass man den gewünschten Teil über "normale" Pattern behandelt und alles andere über eine abstrakte extension (z.B: _X.) nach i springen lässt (goto).
Das ist meine leidige Erfahrung, da ich mir urprünglich unter i auch etwas anderes vorgestellt habe.
Das gleiche Verhalten haben im Übrigen auch die "special extensions" t,T und e - sie alle funktionieren automatisiert nur bei IVRs. Nur s und h haben da andere Eigenschaften ...
Wegen der aktuellen Logik "spezifischere greift vor allgemeinerer Extension" kann man aber eben so vorgehen, dass man die gewünschten ausspezifiziert um danach alles andere über _X. auszusteuern (Sofern man es nur mit numerischen Sachen zu tun hat, sonst wird es noch ein wenig komplizierter)
 
OK, darauf wäre ich nie gekommen. Wobei das schon derb ist, weil eigentlich alle Howtos (uA. eins der bekanntesten) die i im normalen Dialplanbetrieb zeigen.

Was ich bereits schmerzlich gelernt habe ist, dass immer die h im ursprünglichen Context angesprungen wird. Wenn man etwas verzweigte includes hat, kann man da reinfallen.
 
Nabend Ihr beiden...

ich hab den Test mal fix durchgeführt.

extension.conf
Code:
[default]
        exten => _X.,1,noop(bla)

        exten => i,1,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} ${CUT(INVALID_EXTEN,-,2)} ${CALLERID(num)} \\>\\> ${CUT(INVALID_EXTEN,-,1)} >> /var/
        exten => i,n,Answer()
        exten => i,n,Wait(1)
        exten => i,n,Playback(invalid)
        exten => i,n,Hangup()


console
Code:
  == Using SIP RTP CoS mark 5
    -- Executing [030123456@default:1] NoOp("SIP/201-0000000d", "bla") in new stack
    -- Auto fallthrough, channel 'SIP/201-0000000d' status is 'UNKNOWN'

Das Telefon wirft ein "declined" raus und die i-ext wird immer noch nicht verwendet.


@abw1oim

Danke für die Erklärung!
 
Zuletzt bearbeitet:
Das ist exakt, was ich beschrieben habe;
Also: Gewollte extensions ausformulieren und alles andere mit

Code:
exten => _X.,1,goto(i)

nach i schicken. Dann wird es eben auch (für alles ungewollte) verwendet.

BTW: Neben dem IVR greift die i-exception auch automatisch bei anderen DTMF-Eingaben wie etwa Disa. nicht jedoch bei solchen, die die Eingabe in eine Variable übernehmen wie Read
 
Super! Danke für Eure Hilfe. Also zurück zum forbidden-context... So funktionierts wunderbar.

Schönen Abend noch.
 
Ich hatte "_X" geschrieben. Mit "_X." fängst Du logischer Weise alles (numerische) ein. Aber egal, abw1oim hat meine Vermutung sowieso widerlegt.

abw1oim, magst Du Dich evtl. mit den Autoren in Verbindung setzen? Ich finde, das sollte Erwähnung finden, dass das bei einem normalen Wählvorgang eben nicht so funktioniert wie beschrieben.
 
@rentier-s: Done mit der Bitte um Aufklärung, ob es eine bestimmte Konstellation geben mag, bei denen das Beispiel aus Sicht der Autoren doch klappt. Interessanterweise machen Sie bei den t, T-Extensions genau das Szenario, bei dem es klappt: IVR (Background)
 
Hmm... Irgendwie hab ich nicht genau aufs pattern geachtet :blonk:

extension.conf
Code:
[default]
        exten => _X,1,noop(bla)

        exten => i,1,Answer()
        exten => i,n,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} ${CUT(INVALID_EXTEN,-,2)} ${CALLERID(num)} \\>\\> ${CUT(INVALID_EXTEN,-,1)} >> /var/log/asterisk/forbidden.log)
        exten => i,n,Wait(1)
        exten => i,n,Playback(invalid)
        exten => i,n,Hangup()

console - verbose 5
Code:
== Using SIP RTP CoS mark 5
[Sep 27 23:36:44] NOTICE[2841]: chan_sip.c:22825 handle_request_invite: Call from '201' (10.0.0.201:1024) to extension '030123456' rejected because extension not found in context 'default'.
 
Da fehlt ein . ! _X. statt _X und dann klappt es auch
 
Ja, ich weiss. Rentier-s wollte _X als Pattern in dem Test. _X. hatte ich versehntlich vorher getestet.

Aber danke... :)
 
Zuletzt bearbeitet:
Kostenlos!

Statistik des Forums

Themen
248,106
Beiträge
2,281,486
Mitglieder
377,315
Neuestes Mitglied
aquasascha