
Completé este tutorial para realizar llamadas seguras con asterisco.
Tutorial de llamadas seguras | Wiki Proyecto Asterisco
Estoy ejecutando Asterisk versión 13.19.2 en Ubuntu versión 16 (debian) y tan pronto como agregué TLS y SRTP tuve problemas.
¡Lea esto sólo si desea instalar Asterisk!Estas son sólo mis notas en caso de que desees instalar Asterisk con soporte TLS y SRTP para poder realizar llamadas seguras.¡La verdadera pregunta está en el fondo!
- Instale asterisk 13.19.2 con libsrtp y 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
Generar las claves (certificados). También puede comprarlo a través de una autoridad certificadora.
# 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
Crear sip.conf y extensiones.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
pares en 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
extensiones.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()
De todos modos aquí está la pregunta:
Después de realizar esos pasos puedo hacer llamadas, recibir llamadas¡pero sucede algo muy extraño! Asterisk usa las variables incorrectas. Por ejemplo, cuando llamo desde el teléfono, 101
¡el 102
asterisco elige las variables del par 102
!Tenga en cuenta que esto sólo sucede cuando los dos teléfonos tienen la misma dirección IP porque están detrás de una NAT.
Aquí está la prueba:
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
Los pares 101 y 102 muestran la misma dirección IP porque están detrás del mismo enrutador. En otras palabras, 170.55.7.131 es una IP pública. Si tienen una dirección IP pública diferente, esto no sucede. En otras palabras, esto no sucede entre las extensiones 101 y 103 por alguna extraña razón.
Cuando llamo del 101 al 102 esto es lo que muestra el registro de asteriscos: (correcto)
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
....
Cuando llamo del 102 al 101 esto es lo que muestra el registro de asteriscos!!: (incorrecto)
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
¿Por qué Foo = test101
debería ser igual test102
? ¡También la variable del canal 101-00000097
contiene 101
que debería 102-00000097
deberse a que el teléfono 102
inició la llamada telefónica!
Si reinicio el servicio de asterisco y hago la misma llamada del 102 al 101, esto es lo que muestra el asterisco:
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
Ahora es correcto. ¿Asterisco está asignando las variables a la dirección IP?????
Soluciones temporales que solucionan este problema:
Por alguna razón, si coloco el teléfono en un lugar diferente donde tiene una dirección IP diferente, esto no sucede. Este problema sólo ocurre cuando ambos teléfonos están en la misma red y tienen la misma dirección IP pública. Esto no tiene sentido para mí porque la NAT asignará diferentes puertos internos.
Si elimino la seguridad (tls) y uso udp o tcp como métodos de transporte. este problema ya no ocurre.
Respuesta1
Finalmente descubrí la solución después de pasar un día entero. ¡Esto es lo que sucede cuando copias la configuración de Internet!
De todos modos el problema fue que en mi sip.conf tenía
insecure=port,invite
Al hacer una búsqueda en Google sobre insecure=port se obtiene:
inseguro=puerto; Permitir la coincidencia de pares por dirección IP sin coincidir con el número de puerto
Eso explica por qué se ignoraba el puerto. Entonces la solución fue hacer dos cambios en mi sip.conf:
Cambiado
insecure=port,invite
ainsecure=invite
Cambiado
type=peer
atype=friend