Asterisk Telefonanlage an Telekom SIP-Trunk


Die folgende Anleitung beschreibt, man Asterisk mit chan_sip an einem Telekom SIP-Trunk Anschluss zum Laufen bringt. Sie richtet sich an Administratoren, die sich schon etwas mit der Asterisk-Konfiguration auskennen, aber am Telekom-Anschluss verzweifelt sind.

Achtung: Diese Anleitung funktioniert nicht mit einem "Normalen" Heim-Anschluss der Telekom (der einen Analogen- oder ISDN Mehrgeräteanschluss ersetzt), sondern nur mit einen SIP-Trunk (der einen Anlagenanschluss ersetzt).

Kurz vor Schaltung des Anschlusses erhält man von der Telekom einen Brief mit den Zugangsdaten. Die wichtigen Angaben für den Asterisk sind:

Telefonie-Nutzer  : 123456789012
Telefonie-Passwort: abcdefgh
Outbound-Proxy    : reg.sip-trunk.telekom.de
Registrar         : sip-trunk.telekom.de

Zusätzlich braucht man noch die Haupt-Nummer (also die mit einer "0" am Ende) von seinem Telefonanschluss mit einem "+" und der internationalen Vorwahl, also z.B.:

Hauptnummer  : +49691234560

Nun fangen schon die Probleme an. Die Telekom verwendet TCP für SIP (nicht UDP), eine Namensauflösung mit NAPTR und SRV, und einen Proxy. Diese Kombination funktioniert bei chan_sip des Asterisk nicht. Um das abzubilden können wir aber ein wenig mit der /etc/hosts "mogeln". Dazu verwenden wir ein kleines Shell-Script, welches die Namensauflösung macht und das Ergebnis in die /etc/hosts schreibt.

#! /bin/bash

ROUTER=172.30.20.1
ADMIN=admin@rechner.domain

NAPTR=`host -t NAPTR reg.sip-trunk.telekom.de $ROUTER | grep 'SIP+D2T' | sed 's,.* ,,'`
SRV=`host -t SRV $NAPTR $ROUTER | grep ^$NAPTR.*has.*SRV | sort -nk 5,5 | head -1 | sed 's,.* ,,'`
IP=`host -t A $SRV $ROUTER | grep ^$SRV.*has.*address| head -1 | sed 's,.* ,,'`

DTAG=`grep sip-trunk.telekom.de /etc/hosts | sed 's, .*,,' | sed 's,    .*,,'`

if [ "$IP" = "" ]
then
  echo "Neue IP sip-trunk nicht gefunden" | mail -s Telefon $ADMIN
  exit 0
fi

if [ "$IP" != "$DTAG" ]
then
  grep -v sip-trunk.telekom.de /etc/hosts >/tmp/dtagtmp.$$
  echo "$IP sip-trunk.telekom.de" >>/tmp/dtagtmp.$$
  cp /tmp/dtagtmp.$$ /etc/hosts
  rm /tmp/dtagtmp.$$
  echo "Neue IP sip-trunk: $IP (alt: $DTAG)" | mail -s Telefon $ADMIN
fi

Die Variable "ROUTER" wird auf die IP-Adresse des Telekom-Routers gesetzt (bzw. ein Rechner, der die Namensauflösung über die zum Telefonanschluss gehörende Internetverbindung mit Telekom- Nameserver durchführt). Die Variable "ADMIN" wird mit der Mailadresse von jemanden belegt, der benachrichtigt werden soll, wenn sich etwas geändert hat oder etwas nicht funktioniert.

Wenn das Script nun einmal gestartet wird, sollte danach in der /etc/hosts ein entsprechender Eintrag sein. Die konkrete IP-Adresse wird natürlich je nach Standort und Lust und Laune der Telekom variieren.

217.0.26.67 sip-trunk.telekom.de

So gerüstet können wir nun an die sip.conf vom Asterisk gehen. Hier wird kein Proxy angegeben, weil wir in der /etc/hosts für den Namen sip-trunk.telekom.de die IP-Adresse des Proxy's vorgegaukelt haben.

[general]
tcpenable=yes
tcpbindaddr=0.0.0.0
register => tcp://+49691234560:abcdefgh:123456789012@sip-trunk.telekom.de/+49691234560
...

[siptrunk]
type=peer
secret=abcdefgh
defaultuser=123456789012@sip-trunk.telekom.de
host=sip-trunk.telekom.de
fromuser=+49691234560
context=siptrunk-in
qualify=yes
session-timers=refuse
allow=!all,alaw,g722
transport=tcp
progressinband=yes

...
Etwas Arbeit ist auch in der extensions.conf notwendig. Bei eingehenden Anrufen ist die gewählte Telefonnummer mit Durchwahl in den SIP-Headern versteckt, und muss dort herausgepult werden, bevor wir sie nutzen können. Dabei ist auch zu beachten, dass der Eingang mit der Extension "+49..." erfolgt, also das sehr oft genutzte "_X." nicht funktioniert.
[siptrunk-in]
exten => _[+0-9].,1,NoOp()
exten => _[+0-9].,n,Set(DEST=${SIP_HEADER(TO)})
exten => _[+0-9].,n,Set(DEST=${CUT(DEST,@,1)})
exten => _[+0-9].,n,Set(DEST=${CUT(DEST,:,2)})
exten => _[+0-9].,n,Set(SRC=${CALLERID(number)})
exten => _[+0-9].,n,Set(SRC=${STRREPLACE(SRC,"+49","0")});
exten => _[+0-9].,n,Set(SRC=${STRREPLACE(SRC,"+","00")});
exten => _[+0-9].,n,Set(CALLERID(number)=0${SRC})
exten => _[+0-9].,n,Set(CALLERID(name)=${SRC})
exten => _[+0-9].,n,Goto(verteiler,${DEST},1)

[verteiler]
exten => +49691234560,1,...
exten => +49691234560,n,...
...
exten => +496912345610,1,...
exten => +496912345610,n,...
...
exten => +496912345611,1,...
exten => +496912345611,n,...
...

Ausgehende Anrufe werden mit folgendem DIAL gestartet (Annahme: Ausgehende Anrufe werden durch eine zusätzliche "0" vor der Nummer gekennzeichnet, und wir wollen als Anruferkennung nur unsere Zentrale herausgeben):

exten => _0X.,1,Set(CALLERID(number)=0)
exten => _0X.,n,Set(CALLERID(name)=MyCompany)
exten => _0X.,n,DIAL(SIP/${EXTEN:1}@siptrunk)
exten => _0X.,n,Hangup()

Wenn der Asterisk fertig konfiguriert ist, kann er gestartet werden. Jetzt können wir nachsehen, ob alles funktioniert.

/usr/local/sbin/asterisk -U asterisk -G asterisk >/dev/null 2>&1 &
/usr/local/sbin/asterisk -r
...
telefon*CLI> sip show registry
Host                                    dnsmgr Username       Refresh State                Reg.Time
sip-trunk.telekom.de:5060               N      +49691234560       225 Registered           Tue, 23 Apr 2019 23:48:39
1 SIP registrations.
telefon*CLI> sip show peers
...
dtag/123456789012@sip-tru 217.0.26.67                                 Auto (No)  No             5060     OK (22 ms)
...

Wenn die Registrierung aktiv ist und der Peer "OK" ist, dann können wir uns freuen und die Telefonie testen. Sobald alles o.k. ist, muss das Shell-Script für die Namensauflösung noch mit einem Restart des Asterisk zu einer passenden Zeit Nachts in die cron des Rechners gesetzt werden

/usr/local/bin/siptrunkdns.sh
/usr/local/sbin/asterisk -x "core restart now"
sleep 30
x=`ps -fu asterisk|grep sbin.asterisk`
if [ "$x" = "" ]
then
  /usr/local/sbin/asterisk -U asterisk -G asterisk >/dev/null 2>&1 &
fi

Bitte senden Sie Kommentare an: Lothar Krauss Home