
Ich habe dieses Tutorial absolviert, um mit Asterisk sichere Anrufe zu tätigen.
Tutorial zu sicherem Telefonieren | Asterisk-Projekt-Wiki
Ich verwende Asterisk Version 13.19.2 auf Ubuntu Version 16 (Debian) und sobald ich TLS und SRTP hinzugefügt habe, traten Probleme auf.
Lesen Sie dies nur, wenn Sie Asterisk installieren möchten!Dies sind nur meine Notizen für den Fall, dass Sie Asterisk mit TLS- und SRTP-Unterstützung installieren möchten, um sichere Anrufe zu tätigen.Die eigentliche Frage steht ganz unten!
- Installieren Sie Asterisk 13.19.2 mit libsrtp und SRTP:
{
# (1) make sure everything is up to date again
apt-get update
apt-get upgrade
# (2) Install dependencies that will be needed in order to install asterisk pjproject etc...
apt-get install aptitude -y
aptitude install build-essential -y
aptitude install git -y
aptitude install libssl-dev -y
aptitude install zlib1g-dev -y
aptitude install openssl -y
aptitude install libxml2-dev -y
aptitude install libncurses5-dev -y
aptitude install uuid-dev -y
aptitude install sqlite3 -y
aptitude install libsqlite3-dev -y
aptitude install pkg-config -y
aptitude install libjansson-dev -y
# (3) make sure everything is up to date again
apt-get update
apt-get upgrade
# (4) Install libsrtp (library used to encrypt rtp)
cd /root
wget https://github.com/cisco/libsrtp/archive/v1.6.0.tar.gz
tar -xzf v1.6.0.tar.gz
cd libsrtp-1.6.0
./configure CFLAGS=-fPIC --prefix=/usr
make
make runtest
make install
cd ..
# (5) install pjproject
git clone https://github.com/asterisk/pjproject pjproject
cd pjproject
./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr --with-external-srtp
make dep
make
make install
cd ..
# (6) Install Asterisk WITH SRTP AND PJPROJECT
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
tar xvf asterisk-13-current.tar.gz
cd asterisk-13.19.2
./configure --with-pjproject --with-ssl --with-srtp
make
make install
make samples
make config
Generieren Sie die Schlüssel (Zertifikate). Sie können diese auch bei einer Zertifizierungsstelle erwerben.
# GENERATE KEYS
# make a place for our keys mkdir /etc/asterisk/keys
cd /root/asterisk-13.19.2/contrib/scripts
./ast_tls_cert -C my_company.com -O "my_company" -d /etc/asterisk/keys
# TODO later generate keys for clients (ip phones). This part is explained on first tutorial link and is not relevant to this question
Erstellen Sie sip.conf und extensions.conf
sip.conf:
[general]
tcpenable=yes
udpenable=yes
udpbindaddr=0.0.0.0
tcpbindaddr=0.0.0.0
; allow tls !
tlsenable=yes
tlsbindaddr=0.0.0.0:5868 ; <------------------------ note I am changing the default port 6061 to 5868
tlscertfile=/etc/asterisk/keys/asterisk.pem ; key generated on step 2
tlscafile=/etc/asterisk/keys/ca.crt ; certificate generated on step 2
tlscipher=ALL
tlsclientmethod=tlsv1
encryption=yes
tlsdontverifyserver=yes ; trust ublux more than godaddy!
videosupport=yes
nat=force_rport,comedia
; shared configuration used for ip phones
[base-config](!)
type=peer
;type=friend
disallow=all
allow=ulaw,h264,vp8
context=common ;<------------------ context used on extensions.conf
dtmfmode=auto
insecure=port,invite
canreinvite=no
host=dynamic
directmedia=no
registertrying=yes
qualify=yes; monitof peer in order to know if its connected
transport=tls ; Only allow secure transport!
encryption=yes
icesupport=yes
dtlsenabled=yes
dtlsverify=no
Peers auf sip.conf
; peer 1
[101](base-config)
secret=password123
setvar=ID=Tono
setvar=Foo=test101
; peer 2
[102](base-config)
secret=password123
setvar=ID=Monir
setvar=Foo=test102
Erweiterungen.conf
[general]
static=yes
writeprotect=no
[common]
exten => 101,1,NoOp(Calling 101)
same => n,NoOp(Foo = ${Foo} )
same => n,Dial(SIP/101)
same => n,Hangup()
exten => 102,1,NoOp(Calling 102)
same => n,NoOp(Foo = ${Foo} )
same => n,Dial(SIP/102)
same => n,Hangup()
Wie dem auch sei, hier ist die Frage:
Nach der Durchführung dieser Schritte kann ich Anrufe tätigen, Anrufe empfangenaber etwas sehr Seltsames passiert! Asterisk verwendet die falschen Variablen. Wenn ich beispielsweise vom Telefon aus anrufe, wählt 101
Asterisk 102
die Variablen vom Peer aus 102
!Beachten Sie, dass dies nur passiert, wenn die beiden Telefone dieselbe IP-Adresse haben, da sie sich hinter einem NAT befinden.
Hier ist der Beweis:
ubuntu*CLI> sip show peers
Name/username Host Dyn
Forcerport Comedia ACL Port Status Description
101 170.55.7.131 D Yes Yes 50178 Unmonitored
102 170.55.7.131 D Yes Yes 50137 Unmonitored
103 170.55.7.132 D Yes Yes 50212 Unmonitored
Die Peers 101 und 102 zeigen dieselbe IP-Adresse, da sie sich hinter demselben Router befinden. Mit anderen Worten: 170.55.7.131 ist eine öffentliche IP. Wenn sie eine andere öffentliche IP-Adresse hätten, passiert dies nicht. Mit anderen Worten: Dies passiert aus irgendeinem seltsamen Grund nicht zwischen den Nebenstellen 101 und 103.
Wenn ich von 101 nach 102 anrufe, zeigt das Asterisk-Protokoll Folgendes an: (korrekt)
Executing [102@common:1] NoOp("SIP/101-00000095", "Calling 102") in new stack
Executing [102@common:2] NoOp("SIP/101-00000095", "Foo = test101 ") in new stack
Executing [102@common:3] Dial("SIP/101-00000095", "SIP/102") in new stack
Using SIP VIDEO CoS mark 6
....
Wenn ich von 102 nach 101 anrufe, zeigt das Asterisk-Protokoll Folgendes an!!: (falsch)
Executing [101@common:1] NoOp("SIP/101-00000097", "Calling 101") in new stack
Executing [101@common:2] NoOp("SIP/101-00000097", "Foo = test101 ") in new stack
Executing [101@common:3] Dial("SIP/101-00000097", "SIP/101") in new stack
warum ist Foo=, test101
es sollte gleich test102
!!! sein, auch die Kanalvariable 101-00000097
enthält, 101
es sollte 102-00000097
daran liegen, dass das Telefon 102
den Anruf initiiert hat!
Wenn ich den Asterisk-Dienst neu starte und denselben Anruf von 102 an 101 tätige, zeigt Asterisk Folgendes an:
Executing [101@common:1] NoOp("SIP/102-00000002", "Calling 101") in new stack
Executing [101@common:2] NoOp("SIP/102-00000002", "Foo = test102 ") in new stack
Executing [101@common:3] Dial("SIP/102-00000002", "SIP/101") in new stack
Jetzt ist es richtig. Ordnet Asterisk die Variablen der IP-Adresse zu?????
Temporäre Lösungen, die dieses Problem beheben:
Aus irgendeinem Grund passiert das nicht, wenn ich das Telefon an einem anderen Ort aufstelle, wo es eine andere IP-Adresse hat. Dieses Problem tritt nur auf, wenn sich beide Telefone im selben Netzwerk befinden und dieselbe öffentliche IP-Adresse haben. Das ergibt für mich keinen Sinn, da das NAT unterschiedliche interne Ports zuweist.
Wenn ich die Sicherheit (TLS) entferne und UDP oder TCP als Transportmethoden verwende, tritt dieses Problem nicht mehr auf.
Antwort1
Nach einem ganzen Tag habe ich endlich die Lösung gefunden. Das passiert, wenn man die Konfiguration aus dem Internet kopiert!
Das Problem war, dass ich in meiner sip.conf
insecure=port,invite
eine Google-Suche nach insecure=port ergibt:
insecure=port ; Erlaubt die Zuordnung des Peers per IP-Adresse ohne entsprechende Portnummer
Das erklärt, warum der Port ignoriert wurde. Die Lösung bestand also darin, zwei Änderungen an meiner sip.conf vorzunehmen:
Gewechselt
insecure=port,invite
zuinsecure=invite
Gewechselt
type=peer
zutype=friend