Conectar dos Servidores Asterisk con TLS y SRTP - Asterisk 1.8.X

Hoy veremos como configurar una troncal SIP entre dos servidores Asterisk y utilizar el protocolo TLS para la señalización SIP y el protocolo SRTP para el cifrado media.

Primero hay que crear los certificados para el servidor A y el servidor B. Esto se hace con una utilidad presente en las fuentes de Asterisk. Desde el servidor A:

mkdir /etc/asterisk/keys

Primero se crea el certificado CA y el certificado para el servidorA:

cd /usr/src/asterisk-1.8.8.2/contrib/scripts

./ast_tls_cert -d certs –C li374-112.members.linode.com -o serverA

No config file specified, creating 'certs/tmp.cfg'
You can use this config file to create additional certs without
re-entering the information for the fields in the certificate
Creating certs/ca.key
Generating RSA private key, 4096 bit long modulus
..........++
.....................................++
e is 65537 (0x10001)
Enter pass phrase for certs/ca.key:
Verifying - Enter pass phrase for certs/ca.key:
Creating certs/ca.crt
Enter pass phrase for certs/ca.key:
Creating certs/serverA.key
Generating RSA private key, 1024 bit long modulus
...............++++++
....++++++
e is 65537 (0x10001)
Creating signing request
Creating certs/serverA.crt
Signature ok
subject=/CN=li374-112.members.linode.com/O=Asterisk
Getting CA Private Key
Enter pass phrase for certs/ca.key:
Combining key and crt into certs/serverA.pem

En la opción -C se pone el nombre de dominio del servidor (en este caso el nombre de dominio del servidor Linode) y cuando el script lo pide se ingresa una contraseña (por ejemplo servera)

Luego se crea el certificado para el servidorB

./ast_tls_cert -d certs -C li291-216.members.linode.com -o serverB

No config file specified, creating 'certs/tmp.cfg'
You can use this config file to create additional certs without
re-entering the information for the fields in the certificate
Creating certs/ca.key
Generating RSA private key, 4096 bit long modulus
........................++
..............................++
e is 65537 (0x10001)
Enter pass phrase for certs/ca.key:
Verifying - Enter pass phrase for certs/ca.key:
Creating certs/ca.crt
Enter pass phrase for certs/ca.key:
Creating certs/serverB.key
Generating RSA private key, 1024 bit long modulus
....................++++++
..................................++++++
e is 65537 (0x10001)
Creating signing request
Creating certs/serverB.crt
Signature ok
subject=/CN=li291-216.members.linode.com/O=Asterisk
Getting CA Private Key
Enter pass phrase for certs/ca.key:
Combining key and crt into certs/serverB.pem

Cuando lo script pide la contraseña, se pone la misma que se ha utilizado para crear las claves del servidorA (servera)

Ahora se copian los siguientes archivos en la carpeta /etc/asterisk/keys del servidorA:

cd certs

cp ca.crt /etc/asterisk/keys/

cp serverA.pem /etc/asterisk/keys/

Para terminar se modifica la configuración del archivo sip.conf para activar el protocolo TLS y se crea la troncal para el servidorB con autenticación sobre IP:

nano /etc/asterisk/sip.conf

al final de la parte general se pone:

tlsenable=yes
tlsbindaddr=96.126.125.112
tlscertfile=/etc/asterisk/keys/serverA.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscapath=/etc/asterisk/keys
tlsdontverifyserver=yes

en tlsbindaddr se pone la dirección IP del servidorA

al final del archivo se configura la troncal para el servidorB

[serverbtls]
type=peer
context=from-tls
host=66.228.49.216
disallow=all
allow=ulaw
allow=alaw
language=es
qualify=yes
transport=tls
encryption=yes

Los parámetros importantes:

  • context: nombre del contexto donde entrarán las llamadas del servidoB

  • host: la dirección IP del servidorB

  • transport: de define como trasporte de la señalización SIP el protocolo TLS

  • encryption: se activa el cifrado del flujo media (protocolo SRTP)

El protocolo TLS en Asterisk, utiliza el puerto predefinido 5061 TCP. Hay que abrirlo en el firewall para la IP del servidorB

nano /etc/sysconfig/iptables

después de esta línea:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 5060 -j ACCEPT

se pone:

-A INPUT -p tcp -m state --state NEW -m tcp -s 66.228.49.216 --dport 5061 -j ACCEPT

Se guardan los cambios y se reinicia iptables:

service iptables restart

En el dialplan se crea el nuevo contexto:

nano /etc/asterisk/extensions.conf

[from-tls]
exten => 71,1,Answer
same => n,Noop(TLS = ${CHANNEL(secure_signaling)}, SRTP = ${CHANNEL(secure_media)})
same => n,Playback(tt-monkeys)
same => n,Hangup

Con la segunda línea se lee la variable CHANNEL para el cifrado de la señalización y del flujo media. Si el valor es 1 significa que se están utilizando, si el valor es 0, significa que no están activos en el canal en uso.

En el contexto internas se añade.

exten => 71,1,Set(CALLERID(num)=serveratls)
same => n,Dial(SIP/serverbtls/${EXTEN})
same => n,hangup

Servidor B

Se crea la carpeta para los certificados:

mkdir /etc/asterisk/keys

Se vuelve al servidor A y se copian las dos claves:

scp ca.crt root@66.228.49.216:/etc/asterisk/keys

scp serverB.pem root@66.228.49.216:/etc/asterisk/keys

Esto suponiendo que la IP publica del servidorB sea 66.228.49.216

Se abre el archivos sip.conf:

nano /etc/asterisk/sip.conf

y al final de la parte general se pone:

tlsenable=yes
tlsbindaddr=66.228.49.216
tlscertfile=/etc/asterisk/keys/serverB.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscapath=/etc/asterisk/keys
tlsdontverifyserver=yes

en tlsbindaddr se pone la dirección IP del servidorB. Al final del archivo se configura la troncal para el servidorA:

[serveratls]
type=peer
context=from-tls
host=96.126.125.112
disallow=all
allow=ulaw
allow=alaw
language=es
qualify=yes
transport=tls
encryption=yes

Se abre el puerto 5061 TCP en el firewall para la IP del servidorA

nano /etc/sysconfig/iptables

después de esta línea:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 5060 -j ACCEPT

se pone:

-A INPUT -p tcp -m state --state NEW -m tcp -s 96.126.125.112 --dport 5061 -j ACCEPT

Se guardan los cambios y se reinicia iptables:

service iptables restart

Se pasa al dialplan:

nano /etc/asterisk/extensions.conf

Se crea el nuevo contexto:

[from-tls]
exten => 71,1,Answer
same => n,Noop(TLS = ${CHANNEL(secure_signaling)}, SRTP = ${CHANNEL(secure_media)})
same => n,Playback(tt-monkeys)
same => n,Hangup

En el contexto internas se pone:

exten => 71,1,Set(CALLERID(num)=serverbtls)
same => n,Dial(SIP/serveratls/${EXTEN})
same => n,hangup

Se guardan los cambios y se recarga la configuración de ambos servidores:

service asterisk reload

Se averigua en el servidorA que el servidorB esté conectado:

asterisk -rvvvvvvvvvvvvvvv

CLI> sip show peers

serverbtls 66.228.49.216 N 5061 OK (1 ms)

Se hace la misma operación en el servidorB:

CLI> sip show peers

serveratls 96.126.125.112 N 5061 OK (2 ms)

Ahora desde una extensión del servidorA se marca el numero 71 y se mira que pasa en la consola de ambos servidores:

Servidor A:

Executing [71@externas:1] Set("SIP/1000-00000022", "CALLERID(num)=serveratls") in new stack
-- Executing [71@externas:2] Dial("SIP/1000-00000022", "SIP/serverbtls/71") in new stack

Servidor B:

Executing [71@from-tls:1] Answer("SIP/serveratls-00000015", "") in new stack
-- Executing [71@from-tls:2] NoOp("SIP/serveratls-00000015", "TLS = 1, SRTP = 1") in new stack
-- Executing [71@from-tls:3] Playback("SIP/serveratls-00000015", "tt-monkeys") in new stack
-- <SIP/serveratls-00000015> Playing 'tt-monkeys.ulaw' (language 'es')
-- Executing [71@from-tls:4] Hangup("SIP/serveratls-00000015", "") in new stack

Como se puede ver en la consola del servidorB la llamada que llega tiene activado el protocolo TLS (1) y el protocolo SRTP(1). Esto quiere decir que la señalización y el flujo media serán cifrados.

Otra forma de averiguar el cifrado de la señalización SIP es activar con Ngrep la captura en el puerto 5061 en uno de los dos servidores:

ngrep -W byline port 5061

Aparecerán puros bloques cifrados.

Vota el Articulo: 

Promedio: 5 (1 voto)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Conectar dos Servidores Asterisk con TLS y SRTP - Asterisk 1.8.X" Suscribirse a VozToVoice - Todos los comentarios