Enviado por admin el
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.
Comentarios recientes