Você está na página 1de 4

DUNDi pt.

Este artigo é sobre o “protocolo de rotamento DUNDi”, esse que vem integrado com o Asterisk desde os
primórdios (desde a versão 1.0). Este artigo é dividido em duas partes, a primeira com uma explicação do que é o
DUNDi e como funciona basicamente. A segunda parte abrangerá as configurações.

Como foi colocado acima, o DUNDi não é um procolo VoIP e sim um sistema p2p (peer-to-peer) para rotear
chamadas VoIP entre serviços de telefonia, sendo as chamadas realizadas por protocolos padrões, tais como IAX, SIP,
H323. O DUNDi pode ser usado para criar um servidor de comunicação (ele pode ser usado tanto para gateways VoIP
quanto para Asterisk ou integrar os dois via VoIP) sem pontos centrais de falha e, arbitrariamente, qualquer
mudança de extensões, falhas e adições na sua rede são automaticamente absorvidas para dentro da nuvem sem
nenhuma configuração adicional, ficando assim transparente para o usuário.

Com o surgimento da tecnologia VoIP surgiu junto um grande problema. Como rotear as ligações entre a
PSTN¹ e a internet? Para isso -em meados de 1997- a ITU-T² criou um padrão chamado ENUM. O padrão ENUM³ é
basicamente a convergência de ligações da PSTN para a rede de protocolos da internet (IP). Em uma forma
simplificada, o ENUM é o padrão criado para mapear os números de uma operadora VoIP para seu respectivo nome
de domínio (DNS). Por causa dele nós podemos ligar de uma linha analógica ou digital para uma linha VoIP,
fantástico não é? Não irei me aprofundar no assunto, pois tem muita coisa e acabaremos perdendo o foco, mas se
quiserem ler mais sobre o assunto tem algumas referências abaixo (ou pesquisem sobre ENUM, RFC3761 e E.164).
Baseado no ENUM, Mark Spencer criou um protocolo mais flexível e descentralizado e chamou seu novo filho de
DUNDi (Distributed Universal Number Discovery). Vamos começar com uma explicação básica de funcionamento:

Extensões:

Servidor1 >> 8XXX


Servidor2 >> 8XXX

O ramal 8026 está logado no servidor1 e quer discar para o ramal 8101, então o servidor1 checará se o ramal
está logado. Porém ramal não está logado no servidor1. E agora José? O servidor1 irá solicitar para o DUNDi verificar
se a extensão está logada nas rotas conhecidas. Então ele envia uma requisição para o servidor2 e ele responde:
“Ow yeah baby, esta extensão está logada aqui. Para alcançá-la utlize: IAX2/user:pass@servidor2/8101″. O servidor1
encaminha a ligação para o destino que o servidor2 recomendou! É assim que funfa o DUNDi! Muito mais fácil do
que imaginavam, não é?

Vamos supor que o ramal 8026 quer chamar novamente o ramal 8101, porém o ramal 8101 não está
registrado em nenhum dos dois servidores! Então o servidor1 realizará os mesmo procedimentos anteriores. Checa
internamente se o ramal está logado e não o encontra logado, então ele envia a requisição para o servidor2, porém
o servidor2 responde que não encontrou o ramal logado. Sendo assim o servidor2 envia uma resposta negativa para
o servidor1. Quando o servidor1 receber a resposta do servidor2 ele enviará uma resposta de “not found” para o
ramal 8026, que será convertida no famoso tutu (tom de ocupado).

Na próxima parte colocarei as configurações básicas e estarei postando provavelmente manhã à noite ou
sábado.

[1] http://www.normes-internet.com/normes.php?rfc=rfc3761&lang=pt
[2] http://www.enum.org/what.html
[3] http://www.dundi.com/
[4] http://en.wikipedia.org/wiki/E.164
¹ PSTN é a nuvem de telefonia pública (Public switched telephone network).
² ITU-T é uma agência intergovernamental que cria referências para o setor de telecomunicações.
(Telecommunication Standardization Sector).
³ ENUM é um nome para o título RFC3761. Existe também o RFC2916 que é a versão obsoleta do ENUM atual.

DUNDi pt. 2

Servidor1: ip = 192.168.0.1/24
Servidor2: ip = 192.168.0.2/24

OBS1.: Todas as configurações mostradas serão realizadas no servidor1. Para o servidor2 será igual, só invertendo os
campos definidos. Exemplo: Quando apontar para o ip do servidor2, a configuração do servidor2 irá apontar para o
ip do servidor1 e assim por diante.

No último artigo descrevi um pouco da história do DUNDi, neste colocarei as configurações. Vamos começar
com o entroncamento IAX2 entre os servidores.

#cd /etc/asterisk/
#vim iax2.conf

Dentro do arquivo crie ( crtl+c / crtl+v :p ):

[dundi]
type=friend
dbsecret=dundi/secret
context=entradaDUNDi

O parâmetro “dbsecret” é a senha usada pelo DUNDi, o “dundi/secret” é a senha do DUNDi no AstDB. Ele
gerará uma nova à cada hora. Você pode checar no console do asterisk com o comando:

Asterisk*CLI> database show

Agora vamos partir para o dundi.conf. Neste arquivo você setará as relações entre servidores e suas
respectivas respostas. O DUNDi usa sua própria porta de comunicação e troca de mensagens. Esta porta é a UDP
4520. As ligações serão transportadas pelo canal IAX2, ou seja, a comunicação do DUNDi e as ligações não são
transportadas juntas. Vamos ao arquivo do servidor1:

# vim dundi.conf

[general]
department=Departamento da empresa
organization=Nome da Empresa
locality=Cidade
stateprov=Estado
country=País
email=Seu email
phone=Seu telefone
What hell??? Para o que servirá isso? Simples! Da mesma forma que você pode utilizar o DUNDi localmente
entre dois servidores, você poderá criar uma super ultra mega rede com o DUNDi. Imagine que você tenha 10
servidores interligados via DUNDi? Essas configurações irão ajudá-lo a interpretar as comunicações entre os
servidores (saber quem tá enviando e recebendo requisições.) e saber em qual você está mexendo. Isso é muito
utilizado em configurações de roteadores (de uma forma diferente é claro).

;bindaddr=0.0.0.0

;port=4520

entityid=00:B0:D0:CC:5C:E8 ;Coloque o mac-address de sua NIC aqui. Por default ele pegará a primeira placa
configurada.

cachetime=5 ;Define o tempo de validade de uma consulta DUNDi. Serve para evitar loops infinitos de consulta.

ttl=2 ;Define o número de saltos que o pedido DUNDi pode possuir antes de ser descartado.

autokill=yes ;Define o que acontece quando um ACK não é recebido depois de 2 segundos. No caso de “yes” ele
derruba a chamada.

[mappings]
dundi=>dundiExtens,0,IAX2,dundi:${SECRET}@192.168.0.1/${NUMBER},nopartial

O mapeamento segue a seguinte sintaxe:

dundiContext => dundiExtens,peso,tecnologia,destino[,opções]

dundiContext: Nome do contexto utilizado pelo DUNDi em suas consultas.

dundiExtens: Nome do contexto que o DUNDi verificará se o ramal existe.

peso: É o peso para resposta de verificação. Quanto menor o valor, maior prioridade.

tecnologia: Tecnologia do ramal desejado. Ex.: SIP.

destino: Define o destino para encontrar o ramal desejado.

opções: São opções para o mapeamento. No caso foi definido “nopartial” (Sem parcial), ou seja, o
DUNDi só proverá a resposta se o requisição bater exatamente com as extensões que ele possui.

[00:B0:D0:CB:80:7A] ;Mac do servidor2


model = symmetric
host = 192.168.0.2 ;IP do servidor2
inkey = dundi
outkey = dundi
include = priv
permit = priv
qualify = yes
order = primary
Os servidores usarão a mesma chave (inkey e outkey). Para gerar as chaves:

#cd /var/lib/asterisk/keys
#astgenkey -n priv

O comando irá criar dois novos arquivos neste diretório que são: priv.key e priv.pub. Agora copie as duas
chaves para o sevidor2.

IMPORTANTE: insira a linha “regexten=dundiExtens” no generals do sip.conf. Com essa linha o ramal sip que se logar
irá inserir uma extensão no contexto dundiExtens. Assim quando o DUNDi for procurar pela extensão no
dundiExtens, ela estará lá!

Vamos configurar o extensions.conf do servidor1:

#vim extensions.conf

[ramais] ;Contexto dos seus ramais internos.


exten => _8XXX,1,ChanIsAvail(SIP/${EXTEN}) ;Checa se o ramal está registrado.
exten => _8XXX,2,GotoIf( $[ "${AVAILCHAN}" = "5" ]?dundi:disca) ;AVAILCHAN = 5 significa que o ramal está
UNAVALIABLE (não está registrado).
exten => _8XXX,3(disca),Dial(SIP/${EXTEN},120,Ttr)
exten => _8XXX,4,Hangup()
exten => _8XXX,5(dundi),Goto(dundiLookup,${EXTEN},1
exten => _8XXX,6,Hangup()

[dundiLookup] ;Envia a requisição para o DUNDi.


switch => DUNDi/dundi

[dundiExtens] ;Quando os ramais se registrarem serão inseridos aqui.

[entradaDundi] ;Configurado no tronco IAX2.


exten => _8XXX,1,Goto(ramais,${EXTEN},1)

Salve o arquivo e entre no console do Asterisk.

Asterisk*>reload

Agora é só realizar as configurações no servidor2!


OBS2.: Os módulos usados à principio carregam automaticamente com o Asterisk. Caso não ocorra, abra o
arquivo /etc/asterisk/modules.conf e insira as seguintes linhas:

load => pbx_dundi.so


load => res_crypto.so
load => app_chanisavail.so

OBS3.: As configurações aqui foram realizadas no Asterisk versão 1.6.0.24. Portanto, se você usa outra versão, leia os
samples dos arquivos para realizar as modificações necessárias para sua versão.