Asterisk usa las variables incorrectas de sip.conf

Asterisk usa las variables incorrectas de sip.conf

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!


  1. 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
  1. 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

  2. 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 102asterisco 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 = test101debería ser igual test102? ¡También la variable del canal 101-00000097contiene 101que debería 102-00000097deberse a que el teléfono 102inició 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:

  1. 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.

  2. 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:

  1. Cambiado insecure=port,inviteainsecure=invite

  2. Cambiado type=peeratype=friend

información relacionada