Redundância com Asterisk

Introdução
Essa documentação tem como intuito mostrar como realizar uma redundância de terminadores VoIP x PSTN em uma Gateway Asterisk, sem interface WEB.

Pra que redundância?
Primeiramente, observe o contexto abaixo:

Suponhamos que a Terminação I seja responsável por conversar com a rede PSTN em todas as chamadas nacionais (^55.*). Quando não temos tratamento de falhas, também chamado aqui de redundância, caso a terminação I para de operar por motivos que não nos interessam até então, seus clientes não conseguirão completar chamadas nacionais.

Requisitos para ter um Asterisk redundante

No cenário que iremos ilustrar, temos um servidor SIP, que encaminha suas chamadas para um Gateway Asterisk e o Gateway encaminha para as terminações. Terminações que por sua vez encaminharão para a rede pública de telefonia (PSTN).
Resumindo: Precisaremos de uma máquina rodando Asterisk com 2 terminações cadastradas.

Revisão das configurações atuais

Primeiramente, entremos no diretório padrão do Asterisk

gateway:~# cd /etc/asterisk/

Agora, vamos revisar a configuração das rotas atuais, no arquivo extensions.conf

gateway:/etc/asterisk# vim extensions.conf

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Terminacao AZUL ;
;;;;;;;;;;;;;;;;;;;
; nacional
exten => _456225#55XXXXXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _456225#55XXXXXXXXX.,n,Dial(SIP/0${EXTEN:9}@terminacao-azul|60)
exten => _456225#55XXXXXXXXX.,n,Hangup
; internacional
exten => _456225#XXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _456225#XXXXXX.,n,Dial(SIP/00${EXTEN:7}@terminacao-azul|60)
exten => _456225#XXXXXX.,n,Goto(r-${DIALSTATUS},1)
exten => _456225#XXXXXX.,n,Hangup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Analizando acima, vemos que toda chamada que chegar no Gateway com prefixo técnico 456225 e caracter separador #, será encaminhado para a terminação azul, com (obviamente) contexto [terminacao-azul] no sip.conf.

Agora, a outra terminação:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Terminacao VERMELHO ;
;;;;;;;;;;;;;;;;;;;;;;;
; nacional
exten => _211219#55XXXXXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _211219#55XXXXXXXXX.,n,Dial(SIP/55${EXTEN:9}@terminacao-vermelho|60)
exten => _211219#55XXXXXXXXX.,n,Hangup
; internacional
exten => _211219#XXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _211219#XXXXXX.,n,Dial(SIP/00${EXTEN:7}@terminacao-vermelho|60)
exten => _211219#XXXXXX.,n,Hangup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Vemos então, que toda chamada entrante com prefixo técnico 211219 e caracter separador # será encaminhado para a terminação vermelho, com também contexto [terminacao-vermelho] no sip.conf.

Observe você, que quando uma chamada chega na terminacao-azul, caso ela não complete, o Gateway derruba a chamada com um HangUP:

exten => _456225#55XXXXXXXXX.,n,Hangup

Agora, vamos implementar a redundância.

Implementando a redundância

O que é bom saber …
Nosso arquivo de configuração de rotas (extensions.conf) deverá conter algumas alterações, enumeradas abaixo:

  • Devemos atribuir o valor da variável EXTEN para uma outra variável.
  • Utilizaremos a função DIALSTATUS para checagem do funcionamento da terminação azul
  • Caso a variável DIALSTATUS retorne algum problema, encaminharemos a chamada para o contexto [rota-de-falha]
  • [rota-de-falha] deve receber os parâmetros da chamada e encaminhar para a terminação vermelho

Legal, tudo bonitinho.
Mas o que é DIALSTATUS?

Em poucas palavras, a função DIALSTATUS checa o status de um terminação e atribui para uma variável DIALSTATUS 3 posições:

  • CONGESTION,
  • BUSY
  • CHANUNAVAIL

O que nos importa saber é que qualquer uma das 3 representa problema.

Enfim, implementando

Já vou adiantar e colocar os arquivos do extensions.conf configurados e enumerados, logo depois segue a explicação.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Terminacao AZUL ;
;;;;;;;;;;;;;;;;;;;

exten => _456225#55XXXXXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _456225#55XXXXXXXXX.,n,Set(FONE=${EXTEN})                      ; (1)
exten => _456225#55XXXXXXXXX.,n,Dial(SIP/0${EXTEN:9}@terminacao-azul|60)
exten => _456225#55XXXXXXXXX.,n,Goto(problema-azul-${DIALSTATUS},1)  ; (2)
exten => _456225#55XXXXXXXXX.,n,Hangup
; internacional
exten => _456225#XXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _456225#XXXXXX.,n,Dial(SIP/00${EXTEN:7}@terminacao-azul|60)
exten => _456225#XXXXXX.,n,Goto(problema-azul-${DIALSTATUS},1)                      ; (2)
exten => _456225#XXXXXX.,n,Hangup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Terminacao VERMELHO ;
;;;;;;;;;;;;;;;;;;;;;;;
; nacional
exten => _211219#55XXXXXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _211219#55XXXXXXXXX.,n,Dial(SIP/55${EXTEN:9}@terminacao-vermelho|60)
exten => _211219#55XXXXXXXXX.,n,Hangup
; internacional
exten => _211219#XXXXXX.,1,Set(CDR(accountcode)=${EXTEN:0:6})
exten => _211219#XXXXXX.,n,Dial(SIP/00${EXTEN:7}@terminacao-vermelho|60)
exten => _211219#XXXXXX.,n,Hangup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Tratamentos – Rotas de Falha ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => problema-azul-CONGESTION,1,Goto(rota-de-falha|vermelho|1)  ; (3)
exten => problema-azul-BUSY,1,Goto(rota-de-falha,vermelho,1)        ; (4)
exten => problema-azul-CHANUNAVAIL,1,Goto(rota-de-falha|vermelho|1) ; (5)

[rota-de-falha]
; falha pela tellfree
exten => vermelho,1,Set(CDR(accountcode)=ROTA-DE-FALHA-VERMEHO)
exten => vermelho,n,Dial(SIP/${FONE:7}@terminacao-vermelho|60)  ; (6)
exten => vermelho,n,Hangup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  • (1) => Variável FONE recebe o valor da variável EXTEn, que contem o número a ser chamado. Este pŕocedimento é feito pois no ítem 7, a terminacao vermelho irá fechar a chamada encaminhando o valor de FONE, porque o valor de EXTEN foi alterado. Observe:

exten => _456225#55XXXXXXXXX.,n,Set(FONE=${EXTEN})

  • (2) => Checa o valor de DIALSTATUS. Caso CONGESTION, BUSY ou CHANUNAVAIL, altera o tráfego da chamada para “problema-azul”, ítem 3. Observe:

exten => _456225#XXXXXX.,n,Goto(problema-azul-${DIALSTATUS},1)

  • (3) => Recebe a chamada redirecionada anteriormente. Aí sim a chamada, com probelema CONGESTION, é redirecionada para “rota-de-falha”, observe:

exten => problema-azul-CONGESTION,1,Goto(rota-de-falha|vermelho|1)

  • (4) => Ídem ao 3, só que com problema BUSY. Observe:

exten => problema-azul-BUSY,1,Goto(rota-de-falha,vermelho,1)

  • (5) => Ídem ao 4, só que com problema CHANUNAVAIL. Observe:

exten => problema-azul-CHANUNAVAIL,1,Goto(rota-de-falha|vermelho|1)

  • (6) => Chamada finalizada! Observe o DIAL para a terminacão vermelho:

exten => vermelho,n,Dial(SIP/${FONE:7}@terminacao-vermelho|60)

Bom, é isso aí! 🙂

Deixe um comentário