Académique Documents
Professionnel Documents
Culture Documents
ISBN: 978-85-906904-1-2
Algumas vezes, aps terminar um trabalho, eu me pergunto qual o valor que ele tem para o
pblico que o vai adquirir. O OpenSER uma plataforma sofisticada de telefonia IP. Dando
suporte a instalaes com alguns milhes de assinantes, ele capaz de suportar at mesmo
redes NGN em pequenos pases em desenvolvimento. O uso de software livre, e minha
opinio muda o balano do poder. Antes, pases e empresas estavam submetidos ao poder dos
fabricantes dos equipamentos de telefonia que detinham toda a informao para construo e
operao deste tipo de central. Agora, com software livre, mesmo que voc adquira de um
fabricante tradicional, o equilbrio maior, pois a tecnologia est disponvel para todos. No
ltimo ano no s vi um aumento do uso de software livre, mas uma sensvel reduo de
custos nas plataformas tradicionais, seja na forma de reduo efetiva de preos, seja na forma
de incorporao de funcionalidades antes vendidas separadamente.
O valor deste trabalho ema minha opinio permitir que em pouco mais de uma semana
ocorra no conhecimento de telefonia IP com SIP e OpenSER de quem puder se dedicar a ele.
Atravs de uma seqncia didtica possvel acelerar a curva de crescimento at o ponto de
ter um sistema funcionando.
Ns estamos iniciando uma nova era na rea de colaborao. Voz e vdeo sobre IP esto
comeando a dominar o mundo das telecomunicaes em um movimento de ruptura capaz
de mudar toda a indstria. A tecnologia SIP (Session Initiation Protocol) est no centro desta
revoluo. Eu acredito que o SIP no momento o protocolo mais usado para Voz e Vdeo
sobre IP.
No futuro, quando as pessoas aprenderem a usar a tecnologia, o SIP ser para as
comunicaes de voz o que o e-mail hoje para as comunicaes em texto. Ns estamos
comeando com ilhas SIP dentro dos provedores de VoIP, empresas e mesmo governos. Em
um futuro prximo, as barreiras entre as ilhas sero quebradas e voc poder se comunicar
com qualquer um em qualquer lugar sem pagar nenhuma tarifa.
As nicas tarifas que voc vai pagar no futuro so o acesso a rede de dados, por causa da
disponibilidade de voz e vdeo sobre IP, tudo em breve ser apenas comunicao de dados.
Eu me lembro dos primeiros dias do e-mail no incio dos anos 90. Levou algum tempo at
que todos tivessem um endereo de e-mail. A mesma coisa poderia estar acontecendo agora
no mundo SIP. Infelizmente, os provedores SIP ainda se comportam como ilhas no
permitindo o roteamento entre domnios.
Com a introduo do 3G, 4G e WiMAX, as comunicaes de dados em alta velocidade esto
se tornando amplamente disponveis na indstria de telefonia mvel. Novos telefones de
fabricantes conhecidos esto comeando a suportar WiFI, WiMax e obviamente 3G. Os
clientes SIP podem rodar nestas plataformas o que pode potencialmente mudar toda a
indstria em um futuro prximo.
claro, as companhias telefnicas iro tentar, legitimamente, proteger suas fontes de receita,
mas elas no podem esconder a infra-estrutura SIP j instalada. Lentamente, os usurios vo
comear a usar os clientes SIP em seus telefones mveis cortando os custos de comunicao.
O movimento, mesmo sem um grande patrocinador acabar sendo espalhado de boca em
boca at se tornar um fenmeno comum como o e-mail.
i
A infra-estrutura necessria para as comunicaes em SIP tem no seu componente principal
um servidor SIP Proxy. O OpenSER um dos melhores SIP Proxies disponveis no
mercado. Ele robusto, escalonvel e licenciado de acordo com a licena GNU GPL. A idia
deste livro ensinar como implantar a arquitetura do protocolo SIP usando o OpenSER. Eu
espero que este livro ajude a voc, se voc est aprendendo SIP, ou a implantar uma infra-
estrutura na sua companhia, escola ou governo. Eu desejo a voc sucesso na sua implantao
e sinceramente espero que este material o ajude.
ii
Audincia
Este livro para pessoas com algum conhecimento em telefonia IP e SIP. Conhecimento de
Linux indispensvel para realizar os laboratrios deste livro. recomendvel conhecimento
em VoIP sem o qual alguns assuntos podem demorar a ser entendidos.
Sobre o Autor
Flvio E. Gonalves nasceu em 1966 em Minas Gerais, Brasil. Tendo sempre sido um
aficionado por computadores, ganhou o seu primeiro computador pessoal em 1983 e desde
ento tem sido quase um vcio. Formou-se em engenharia em 1989 com foco em desenho e
manufatura auxiliada por computador.
Atualmente ele o Diretor Presidente da V.Office Solues em Redes e Telecomunicaes,
uma empresa de consultoria e treinamento dedicada as reas de redes, segurana,
telecomunicaes e software bsico desde 1996. Desde 1993 participou de vrios programas
de certificao tendo sido certificado como Novell MCNI/MCNI, Microsoft MCSE/MCT,
Cisco CCSP/CCNP/CCDP, Asterisk dCAP entre outras.
Ele comeou a escrever sobre software com cdigo aberto porque acredita que a forma como
os programas de certificao eram organizados no passado era boa para os que queriam
aprender. Alguns livros hoje so escritos por pessoas extremamente tcnicas que, as vezes
no tem uma idia clara de como as pessoas aprendem. Ele tentou usar sua experincia de 15
anos como instrutor para ajudar as pessoas a aprenderem software de telefonia de cdigo
aberto. Sua experincia com redes, analisadores de protocolo e telefonia IP, combinadas com
sua experincia de ensino, deram a ele um diferencial para escrever este livro. Este o
segundo livro que ele escrever, o primeiro foi o Guia de Configurao para o Asterisk PBX.
Como CEO da V.Office, Flavio E. Gonalves balanceia seu tempo entra a famlia, trabalho e
diverso. Ele pai de dois filhos e mora em Florianpolis, SC, Brasil. Ele pode ser contatado
em flavio@asteriskguide.com
Agradecimentos
Eu gostaria de agradecer a Guilherme Goes que escreveu boa parte do captulo 6 e
desenvolveu o SerMyAdmin para este livro, A Bogdan Andrei Iancu por ter revisado vrias
sees o que permitiu melhorar sensivelmente os scripts e tambm a todos os alunos que
assistiram o Curso de OpenSER antes e deram um bom feedback usado no livro.
iii
ndice
Introduo ao SIP .................................................................................................................... 1
Objetivos deste captulo ......................................................................................................... 1
Teoria bsica de operao do SIP .......................................................................................... 2
Exemplo de uma mensagem SIP........................................................................................ 2
SIP URIs ............................................................................................................................ 2
O trapezide SIP ................................................................................................................ 3
Componentes de uma rede SIP .............................................................................................. 4
Processo de Registro do SIP .............................................................................................. 5
Operao do SIP em modo Proxy. ..................................................................................... 6
Operao em modo de redirect. ......................................................................................... 6
Mensagens Bsicas ................................................................................................................ 6
Fluxo de um dilogo SIP........................................................................................................ 7
Transaes e dilogos no SIP .............................................................................................. 13
O protocolo RTP .................................................................................................................. 14
Codecs .................................................................................................................................. 14
DTMF-Relay ........................................................................................................................ 14
Real Time Control Protocol - RTCP.................................................................................... 14
Session Description Protocol - SDP .................................................................................... 15
O Protocolo SIP e o modelo OSI. ........................................................................................ 16
Viso geral de um provedor VoIP ....................................................................................... 16
Sumrio ................................................................................................................................ 18
SIP Express Router ................................................................................................................ 19
Onde ns estamos? ............................................................................................................... 19
O que o SIP Express Router? ............................................................................................ 20
Lista de recursos e cenrios de uso. ..................................................................................... 21
Cenrios de uso .................................................................................................................... 21
Provedores de Internet de valor agregado ........................................................................ 21
Provedores de Telefonia IP .............................................................................................. 21
Telefonia IP em universidades e na Internet II ................................................................ 21
Concentrador de telefonia para empresas do tipo .com e .gov ............................... 22
Arquitetura do OpenSER e o arquivo openser.cfg............................................................... 23
Ncleo e mdulos ............................................................................................................ 23
Sees do arquivo openser.cfg ......................................................................................... 24
iv
Sesses, Dilogos e Transaes. ...................................................................................... 24
Processamento de mensagens no openser.cfg .................................................................. 25
Comportamento esperado de um SIP Proxy .................................................................... 25
Operao em modo stateful .............................................................................................. 26
Validao do pedido ........................................................................................................ 26
Pr-processamento das informaes de roteamento. ....................................................... 26
Determinando os alvos dos pedidos ................................................................................. 27
Encaminhamento do pedido ............................................................................................. 27
Processamento da Resposta ............................................................................................. 27
Diferenas entre Strict Routing e Loose Routing ................................................................ 28
Entendendo SIP e RTP......................................................................................................... 29
Sumrio ................................................................................................................................ 30
Instalando o OpenSER .......................................................................................................... 31
Onde estamos? ..................................................................................................................... 31
Necessidades de Hardware .................................................................................................. 31
Instalando o Linux para o OpenSER ................................................................................... 32
Baixando e instalando o OpenSER. ................................................................................. 40
Rodando o OpenSER no boot do Linux .......................................................................... 41
Estrutura de diretrios do OpenSER v1.2 ............................................................................ 42
Arquivos de Log .................................................................................................................. 43
Comandos de inicializao .................................................................................................. 43
Sumrio ................................................................................................................................ 43
Configurao padro. ............................................................................................................ 45
Onde estamos? ..................................................................................................................... 45
Configurao padro ............................................................................................................ 46
Listagem e descrio dos comandos .................................................................................... 46
Anlise do arquivo padro ................................................................................................... 49
Usando a configurao padro. ............................................................................................ 53
Conceitos bsicos de roteamento SIP .................................................................................. 54
Transaes e dilogos ...................................................................................................... 54
Pedidos Iniciais e Seqenciais ......................................................................................... 55
Roteamento no contexto de uma transao ...................................................................... 55
Roteamento no contexto de um dilogo........................................................................... 56
Lab. Verificando um dilogo completo ........................................................................... 56
Lab. Rodando sem estado (stateless) ............................................................................... 58
v
Lab. Desabilitando o registro de rotas (Record-route)..................................................... 59
Sumrio ............................................................................................................................ 59
Autenticao com MySQL .................................................................................................... 60
Onde estamos? ..................................................................................................................... 61
O modulo Auth_DB ............................................................................................................. 61
Seqncia de autenticao para pedidos de registro: ........................................................... 62
Captura de uma seqncia de registro. ............................................................................ 62
Trecho do cdigo de registro com autenticao. ............................................................. 64
Seqncia de autenticao do INVITE ................................................................................ 64
Seqncia de pacotes de um pedido do tipo INVITE. ..................................................... 65
Trecho do cdigo do INVITE .......................................................................................... 66
Autenticao do tipo Digest ................................................................................................. 66
O cabealho WWW-Authenticate Response ................................................................ 67
O cabealho Authorization Request ............................................................................. 67
QOP Qualidade da proteo.......................................................................................... 68
Instalando o suporte ao MySQL. ......................................................................................... 68
Anlise do arquivo openser.cfg............................................................................................ 72
O script openserctl ............................................................................................................... 74
Arquivo de recursos do Openserctl ...................................................................................... 76
Laboratrio: Autenticao. .............................................................................................. 78
Melhorando o script ............................................................................................................. 80
Gerenciando mltiplos domnios ......................................................................................... 80
Rotas alternativas ................................................................................................................. 81
Pedidos do tipo REGISTER............................................................................................. 81
Pedidos diferentes de REGISTER route[3] .................................................................. 81
Gerenciando chamadas do mesmo domnio .................................................................... 83
As funes check_to() e check_from() ................................................................................ 84
Usando Aliases..................................................................................................................... 84
Tratando pedidos do tipo CANCEL e re-transmisses. ....................................................... 85
Script completo com todos os recursos acima. .................................................................... 85
Melhorando a segurana ...................................................................................................... 89
Aliases .................................................................................................................................. 89
Sumario ................................................................................................................................ 89
Portal de usurios com serMyAdmin ................................................................................... 91
SerMyAdmin........................................................................................................................ 91
vi
Instalando o SerMyAdmin ................................................................................................... 92
Tarefas bsicas ..................................................................................................................... 97
Gerenciamento de domnios .......................................................................................... 101
Customizao de interface ............................................................................................. 101
Sumrio .............................................................................................................................. 102
Conectividade com a rede pblica ...................................................................................... 103
Onde estamos? ................................................................................................................... 104
Mensagens enviadas para o gateway ................................................................................. 104
Mensagens vindas do gateway ........................................................................................... 106
Script de configurao ....................................................................................................... 108
Dissecando o arquivo openser.cfg ..................................................................................... 113
Usando Asterisk como um gateway................................................................................... 115
Using LCR (least cost routes) ............................................................................................ 118
O mdulo LCR ............................................................................................................... 118
Plano de discagem para o OpenSER .............................................................................. 119
A tabela LCR ................................................................................................................. 119
A tabela de gateways ..................................................................................................... 120
A tabela grupo de gateways ........................................................................................... 120
Gerenciando rotas e gateways ........................................................................................ 120
Comandos openserctl relacionados .................................................................................... 120
LAB Usando o recurso de LCR ...................................................................................... 122
Sumrio .............................................................................................................................. 128
Encaminhamento de chamadas .......................................................................................... 129
Verificando seu progressso? .............................................................................................. 129
Encaminhamento de Chamadas ......................................................................................... 130
Pseudo-variveis ................................................................................................................ 131
Tabela de pseudo-variveis do OpenSER verso 1.1 .................................................... 131
Viso geral dos pares atributo:valor (AVPairs) ................................................................. 133
Carga e parametrizao do avpops. ............................................................................... 135
Implementando siga-me incondicional .............................................................................. 135
LAB Implantando o recurso de siga-me ..................................................................... 136
Implementando siga-me (ocupado, no atende) ................................................................ 137
Dissecando o arquivo de configurao .............................................................................. 145
Lab - Testando o encaminhamento de chamadas. ............................................................. 146
Sumrio .............................................................................................................................. 147
vii
Tcnicas de travessia de NAT ............................................................................................. 148
Onde estamos? ................................................................................................................... 149
Tipos de NAT .................................................................................................................... 149
Full Cone (Cone Completo) ........................................................................................... 149
Restricted Cone (Cone Restrito) .................................................................................... 150
Port Restricted Cone (Cone restrito por porta) .............................................................. 150
Simtrico ........................................................................................................................ 151
Resumo dos tipos de Firewall ............................................................................................ 152
Formas de Resolver o problema do NAT .......................................................................... 152
Soluo para a sinalizao SIP (RFC3581) ....................................................................... 152
Resolvendo o problema de travessia dos pacotes RTP ...................................................... 153
Recebendo pedidos de registro atrs de NAT. ................................................................... 154
Determinando se o cliente est atrs de NAT. ............................................................... 154
Mensagem do tipo INVITE atrs de NAT ......................................................................... 155
Tratando as respostas ......................................................................................................... 157
Instalao e configurao do Media Proxy ........................................................................ 157
Instalao propriamente dita .......................................................................................... 157
Anlise do arquivo openser.cfg.......................................................................................... 161
Carga dos mdulos ......................................................................................................... 161
Parametrizao dos mdulos: ........................................................................................ 161
Tratamento das mensagens de REGISTER ................................................................... 162
Tratamento das mensagens de INVITE ......................................................................... 163
Tratamento das mensagens de BYE e CANCEL ........................................................... 163
Tratamento dos RE-INVITES........................................................................................ 164
Tratamento de mensagens para fora do nosso domnio ................................................. 165
Tratamento das respostas (on_reply_route). .................................................................. 165
Roteamento ........................................................................................................................ 166
Representao grfica do script ......................................................................................... 175
Seqncia dos pacotes.................................................................................................... 175
LAB Usando o mediaproxy para travessia de NAT. ...................................................... 181
Usando STUN .................................................................................................................... 182
Porque o STUN no funciona com NAT simtrico? ..................................................... 184
ALG Application Layer Gateways ................................................................................. 184
ICE (Interactive Connection Establishment) ..................................................................... 184
Sumrio .............................................................................................................................. 184
viii
Bilhetagem usando Radius e CDRTool .............................................................................. 186
Onde estamos? ................................................................................................................... 186
Como feita a contabilizao ............................................................................................ 187
Configurando e Instalando a Bilhetagem ........................................................................... 188
LAB Implementando a contabilizao com MySQL...................................................... 188
Dissecando o arquivo openser.cfg ..................................................................................... 194
Contabilizao usando um servidor Radius ....................................................................... 195
Instalao do FreeRadius. .................................................................................................. 196
Instalao dos pacotes .................................................................................................... 196
Crie e configure a base de dados do Freeradius ............................................................. 196
Configurao do Freeradius server .................................................................................... 197
Configure o client do Radius (radiusclient-ng) .................................................................. 198
Configure o OpenSER ....................................................................................................... 199
Teste a configurao fazendo uma ligao .................................................................... 199
Timestamp = 1142177368 ...................................................................................... 201
Tarifao com o CDRTool................................................................................................. 201
LAB. Instalao do CDRtool ............................................................................................. 201
LAB Usando o CDRTool............................................................................................ 206
Arquitetura do CDRTool ................................................................................................... 215
Como o CDRTool tarifa uma chamada ............................................................................. 215
Lab. Criando e aplicando um plano de tarifao ............................................................... 217
Sumrio .............................................................................................................................. 219
Objetivos ............................................................................................................................ 220
Onde estamos? ................................................................................................................... 220
Ferramentas prprias do OpenSER .................................................................................... 221
Ferramentas de trace e captura de pacotes ......................................................................... 222
Tshark e Wireshark ........................................................................................................ 222
O mdulo SIPTRACE.................................................................................................... 226
Ferramentas para testes de Stress ....................................................................................... 226
Sipsak ............................................................................................................................. 226
SIPp ................................................................................................................................ 227
Teste de stress da sinalizao SIP .................................................................................. 227
Teste de stress da sinalizao RTP ................................................................................ 229
Testando o MediaProxy ................................................................................................. 230
Ferramentas de monitoramento.......................................................................................... 230
ix
Sumrio .............................................................................................................................. 231
Expresses regulares ............................................................................................................ 232
Viso geral das expresses regulares. ............................................................................ 232
Cdigo de Status das Mensagens ........................................................................................ 235
Tabela de Cdigos de Mensagem ...................................................................................... 235
Definies usadas no SIP ..................................................................................................... 238
x
1
Introduo ao SIP
O SIP hoje um dos protocolos mais usados em voz sobre IP. Conhecer um pouco
sobre o este protocolo essencial no entendimento de um sistema de telefonia IP.
O protocolo SIP, Session Initiation Protocol est descrito principalmente em duas
RFCs Request for Comments, RC2543 e RFC3261 que tambm conhecida como
SIP verso 2. O SIP um protocolo da camada de aplicao usado para estabelecer,
modificar e terminar sesses ou chamadas multimdia. Essas sesses podem ser
conferncias, e-learning, telefonia pela Internet e aplicaes similares.
Ele um protocolo baseado em texto, similar ao HTTP e SMTP, desenhado para
iniciar, manter e terminar sesses de comunicao interativa entre usurios. Tais
sesses incluem: voz, vdeo, chat, jogos interativos e realidade virtual. Ele foi
definido pela IETF e vem se tornando o padro de fato em telefonia IP.
SIP URIs
Os endereos SIP so conhecidos como SIP URI (Indicador de recursos uniforme). A
URI um tipo geral de endereo usado na Internet. Ele contm informaes sobre o
servidor e o recurso a ser contatado. O esquema da URI contm o protocolo a ser
usado.
Exemplos de esquema da URI:
sips:johndoe@sipA.com
sip:johndoe@sipA.com
Voc pode tambm incluir parmetros de usurio junto com a URI tal como mostrado
abaixo:
sip:johndoe@sipA.com;user=John Doe
a parte domnio da URI pode ser resolvida por um servidor DNS. Os lookups de DNS
podem ser usados para determinar:
Os protocolos de transporte usando registros do tip NAPTR.
The IP address of the server using SRV or A records
The transport protocol to be used to reach the SIP server (UDP, TCP, SCTP or
TLS).
muito importante configurar corretamente os registros de nome de domnio antes de
implantar um SIP Proxy.
1 | Introduo ao SIP 2
O trapezide SIP
Na arquitetura SIP, ns usamos agentes usurio e servidores. O SIP usa um modelo
distribudo ponto-a-ponto usando um servidor de sinalizao. O servidor gerencia
apenas a sinalizao, enquanto os agentes usurio e os agentes servidores manuseiam
a sinalizao e a mdia (audio, vdeo, etc...). Veja figura abaixo:
1 | Introduo ao SIP 4
UAS (user agent server) servidor que responde a sinalizao SIP de
um UAC.
UA (user agent) terminal de rede SIP (telefones SIP, ou gateway para
outras redes), contm UAC e UAS.
Servidor Proxy Recebe pedidos de conexo de um UA e transfere-o
para outro servidor Proxy se a estao em particular no est em sua
administrao.
Servidor de Redirecionamento Recebe pedidos de conexo e envia-
os de volta ao emissor incluindo os dados de destino ao invs de envi-
los diretamente parte chamada.
Servidor de localizao recebe pedidos de registro de um UA e
atualiza a base de dados de terminais com eles.
Todas as sees do servidor (Proxy, Redirect e Location) esto tipicamente
disponveis em uma nica mquina fsica chamada Proxy Server, que responsvel
pela manuteno da base de dados de clientes, estabelecimento de conexes,
manuteno e trmino e redirecionamento de chamadas.
Mensagens Bsicas
As mensagens bsicas enviadas em um ambiente SIP so:
1 | Introduo ao SIP 6
As respostas para as mensagens do protocolo SIP so criadas em formato texto como
no protocolo HTTP. Aqui esto as respostas mais importantes.
1 | Introduo ao SIP 8
A primeira linha da mensagem contm o nome do mtodo. As linhas que seguem
fazem parte da lista dos campos cabealho. Este exemplo contm o conjunto mnimo
necessrio. Estes campos so rapidamente descritos abaixo:
VIA contm o endereo para o qual o usurioA est esperando receber respostas a
este pedido. Ele tambm contm um parmetro branch que identifica esta transao.
TO contm um nome (display name) e um SIP ou SIPS URI
(sip:usuarioB@sip.com.br) para o qual o pedido foi originalmente direcionado.
FROM tambm contm um nome (display name) e SIP ou SIPS URI
(sip:usuarioA@sip.com.br) que indica o originador da chamada. Este campo
cabealho tem um parmetro etiqueta (tag) contendo uma string aleatria
(1234567890) que foi adicionada ao URI pelo telefone IP ele usado para propsitos
de identificao.
CALL-ID contm um identificador globalmente nico para esta chamada, gerado
pela combinao de uma string aleatria e o nome do host ou endereo IP do telefone
IP. A combinao da etiqueta TO, FROM e CALL-ID definem completamente uma
relao SIP fim-a-fim (peer-to-peer) tambm conhecida como dilogo.
CSEQ ou seqncia de comandos contm um inteiro e um nome de mtodo. O
nmero CSEQ incrementado para cada novo pedido dentro de um dilogo e um
nmero de seqncia tradicional.
CONTACT contm um URI SIP ou SIPS que representa uma rota direta para
contatar o usuarioA, usualmente composta de um nome de usurio em um domnio
totalmente qualificado (FQDN). Como nem sempre alguns sistemas tm um domnio
registrado, endereos IP so permitidos. Enquanto o campo VIA diz aos outros
elementos para onde enviar uma resposta, o campo CONTACT diz aos outros
elementos para onde enviar requisies futuras.
1 | Introduo ao SIP 10
(8) Quando o usurio A recebe o 180 (ringing), ele passa esta informao ao
telefoneA que vai soar o udio de tocando (ringback) e/ou mostrar a
mensagem na tela do usuarioA.
(9) Neste exemplo, o usurioB decide atender a chamada. Quando ele pega o
handset, este telefone SIP envia uma resposta 200(OK) para indicar que a
chamada foi respondida. O 200(OK) contm no corpo da mensagem com a
descrio da sesso usando o protocolo SDP. Como resultado, existe uma
troca em duas fases das mensagens SDP de A para B e de B para A. Este
recurso do SDP possui uma capacidade bsica de negociao dos recursos
em um modelo simples de oferta/resposta. Se o usurioB no quiser
responder a chamada ou estiver ocupado, um erro ser enviado ao invs do
200(OK). A mensagem 200(OK) algo como aparece abaixo:
INVITE(1)
INVITE(3)
100 Trying (2)
INVITE(5)
100 Trying (4)
180 Ringing (6)
Transaction
180 Ringing (7)
180 Ringing (8) 200 OK (9)
200 OK (10)
200 OK (10)
Dialog
ACK (11)
Transaction
BYE (13)
200 OK (14)
O protocolo RTP
O protocolo RTP responsvel pelo transporte de dados como udio e vdeo. Ele foi
padronizado pela RFC3550. Ele usa UDP como um protocolo de transporte. Para ser
transportado, o udio e vdeo tem de ser empacotados por um codec. Basicamente o
protocolo permite a especificao da temporizao e do contedo da transmisso da
mdia.
O RTP tem um protocolo auxiliar chamado RTCP (Real Time Control Protocol)
usado para monitorar os pacotes de RTP. Ele pode medir o delay e o jitter.
Codecs
O contedo descrito no protocolo RTP normalmente codificado por um Codec.
Cada codec tem um uso especfico. Alguns tem compresso enquanto outros no. O
Codec G.711 que no usa compresso o mais comum. Usando 64 Kbps de banda
para um nico canal, ele normalmente precisa de uma rede de alta velocidade,
normalmente encontrada em redes locais. Entretanto em redes de longa distncia,
64Kbps muito oneroso. Codecs como o G.729 e o GSM podem compactar os
pacotes de voz em at 8 vezes e permitir um melhor uso da banda disponvel. Alguns
codecs como o iLBC podem sustentar uma boa qualidade de voz mesmo com 7% de
perda de pacotes. A correta escolha do codec de voz fundamental na operao de um
provedor VoIP
DTMF-Relay
Algumas vezes os usurios vo precisar usar o teclado do telefone para operar
sistemas automticos como, por exemplo, tele-banco e correio de voz. Para que esta
operao se d sem problemas, preciso que o DTMF (Dual Tone Multi Frequency)
seja repassado para a rede pblica corretamente. Quando usamos um Codec com
compresso como o g.729, os tons enviados pelos dgitos do telefone passam
distorcidos e podem ser interpretados de forma incorreta ou simplesmente ignorados.
Para resolver isso precisamos de um mtodo especial para a passagem do DTMF. Em
alguns casos o protocolo RTP usado para levar informaes de sinalizao como o
DTMF. A RFC2833 especifica os mtodos para transmitir O DTMF na forma de
eventos nomeados. importante que voc use o mesmo mtodo para servidores e
clientes.
Application SER/OpenSER
Presentation G.729/G711/GSM/Speex
Session H323/SIP/MGCP/IAX
Transport UDP/RTP/SRTP/RTCP
Network IP
Datalink Frame-Relay/ATM/PPP/Ethernet
Physical Ethernet/V.35/RS-232/xDSL
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
1 | Introduo ao SIP 16
Neste material, ns iremos cobrir cada um dos componentes nos captulos a frente.
Vamos usar esta figura em todos os captulos para poder situ-lo.
Sip Proxy
O SIP Proxy o componente central de nossa soluo. Ele responsvel pelo registro
dos usurios e por manter a base de dados de localizao (mapeado endereos SIP
(uri) para endereos IP). Toda a sinalizao e o encaminhamento so gerenciados
pelo SIP Proxy. O SIP Proxy nunca gerencia a media (udio ou vdeo em RTP).
Todos os pacotes RTP so enviados diretamente entre os usurios e os gateways.
PSTN gateway
Para que haja comunicao com o servio pblico de telefonia so necessrios
gateways. Normalmente esta interface de gateway vai usar troncos E1 ou T1
dependendo do pas. Os produtos mais comuns para esta tarefa so os gateways da
Cisco, AudioCodes e Quintum. O Asterisk vem ganhando mercado nesta rea
tambm. Verifique o suporte dos gateway no somente a RFC3261, mas tambm as
RFCs 3515(REFER) e 3891(Replaces) e 3892(Referred By). Este protocolo permitem
a transferncia de chamadas com consulta. Sem eles pode ser impossvel transferir
chamadas.
Media Server
Um SIP Proxy nunca gerencia a mdia (RTP). Servios como URA, correio de voz,
conferncia ou quaisquer outros relacionados ao uso da mdia, necessitam deste
componente. Os dois componentes mais populares para Media Server so o Asterisk e
o SEMS desenvolvido pela IPTEL. O SEMS tem recursos interessantes como correio
de voz, conferncia e anncios.
Ferramentas de monitoramento
Por fim, ns iremos precisar de ferramentas de monitoramento e testes para nos ajudar
a depurar quaisquer problemas ocorrendo no servidor SIP. A primeira destas
ferramentas o analisador de protocolo. Vamos ver tambm outras ferramentas como
o SIP Trace.
Sumrio
Neste captulo voc aprendeu o que o SIP seus principais componentes, SIP Proxy,
SIP Registrar, User Agent Client, User Agent Server, Gateway PSTN. Entendeu como
funciona a arquitetura SIP com seus SIP Proxies, entendeu o significado de uma URI
e seus Aliases. Alem disto foi possvel entender os principais tipos de mensagem SIP
e seu processamento.
1 | Introduo ao SIP 18
2
SIP Express Router
Onde ns estamos?
A soluo de um provedor VoIP possui muitos componentes. Para evitar perder a
perspectiva, ns iremos mostrar esta figura a cada captulo. Neste captulo, ns iremos
trabalhar com o componente chamado SIP Proxy.
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Ele foi criado para atender infra-estruturas de voz sobre IP de larga escala. O servidor
mantm o registro dos usurios, configura as sesses VoIP, encaminha mensagens
instantneas e cria espao para novas aplicaes. Sua interoperabilidade comprovada
garante integrao simples com componentes de outros fornecedores. Isto elimina a
possibilidade de ficar travado em um nico fabricante.
O OpenSER tem um modelo flexvel de plug-in para novas aplicaes. Terceiros pode
facilmente ativar seus plug-ins com o cdigo do servidor e prover deste modo servios
avanados. Desta forma, plug-ins tais como contabilizao usando o protocolo
RADIUS, gateways de SMS, queries ENUM, ou agente de presena j foram
desenvolvidos e so fornecidos como recursos avanados. Outros mdulos esto a
caminho: controle de firewall, postgres, drivers de LDAP e mais.
Principais caractersticas
Velocidade
Baixo consumo de recursos
Escalabilidade
Portabilidade (Ansi C)
Interoperabilidade
Cenrios de uso
Nesta seo vamos ver os casos mais comuns de uso do SIP. Em todos estes cenrios,
o OpenSER pode ser instalado facilmente como um elemento aglutinador entre todos
os componentes SIP, sejam eles softfones, telefones IP, gateways PSTN e quaisquer
outros dispositivos compatveis com SIP.
Provedores de Telefonia IP
ITSPs (provedores de servio de telefonia na Internet) oferecem um servio de
interconectar usurios de telefonia usando um softfone rede pblica de telefonia.
Isto pode reduzir os custos em ligaes DDD, DDI e para celulares. O OpenSER pode
ser facilmente configurado para esta aplicao.
Ncleo e mdulos
O OpenSER construdo sobre um ncleo que responsvel pela funcionalidade
bsica e pelo manuseio das mensagens SIP. A maior parte da funcionalidade do
OpenSER executada a partir de seus mdulos. Estes mdulos expem sua
funcionalidade de forma que possam ser usados dentro do arquivo openser.cfg. O
arquivo de configurao openser.cfg controla que mdulos so carregados e permite
configurar parmetros que regulam o funcionamento dos mdulos. O openser.cfg o
principal arquivo de configurao do OpenSER.
Preprocess
Request Determine Forward Request Process All
Routing
Validation Reqeuests target to Target Responses
Information
Validao do pedido
Antes que um Proxy possa processar um pedido ele deve verificar a validade de
mensagem. As seguintes validaes so feitas:
Sintaxe razovel
Estrutura da URI (URI scheme)
Max-forwards
Loop Detection (opcional)
Proxy-Require
Proxy-Authorization
Encaminhamento do pedido
Assim que o alvo estiver preenchido, um Proxy pode iniciar o encaminhamento. Ele
pode processar mltiplos alvos serialmente, onde cada transao de cliente
completada at que a prxima se inicie. Este processo pode ser paralelo tambm. Para
cada alvo, o Proxy encaminha o pedido seguindo os seguintes passos:
Faz uma cpia do pedido recebido
Atualiza a R-URI
Atualiza o Max-Forwards
Opcionalmente adiciona um campo Record-Route
Opcionalmente adiciona campos cabealho
Ps-processa informaes de roteamento
Determina o endereo do prximo salto, porta e transporte
Adiciona o valor do cabealho Via
Adicionar o cabealho Content-Length
Encaminha o novo pedido
Seta o temporizador C
Processamento da Resposta
Quando uma resposta recebida por um elemento, ele primeiro tenta localizar a
transao do cliente. Se nenhuma for encontrada, o elemento deve processar a
resposta, mesmo se uma resposta informacional como um Proxy stateless. Se uma
transao correspondente for encontrada a resposta enviada ao cliente. Todas as
transaes de clientes passam respostas camada do Proxy e os seguintes processos
devem ocorrer:
1. Encontrar o contexto da resposta apropriado.
2. Atualizar o temporizador C.
3. Remover o cabealho Via mais alto.
STRICT ROUTING
(RFC2543)
B C
A
D
A soluo loose routing a forma correta, ela mantm o alvo do pedido separado da
prxima rota. Permite a cada destino de roteamento determinar se ele foi alcanado,
possui um mecanismo para manter a compatibilidade com elementos do tipo strict
routing. O suporte de loose routing indicado atravs de um parmetro ;lr.
B C
A
D
Agora que entendemos um pouco mais sobre o SER, vamos instal-lo para podermos
comear a explorar os seus recursos.
Ao final deste captulo voc estar apto :
Instalar o Linux de forma adequada ao OpenSER
Baixar, compilar e instalar o OpenSER
Executar o OpenSER na carga do Linux.
Conhecer algumas opes de execuo do OpenSER
Onde estamos?
Neste captulo, continuaremos a explorar os recursos do componente SIP Proxy.
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Necessidades de Hardware
OpenSER roda em algumas variedades de Linux e no Solaris da Sun Microsystems.
Alguns pacotes genricos compactados em tarballs para algumas variedades de
linux e solaris esto disponveis. Estes pacotes podem ser baixados do site
www.openser.org
Os programas gcc ou icc, bison ou yacc, flex, GNU make ou gmake, sed e tr so
necessrios para compilao. provvel que voc j os tenha em sua mquina. De
qualquer forma voc pode baix-los gratuitamente junto com sua distribuio de
Linux. Se voc quiser suporte ao MySQL, voc tambm vai precisar do libmysql e
libz. Mdulos opcionais podem requerer suporte de bibliotecas adicionais.
A IPTEL no especifica um hardware mnimo e o OpenSER ir rodar em um PC com
poucos recursos. Um dimensionamento apropriado para os horrios de pico precisa
ser determinado de forma emprica. A documentao cita que uma mquina bi-
processada agentaria um horrio de pico de uma regio como a baia de So
Francisco, CA, USA. Como regra geral, qualquer PC com uma placa de 100 Mbps
com recursos razoveis deve ser adequado, particularmente para testes. Isto vale
apenas para voz, na medida em que se adicionam facilidades, a carga pode crescer e
s possvel neste caso determinar o hardware de forma emprica.
3 | Instalando o OpenSER 32
Passo 3: Escolha um layout de teclado
Passo 8: Selecione All files in one partition, todos os arquivos em uma partio.
3 | Instalando o OpenSER 34
Passo 9: Finaliza as mudanas para o disco
3 | Instalando o OpenSER 36
Passo 15: Entre o nome para a conta do usurio como openser
Passo 16: Insira a senha como openser. Duas vezes para confirmar.
Passo 17: Configure o gerenciador de pacotes. Selecione yes para usar um mirror.
Passo 20. Deixe em branco o Proxy http ou preencha-o com o endereo ip do seu
HTTP Proxy.
3 | Instalando o OpenSER 38
Passo 21: Selecione no na pesquisa de popularidade de pacotes.
The MySQL server is not really a dependency, but we will install it at this
moment to make things easier.
3 | Instalando o OpenSER 40
Passo 2: Descarregue os pacotes fonte e descompacte-os.
cd /usr/src
wget http://www.openser.org/pub/openser/1.2.2/src/openser-1.2.2-
tls_src.tar.gz
tar -xzvf openser-1.2.2-tls_src.tar.gz
Passo 4: Use o seu editor favorito para editar o arquivo Makefile do modulo ACC e
remover duas linhas relacionadas a contabilizao Radius.
vi modules/acc/Makefile
Antes:
DAEMON=/usr/sbin/openser
Depois:
DAEMON=/sbin/openser
openser-1:/etc/openser# ls -l
total 12
-rw-r--r-- 1 root root 1804 2007-09-10 14:02 dictionary.radius
-rw-r--r-- 1 root root 4077 2007-09-10 14:05 openser.cfg
-rw-r--r-- 1 root root 1203 2007-09-10 14:02 openserctlrccd
Modulos (/lib/openser/modules)
openser-1:/lib/openser/modules# ls
acc.so domain.so msilo.so sms.so
alias_db.so enum.so mysql.so speeddial.so
auth_db.so exec.so nathelper.so sst.so
auth_diameter.so flatstore.so options.so statistics.so
auth_radius.so gflags.so path.so textops.so
auth.so group_radius.so pdt.so tm.so
avpops.so group.so permissions.so uac_redirect.so
avp_radius.so imc.so pike.so uac.so
dbtext.so lcr.so registrar.so uri_db.so
dialog.so mangler.so rr.so uri.so
dispatcher.so maxfwd.so seas.so usrloc.so
diversion.so mediaproxy.so siptrace.so xlog.so
3 | Instalando o OpenSER 42
domainpolicy.so mi_fifo.so sl.socd /lib/openser/modules
Binaries (/sbin)
openser-1:/sbin# ls -l op*
-rwxr-xr-x 1 root root 2172235 2007-09-10 14:02 openser
-rwxr-xr-x 1 root root 41862 2007-09-10 14:02 openserctl
-rwxr-xr-x 1 root root 38107 2007-09-10 14:02 openser_mysql.sh
-rwxr-xr-x 1 root root 13562 2007-09-10 14:02 openserunixcd /sbin
Arquivos de Log
Os registros de inicializao podem ser vistos em /var/log
Sep 10 14:25:56 openser-1 openser: init_tcp: using epoll_lt as the io watch
method (auto detected)
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: INFO: statistics manager
successfully initialized
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: StateLess module -
initializing
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: TM - initializing...
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: Maxfwd module- initializing
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: INFO:ul_init_locks: locks
array size 512
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: TextOPS - initializing
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: INFO: udp_init: SO_RCVBUF is
initially 109568
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: INFO: udp_init: SO_RCVBUF is
finally 262142
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: INFO: udp_init: SO_RCVBUF is
initially 109568
Sep 10 14:25:56 openser-1 /sbin/openser[7791]: INFO: udp_init: SO_RCVBUF is
finally 262142
Sep 10 14:25:56 openser-1 /sbin/openser[7792]:
INFO:mi_fifo:mi_child_init(1): extra fifo listener processes created
Comandos de inicializao
OpenSER pode ser iniciado com:
/etc/init.d/openser start|stop|restart
Sumrio
Neste captulo voc aprendeu a instalar o Linux, preparando a instalao do Sip
Express Router. Escolhemos o OpenSER por ser um projeto com atualizaes e
3 | Instalando o OpenSER 44
4
Configurao padro.
No captulo passado, voc aprendeu como instalar o OpenSER. Nesta altura seu
servidor j deve estar instalado e funcionando. Vamos agora comear a explorar as
possibilidades partindo do exemplo mais bsico que o arquivo de configurao
padro.
Ao final deste captulo voc estar apto :
Identificar as sees do arquivo openser.cfg
Entender a configurao padro
Identificar as limitaes do OpenSER
Usar o utilitrio ngrep para rastrear o SIP
Ligar de um telefone a outro usando SIP
Reconhecer como funciona o roteamento bsico
Onde estamos?
Ainda continuamos dentro do mesmo componente, o SIP Proxy.
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
port=5060
loadmodule "sl.so"
loadmodule "tm.so"
4 | Configurao padro. 46
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
# -- mi_fifo params --
# -- usrloc params --
modparam("usrloc", "db_mode", 0)
# -- auth params --
# Uncomment if you are using auth module
#
#modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
#modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
route{
if (!uri==myself) {
# mark routing logic in request
append_hf("P-hint: outbound\r\n");
# if you have some interdomain connections via TLS
#if(uri=~"@tls_domain1.net") {
# t_relay("tls:domain1.net");
# exit;
#} else if(uri=~"@tls_domain2.net") {
# t_relay("tls:domain2.net");
# exit;
#}
route(1);
};
if (method=="REGISTER") {
save("location");
exit;
};
lookup("aliases");
if (!uri==myself) {
4 | Configurao padro. 48
append_hf("P-hint: outbound alias\r\n");
route(1);
};
route(1);
}
route[1] {
# send it out now; use stateful forwarding as it works reliably
# even for UDP2TCP
if (!t_relay()) {
sl_reply_error();
};
exit;
}
Este parmetro controla se o servidor SIP deveria tentar verificar seu prprio endereo
IP no DNS. Se configurado para yes e o endereo IP no est no DNS, um aviso
(warning) ser impresso no syslog e um received= ser adicionado ao cabealho via.
A no ser que tenha uma boa razo deixe-o sem modificao.
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
O mdulo USRLOC responsvel por cuidar dos registros dos clientes SIP e guardar
em uma base de localizao. Em outras palavras, quando um cliente SIP se registra
com um SIP Proxy, o OpenSER ir guardar as informaes de contato, tambm
conhecidas como AOR (endereo do registro). A localizao desta tabela depende do
valor do parmetro db_mode. Um db_mode de 0 significa no persistir os dados, em
outras palavras se o OpenSER desligado todos os registros so perdidos.
modparam("rr", "enable_full_lr", 1)
4 | Configurao padro. 50
sl_send_reply("513", "Message too big");
exit;
};
A funo loose_route() testa para ver se a mensagem atual SIP deveria ser
encaminhada no modo loose route ou no. Se uma mensagem deve funcionar neste
modo, o OpenSER ir simplesmente encaminhar a mensagem para o prximo destino
como especificado no cabealho Route mais alto. Em todos os arquivos openser.cfg
voc deve chamar o loose_route() aps o record_route(). Esta a definico bsica
de loose routing. Voc pode conhecer um pouco mais sobre loose routing na
RFC3261.
save("location");
exit;
};
4 | Configurao padro. 52
usurio SIP flavio@sermyadmin.org e um nmero de ramal 8590, quando algum
discar o nmero, o telefone associado quele usurio ir tocar.
Se um alias foi encontrado e a uri no mais um destino localmente servido, ento
fazemos encaminhamento da chamada.
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
append_hf("P-hint: usrloc applied\r\n");
Rede Ethernet
Transaes e dilogos
Uma transao iniciada com um pedido e termina, normalmente, com um cdigo de
resposta. O parmetro branch no cabealho VIA identifica uma transao. Um dilogo
4 | Configurao padro. 54
pode iniciar com uma transao INVITE e terminar com uma transao BYE. Um
dilogo identificado por uma combinao dos cabealhos FROM, TO e CALL-ID.
Nem todos os mtodos SIP abrem um novo dilogo. Os mtodos REGISTER e
MESSAGE, por exemplo, no abrem.
Mais tarde voc poder usar as rotas pr-gravadas, tambm conhecidas como conjunto
de rotas (route-set). Esta a configurao mais comum e est contida na configurao
padro.
4 | Configurao padro. 56
Passo1: Use o script abaixo (openser.chapter4-2). Reinicie o OpenSER e ento
registre novamente os telefones SIP.
route{
# All messages, except for REGISTER will pass here
if (!method=="REGISTER") record_route();
if (method=="REGISTER") {
save("location");
exit;
};
route[1] {
# send it out now; use stateful forwarding
t_on_reply("1");
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
onreply_route[1] {
append_hf("P-hint: (3)passed thru onreply_route[1]\r\n");
}
failure_route[1] {
append_hf("P-hint: (4)passed thru failure_route[1]\r\n");
}
By:
forward()
4 | Configurao padro. 58
Passo 4: Faa uma chamada do 1000 para o 1001
Passo 5: Aps terminar a chamada, pare o ngrep
Passo 6: Use um editor de texto para verificar o arquivo chamado rr-stateless. Voc
ir notar que as respostas agora no tem o campo P-Hint. Isto indica que elas no
foram processadas na seo onreply_route[]. Desta forma, se voc usar o
processamento sem controle de estado, no poder lidar com as respostas, apenas
poder encaminh-las ao seu destino final.
Sumrio
Neste captulo voc aprendeu algumas instrues para cada uma das sesses do
arquivo openser.cfg. Este a configurao mais simples. Nos prximos captulos ns
vamos aumentar a funcionalidade e a complexidade do script. Este captulo serviu
como um ponto de partida para desenvolver scripts mais avanados. No final foi
possvel conhecer um pouco mais sobre o roteamento SIP um dos conceitos mais
importantes de se entender para trabalhar com o OpenSER. Mesmo sendo um script
simples ele permitiu que voc conectasse dois telefones um ao outro.
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
O modulo Auth_DB
A autenticao feita pelo mdulo AUTH_DB. Ele trabalha em conjunto com os
mdulos de bases de dados tais como o SQL e o Postgres. O AUTH_DB tem alguns
parmetros que no so declarados explicitamente no script. Vamos mostrar abaixo os
parmetros padro para o mdulo AUTH_DB.
Parmetro Default Descrio
db_url "mysql://openserro:openserro URL da base de dados
@localhost/openser"
user_column "username" Nome da coluna que mantm
os usurios
domain_column "domain" Nome da coluna do domnio
dos usurios
password column ha1 Nome da coluna mantendo as
senhas
password_column2 ha1b Nome da coluna mantendo os
hashs pr-calculados que
incluem o nome do usurio e
domnio.
calculate_ha1 0 (server assumes that ha1 Diz ao servidor se ele deve
strings are already calculated esperar senhas em texto plano
in the database) na base de dados ou no.
use_domain 0 (domains wont be checked Use este parmetro se voc
when looking up in the vai ter um ambiente multi-
subscriber database) domnio.
load_credentials rpid Especifica as credencias a
serem buscadas na base de
Esta funo usada na autenticao dos pacotes do tipo REGISTER que ocorrem de
acordo com a RFC2617.
proxy_authorize(realm, table)
Sequncia de Autenticao
para o Register
Aps receber a solicitao o UAC deve enviar uma mensagem de registro com um
campo cabealho do tipo AUTHORIZE.
INVITE
407 Proxy
Authentication
Required
ACK
INVITE
With Proxy-Authorize
header
100 Giving a try User Agent
User Agent
Client
Client INVITE
(1000)
(1001) 180 Ringing
SIP Proxy
180 Ringing
200 Ok
200 Ok
ACK
ACK
Call Established
WWW-Authenticate: Digest
realm="192.168.1.155",
nonce="46263864b3abb96a423a7ccf052fa68d4ad5192f".
1
2
Authorization: Digest
username="1000", SIP
realm="192.168.1.155", Server
nonce="46263864b3abb96a423a7ccf052fa68d4ad5192f",
uri="sip:192.168.1.155",
response="d7b33793a123a69ec12c8fc87abd4c03",
algorithm=MD5.
WWW-Authenticate: Digest
realm="8.8.30.49",
nonce="4630c7304423763c9e34850300dab814939d2658",
qop="auth".
1
2
Authorization: Digest
SIP
username="1000",
Server
realm="8.8.30.49",
nonce="4630c7304423763c9e34850300dab814939d2658",
uri="sip:8.8.30.49",
response="2fad708663e109fe68774e08fda91808",
cnonce="87c730b997eb79ca",
nc=00000001,
qop=auth,
algorithm=MD5.
Uma descrio detalhada do processo de autenticao por digest pode ser encontrada
na RFC2617.
Uma senha ser solicitada para acesso ao banco de dados. A senha est vazia neste
momento. O script ir pedir pela senha duas vezes. Pressione <enter> em ambas. O
script ir perguntar por um domnio (realm), informe o seu domnio para o usurio
admin.
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
# -- mi_fifo params --
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
# -- auth params --
# Uncomment if you are using auth module
#
modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
route{
if (!uri==myself) {
# mark routing logic in request
append_hf("P-hint: outbound\r\n");
# if you have some interdomain connections via TLS
#if(uri=~"@tls_domain1.net") {
# t_relay("tls:domain1.net");
# exit;
#} else if(uri=~"@tls_domain2.net") {
# t_relay("tls:domain2.net");
# exit;
#}
route(1);
};
if (method=="REGISTER") {
save("location");
exit;
};
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
exit;
};
consume_credentials();
lookup("aliases");
route(1);
}
route[1] {
# send it out now; use stateful forwarding as it works reliably
# even for UDP2TCP
if (!t_relay()) {
sl_reply_error();
};
exit;
}
save("location");
exit;
} else if (method=="INVITE") {
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
exit;
};
consume_credentials();
};
Se a execuo do openser.cfg chegar nesta linha ento o usurio foi validado contra a
tabela MySQL, ento vamos usar o save(location) na linha 120 para adicionar o
registro do contato do usurio para a tabela de localizao do MySQL. Salvar este
contato permite que voc reinicie com segurana o OPENSER.
As mensagens de INVITE so gerenciadas de forma semelhante s de registro.
Usamos o proxy_authorize para nos certificarmos que no somos um Proxy aberto
(open relay). A funo proxy_authorize() vai exigir que as mensagens de INVITE
tenham credenciais do tipo digest includas no pedido. Se elas estiverem includas a
funo ir tentar valid-las contra a tabela de assinantes (subscriber). Da mesma
forma que a funo www_authorize, a funo proxy_authorize leva dois argumentos, o
primeiro o realm e o segundo a tabela MYSQL.
Se o usurio no se autenticar ento o OPENSER ir enviar um reply 401
Unauthorized.
Como no queremos arriscar enviar as credenciais para frente, removemos quaisquer
cabealhos www-autorize ou proxy-authorize com a funo consume_credentials()
O script openserctl
Openserctl um shell script localizado em /usr/sbin. Ele usado para gerenciar o
OpenSER a partir da linha de comando do Linux. Ele pode ser usado para:
Iniciar, parar e reiniciar o OPENSER.
Dar, revogar e mostrar as ACLs
Adicionar, remover e listar aliases
Adicionar, remover e configurar um AVP.
Gerenciar rotas de menor custo.
Gerenciar o rpid
Adicionar, remover e listar assinantes.
Adicionar, remover e mostra a tabela de localizao in-ram.
* lcr *
* IP addresses must be entered in dotted quad format e.g. 1.2.3.4 *
* <uri_scheme> and <transport> must be entered in integer or text,*
* e.g. transport '2' is identical to transport 'tcp'. *
* scheme: 1=sip, 2=sips; transport: 1=udp, 2=tcp, 3=tls *
* Examples: lcr addgw_grp usa 1 *
* lcr addgw level3 1.2.3.4 5080 sip tcp 1 *
* lcr addroute +1 % 1 1 *
lcr show ....................................................................
............. show routes, gateways and groups
lcr reload ..................................................................
............. reload lcr gateways
lcr addgw_grp <grp_name> ....................................................
.............. add gateway group, autocreate grp_id
lcr addgw_grp <grp_name> <grp_id> ...........................................
............... add gateway group with grp_id
lcr rmgw_grp <grp_id> ......................................................
............... delete the gw_grp
lcr addgw <gw_name> <ip> <port> <scheme> <transport> <grp_id> ...............
............... add a gateway
lcr addgw <gw_name> <ip> <port> <scheme> <transport> <grp_id> <prefix> ......
............... add a gateway with prefix
lcr addgw <gw_name> <ip> <port> <scheme> <transport> <grp_id> <prefix> <strip>
............... add a gateway with prefix and strip
lcr rmgw <gw_name> .........................................................
-- command 'fifo'
fifo ............................... send raw FIFO command
## database host
DBHOST=localhost
## database name
DBNAME=openser
## ACL names - if VERIFY_ACL is set, only the ACL names from below list
## are accepted
ACL_GROUPS="local ld int voicemail free-pstn"
Laboratrio: Autenticao.
Passo 1: Faa as mudanas descritas neste captulo ao arquivo openser.cfg.
Passo 2: Reinicialize o openSER usando /etc/init.d/openser restart.
#
# here you can set variables used in the openserctl
## database host
DBHOST=localhost
## database name
DBNAME=openser
## ACL names - if VERIFY_ACL is set, only the ACL names from below list
## are accepted
ACL_GROUPS="local ld int voicemail free-pstn"
Passo 4: Antes que voc possa usar esta nova configurao voc deve configurar as
contas de usurio SIP usando o script openserctl. Ns vamos continuar a usar os
usurios 1000 e 1001. No exemplo anterior o OpenSER registrava qualquer usurio,
agora apenas com senhas cadastradas no MySQL. Por isso cadastre os dois usurios
com os seguintes dois comandos.
openserctl add 1000 <password> user1@voffice.com.br
openserctl add 1001 <password> user2@voffice.com.br
(senha: openserrw)
Voc pode remover usurios usando openserctl rm e trocar a senha usando
openserctl passwd. Veja o help do comando para os detalhes de sintaxe.
Passo 5: Use o comando ngrep para jogar as mensagens SIP para um arquivo
ngrep -p -q -W byline port 5060 >registro.pkt
Passo 6: Abra outra janela do terminal e registre os dois telefones usando os nomes e
senhas do passo 4.
Passo 7: Verifique o registro na tabela de localizao usando:
#openserctl ul show
Passo 8:Voc pode verificar os usurios online de forma mais simples usando:
#openserctl online
ourdomain.com otherdomain.com
Internet
Como dito anteriormente o mdulo domain exporta duas funes que sero usadas
neste script. A primeiro is_from_local() que verifica se o campo FROM contm
5 | Autenticao com MySQL 80
um dos domnios gerenciados pelo seu Proxy. A segunda funo,
is_uri_host_local() substitui a instruo uri==myself. A vantagem das funes
exportadas pelo domnio que elas verificam o domnio na tabela DOMAIN no
MySQL. Esta a melhor forma de gerenciar mltiplos domnios na sua
configurao.
Esta funo requer que todos os domnios servidos estejam inseridos no banco
de dados. Um erro bastante comum para os usurios deste material esquecer
de inserir o domnio na tabela MySQL antes de registrar os telefones.
Rotas alternativas
Para simplificar nosso script vamos criar vrias rotas alternativas. Temos visto que o
script pode se tornar bastante complexo e confuso. Para evitar isto vamos criar rotas
alternativas que funcionam de forma semelhante a sub-rotinas. O uso de rotas
alternativas permite separar certas partes do cdigo e melhorar e legibilidade.
# Verify aliases
lookup("aliases");
} else {
Rotas internas sero geridas pela tabela de localizao armazenada na base de dados
MySQL.
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
append_hf("P-hint: inbound->inbound \r\n");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
Ns iremos rotear chamadas para destinos externos usando uma busca ao DNS.
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
Usando Aliases
Em alguns casos voc vai querer permitir que um usurio tenha vrios endereos, tais
como um nmero de telefone associado ao seu endereo principal. Voc pode usar os
Aliases para este propsito.
Para adicionar um alias, voc pode usar:
#openserctl alias add 1000@8.8.30.49 flavio@8.8.30.49
database engine 'MYSQL' loaded
Control engine 'FIFO' loaded
MySql password for user 'openser@localhost':
Para processar um alias dentro de um script use:
lookup(aliases);
Esta funo ir traduzir o alias para a forma cannica da URI. Em alguns casos o
Alias pode ser resolvido para um domnio externo. Este condio deve ser tratada de
acordo com as regras previamente estabelecidas. .
t_check_trans();
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "uri_db.so"
loadmodule "domain.so"
# -- mi_fifo params --
# -- usrloc params --
# -- auth params --
# Uncomment if you are using auth module
#
modparam("auth_db", "calculate_ha1", 0)
#
# If you set "calculate_ha1" parameter to yes,
# uncomment also the following parameter)
#
#modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
route{
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
#CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans()) t_relay();
t_check_trans();
if (method=="REGISTER") {
route(2);
} else {
route(3);
};
}
route[1] {
# send it out now; use stateful forwarding as it works reliably
# even for UDP2TCP
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[2] {
#
# -- Register request handler --
#
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("40=3", "Forbidden");
exit;
};
save("location");
exit;
} else if {
sl_send_reply("403", "Forbidden");
};
}
route[3] {
#
# -- INVITE request handler --
#
if (is_from_local()){
# From an internal domain -> check the credentials and the
FROM
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","1");
exit;
consume_credentials();
# Verify aliases
lookup("aliases");
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
} else {
# From an external domain -> do not check credentials
#Verify aliases, if found replace R-URI.
lookup("aliases");
if (is_uri_host_local()) {
#-- Outbound to inbound
route(12);
} else {
# -- Outbound to outbound
route(13);
};
};
}
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
append_hf("P-hint: inbound->inbound \r\n");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
route[12] {
# From an external domain -> inbound
# Verify aliases, if found replace R-URI.
lookup("aliases");
if (!lookup("location")) {
route[13] {
#From an external domain outbound
#we are not accepting these calls
append_hf("P-hint: outbound->inbound \r\n");
sl_send_reply("403", "Forbidden");
exit;
}
Melhorando a segurana
Passo 1: Tente registrar o seu telefone com a nova configurao. Voc,
provavelmente, vai perceber um erro no registro do seu telefone.
Passo 2: A configurao acima agora usa o mdulo DOMAIN. Com isto preciso que
todos os domnios servidos estejam cadastrados no banco de dados.
#mysql
Mysql> use openser
mysql> insert into domain (domain) VALUES(seuendereoip");
mysql> insert into domain (domain) VALUES(seudominio);
Passo 3: Tente novamente registrar o telefone. Voc vai ver agora que o registro se
completa.
Aliases
Passo 1: Adicione um alias ao assinante 1000
#openserctl alias add john@seuendereoip sip:1000@seuenderecoip
database engine 'MYSQL' loaded
Control engine 'FIFO' loaded
MySql password for user 'openser@localhost':
Obs: Use openserrw como senha.
Passo 2: Do softfone registrado como 1001 disque john.
A chamada foi completada?
Porque?
Sumario
Neste captulo voc aprendeu como integrar o MySQL com o OpenSER. Agora nosso
script est autenticando usurios, checando os campos TO e FROM e gerenciando
adequadamente as chamadas de entrada e sada. importante lembrar que os
domnios agora tem de ser inseridos no banco de dados, por causa do suporte
mltiplos domnios. Se voc mudar o seu domnio ou endereo IP, lembre-se de
atualizar o seu banco de dados.
SerMyAdmin
Originalmente, este material foi escrito para o SerWEB que foi originalmente
desenvolvido para o projeto SER. Infelizmente, o SerWEB se tornou incompatvel
com verses mais recentes do OpenSER (a partir da 1.2). Outro aspecto importante do
SerWEB a ser considerado so suas vulnerabilidades. Existem algumas opes de
interfaces Web para o OpenSER. Uma destas ferramentas, desenvolvida em Ruby in
Rails, o OpenSER Administrator. Pareceu-me uma boa ferramenta para administrar
o OpenSER, no entanto faltava o suporte multi-domnio e o provisionamento de
usurios que j existiam no SerWEB. O OpenSER Admin pode ser encontrado no
endereo URL http://sourceforge.net/projects/openseradmin.
Sem uma ferramenta para construir um portal de usurios para o OpenSER, decidimos
desenvolver uma ferramenta prpria chamada serMyAdmin usando Java. Aps um
comeo tortuoso, ela agora est na sua primeira verso beta e ns estamos usando
para este livro. Desenvolvida em Grails (Groovy on Rails) ela pode ser descarregada
em http://sourceforge.net/projects/sermyadmin.
O projeto SerMyAdmin pode ser encontrado em http://sermyadmin.sourceforge.net
A idia facilitar a administrao da base de dados OpenSER. O SerMyAdmin
licenciado de acordo com a licena GPL v2.
Instalando o SerMyAdmin
O serMyAdmin usa o framework Grails. Para isto ser necessrio instalar um servidor
de aplicaes como o IBM Websphere, JBOSS, Jetty ou Tomcat. Neste material
vamos usar o Apache Tomcat porque ele gratuito e fcil de instalar. Como usamos
alguns recursos do Java 1.5, vamos precisar do JDK da Sun Microsystyems e no da
alternativa gratuita chamada GCJ.
Passo 1: Crie um administrador para o serMyAdmin
mysql u root
use openserINSERT INTO `subscriber` ( `id` , `username` , `domain` ,
`password` , `first_name` , `last_name` , `email_address` ,
`datetime_created` , `ha1` , `ha1b` , `timezone` , `rpid` , `version` ,
`password_hash` , `auth_username` , `class` , `domain_id` , `role_id`
)VALUES (NULL , 'admin', 'openser.org', 'senha', 'Admin', 'Admin',
'admin@openser.org', '0000-00-00 00:00:00', '1', '1', '1', '1', '1', NULL
, 'admin@openser.org', NULL , '1', '3');
Passo 2: O primeiro passo atualizar a lista de fonts para usar os pacotes do tipo
contrib., e non-free. O arquivo /etc/apt/sources.list deve ficar como mostrado abaixo.
# /etc/apt/souces.list
deb http://ftp.br.debian.org/debian/ etch main contrib non-free
deb-src http://ftp.br.debian.org/debian/ etch main contrib non-free
deb http://security.debian.org/ etch/updates main contrib non-free
deb-src http://security.debian.org/ etch/updates main contrib non-free
/etc/apt/sources.list
Note que ns adicionamos apenas as palavras chave contrib e non-free aps as nossas
definies de repositrio.
Passo 3: Atualize a lista de pacotes usando o seguinte comando:
openser:~# apt-get update
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting Tomcat 6" "Tomcat6"
$CATALINA_BIN/startup.sh
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping Tomcat6" "Tomcat6"
$CATALINA_BIN/shutdown.sh
log_end_msg $?
;;
force-reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/tomcat6 {start|stop|restart}"
exit 1
;;
esac
exit 0
Passo 9: Instrua o Debian para executar este script na inicializao da mquina
usando:
openser:/etc/init.d# update-rc.d tomcat6 defaults 99
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host"><value>localhost</value></property>
</bean>
<!-- You can set default email bean properties here, eg: from/to/subject -->
</beans>
Passo 17: Crie o administrador na base de dados
cd /usr/src
wget http://www.sermyadmin.org/openser/openser.sql
mysql -u root openser <openser.sql
Tarefas bsicas
Voc pode usar o serMyAdmin para uma srie de tarefas. Neste captulo, ns iremos
apresent-lo como criar e administrar novos usurios e grupos. Nos prximos
captulos ns iremos usar o serMyAmin para outras tarefas, tais como gerenciar a
tabela de confiana e o mdulo LCR.
Gerencia de usurios
Voc pode ver, adicionar, editar e deletar usurios no menu usurios. Quando voc
clica nele, ter todos os usurios sendo mostrados.
Customizao de interface
Para o layout da pgina web, o serMyAdmin usa um framework do tipo sitemesh, de
forma a tornar o processo de customizao da pgina bem simples. Sitemesh mostra
as pginas baseado em uma mscara encontrada em openser:/usr/local/apache-
tomcat-6.0.16/webapps/serMyAdmin-0.3/WEB-INF/grails-app/views/layouts. L,
voc ir encontrar os arquivos main.gsp e notLoggedin.gsp, estes arquivos so
pginas do servidor Groovy que controlam como as pginas so exibidas.
O Sitemesh usa metatags HTML para escolher que layout usar. Estas tags devem ser
colocadas entre os cabealhos <HEAD> de cada pgina. Se a pgina tiver um tag
<meta content="main" name="layout"/> dentro do tag, o sitemash ir usar o layout
main.gsp para mostr-la.
Voc pode mudar o main.gsp e o notLoggedin.gsp da forma que desejar, mas
importante entender que <g:layoutHead /> and <g:layoutBody /> iro manter os tags
HEAD and BODY das pginas usando este layout. Outra coisa importante saber que
o <g:render template="/menu" /> usado para construir os fragmentos de pgina que
so os arquivos GSP a seu nome de arquivo deve comear com um underscore (_).
Para substituir o logo do SerMyAdmin pelo seu. Coloque seu logo em
/usr/local/apache-tomcat-6.0.16/webapps/serMyAdmin-0.3/images, e edite os tags
que apontam para logo_voffice.png nos arquivos de layout. Como mostrado abaixo.
<div class="logo"><img
src="${createLinkTo(dir:'images',file:'my_new_logo.png')}" alt="Grails"
/></div>
No tag acima, ns trocamos o logo do serMyAdmin, trocando apenas o que est em
negrito.
Voc pode tambm mudar o look and feel do serMyAdmin modificando seu arquivo
CSS que podem ser encontradosem /usr/local/apache-tomcat-
6.0.16/webapps/serMyAdmin-0.3/css, no arquivo main.css voc encontrar todas as
classes para gerenciar a aparncia do serMyAdmin.
Por exemplo, se ns trocamos a classe background neste arquivo com os seguintes
parmetros.
body {
background: #00f;
color: #333;
font: 8px verdana, arial, helvetica, sans-serif;
}
101 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Ficamos com uma pgina como esta.
A pgina no a coisa mais bonita do planeta, mas estou certo de que voc pode fazer
bem melhor usando estes conceitos.
Sumrio
Neste captulo, voc aprendeu porque importante ter um portal de administrao.
um ponto onde voc vai ter de investir muitos recursos ao criar um provedor. Vrios
provedores esquecem-se de alocar tempo e recursos na construo do portal de
usurios dando toda importncia ao SIP Proxy. No entanto o SIP Proxy apenas um
dos componentes do provedor. Sem uma boa interface de administrao, um provedor
VoIP pode facilmente naufragar. serMyAdmin nossa contribuio ao projeto.
Desenvolvido usando Java e Groovy on Rails ele licenciado de acordo com a licena
GNU GPL. Voc aprendeu tambm como instalar, gerenciar usurios e domnios e
como customizar a aparncia. A ferramenta pode fazer muito mais e vamos mostrar
um pouco mais nos prximos captulos.
Rede Pblica
PSTN
(Operadora)
Telefone
Dispositivo comum
Gateway
SIP Proxy
Server
Existem vrios fabricantes deste tipo de equipamento no mercado tais como a Cisco
Systems, AudioCodes e Nortel. O Asterisk tambm permite a criao de um bom
gateway PSTN usando entroncamento analgico ou digital.
Ao final deste captulo voc estar apto :
Conectar-se a rede pblica atravs de um gateway que suporte SIP
Controlar o acesso aos recursos do gateway
Controlar as permisses usando groups
Usar o mdulo LCR para controlar os gateways
Usar o serMyAdmin para gerenciar as mquinas autorizadas, gateways e rotas
Onde estamos?
Uma soluo de um provedor VoIP possui muitos componentes. Para evitar perder a
perspectiva, ns iremos mostrar esta figura em cada captulo. Neste captulo ns
estamos trabalhando com o componente chamado SIP Proxy. Trabalhando junto com
um gateway para a rede pblica.
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Neste captulo aprenderemos sobre uma srie de novos mdulos do OPENSER como
o GROUP e PERMISSIONS e tambm a construir expresses regulares que vo
permitir o roteamento das chamadas. No difcil encontrar um bom tutorial sobre
expresses regulares. Um carto de referncia rpida pode ser encontrado em:
http://www.visibone.com/regular-expressions. Temos dois desafios a serem vencidos
nesta configurao. Tratar as mensagens vindas do gateway e para o gateway.
Para isto vamos usar o mdulo GROUP. Este mdulo exporta a funo
is_user_in(credentials, grupo) para verificar se o usurio pertence ou no
um determinado grupo. No exemplo abaixo criamos trs grupos local, para ligaes
locais, ld para ligaes de longa distncia e int para ligaes internacionais. No
script abaixo usamos expresses regulares para verificar se as mensagens so locais,
longa distncia ou internacionais.
Voc tem de inserir os grupos na tabela MySQL antes de us-los. Voc pode
facilmente inserir, remover e mostrar os membros de um grupo usando:
openserctl acl show [<username>]
openserctl acl grant <username> <group>
openserctl acl revoke <username> [<group>]
possvel tambm gerenciar suas tabelas usando o SerMyAdmin. Para adicionar e
remover grupos, voc pode usar a seo User Groups. L. voc pode adicionar e
deletar grupos.
Para mudar um usurio de um grupo para outro, voc pode ir para o menu de usurio
mostrado aqui.
105 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Marque as caixas para selecionar os grupos especficos ao qual o usurio pertence.
if (!allow_trusted()) {
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
exit;
} else if (!check_from()) {
sl_send_reply("403", "Use From=ID");
exit;
};
};
Voc pode ver e atualizar a tabela TRUSTED hosts usando o utilitrio serMyAdmin.
Use o menu trusted hosts como abaixo.
Para adicionar novos hosts, simplesmente clique no item New trusted Host.
107 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Route the call to the PSTN
Gateway
route[4] {
##--
## Send the call to the PSTN
## Change the IP address below to reflect
## your network
##--
rewritehostport("10.1.30.45");
route(1);
}
Script de configurao
E1 (30 canais)
Rede Ethernet
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
route{
#
# -- 1 -- Request Validation
#
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
#
# -- 2 -- Routing Preprocessing
#
## Record-route all except Register
if (!method=="REGISTER") record_route();
109 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
##Loose_route packets
if (loose_route()) {
# mark routing logic in request
append_hf("P-hint: rr-enforced\r\n");
route(1);
};
#
# -- 3 -- Determine Request Target
#
if (method=="REGISTER") {
route(2);
} else {
route(3);
};
route[1] {
#
# -- 4 -- Forward request to target
#
## Forward statefully
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[2] {
## Register request handler
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("403", "Forbidden");
exit;
};
save("location");
exit;
} else if {
sl_send_reply("403", "Forbidden");
};
}
route[3] {
## INVITE request handler
if (is_from_local()){
consume_credentials();
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
} else {
#From an external domain ->do not check credentials
#Verify aliases, if found replace R-URI.
lookup("aliases");
if (is_uri_host_local()) {
#-- Outbound to inbound
route(12);
} else {
# -- Outbound to outbound
route(13);
};
};
}
route[4] {
# routing to the public network
rewritehostport("10.1.30.45");
route(1);
}
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
#Gateway destinations are handled by regular expressions
append_hf("P-hint: inbound->inbound \r\n");
if (uri=~"^sip:[2-9][0-9]{6}@") {
111 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
if (is_user_in("credentials","local")) {
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for local calls");
exit;
};
};
if (uri=~"^sip:1[2-9][1-9]{9}@") {
if (is_user_in("credentials","ld")) {
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (uri=~"^sip:011[0-9]*@") {
if (is_user_in("credentials","int")) {
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for international
calls");
};
};
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
route[12] {
# From an external domain -> inbound
# Verify aliases, if found replace R-URI.
lookup("aliases");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
113 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
};
if (uri=~"^sip:0[1-9][0-9]{11}@") {
if (is_user_in("credentials","ld")) {
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (uri=~"^sip:00[1-9][0-9]*@") {
if (is_user_in("credentials","int")) {
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for internat. calls");
exit;
};
};
A instruo acima diz ao OPENSER para permitir quaisquer protocolos (udp ou tcp)
de IP 10.1.30.22 (IP do gateway) sem pedir credenciais. Voc deve reiniciar o
OPENSER aps alterar a tabela. Voc pode usar tambm o comando abaixo se no
quiser reiniciar.
debianSER#openserctl fifo trusted_reload
115 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Passo 2 Inclua os seus domnios na tabela domains
debianSer#mysql u openser p
-- enter your mysql password --
mysql> use openser;
INSERT INTO domain ( domain , last_modified )
VALUES ( 'voffice.com.br', '0000-00-00 00:00:00');
[sipproxy]
#calls incoming from the PSTN to be forwarded to clients behind the SIP
#proxy
type=peer
context=sipoutgoing
host=10.1.30.22
insecure=invite
disallow=all
allow=ulaw
Asterisk (extensions.conf)
[general]
[globals]
[sipincoming]
exten=>_[0-9].,1,Dial(Zap/g1/${EXTEN:1})
exten=>_[0-9].,2,hangup()
[sipoutgoing]
# If you have a digital interface use the lines below
exten=_[0-9].,1,Answer()
exten=_[0-9].,2,dial(SIP/${EXTEN}@sipproxy)
exten=_[0-9].,3,Hangup()
#If you have analog FXO interfaces use the lines below.
exten=s,1,Answer()
exten=s,2,dial(SIP/${EXTEN}@sipproxy)
exten=s,3,Hangup()
Gateway Cisco
voice class codec 1
codec preference 2 g711ulaw
!
interface Ethernet0/0
ip address 10.1.30.38 255.255.0.0
half-duplex
117 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
!
ip classless
ip route 0.0.0.0 0.0.0.0 10.1.0.1
no ip http server
ip pim bidir-enable
!
voice-port 1/0
!
voice-port 1/1
!
mgcp profile default
!
! Os comandos dial-peer pots vo permitir a entrada de chamadas
! jogando para rede publica os numeros vindos do proxy que
! comeam com 0.
!
dial-peer voice 1 pots
destination-pattern 0T
port 1/0
!
dial-peer voice 2 pots
destination-pattern 0T
port 1/1
!
! Nmeros entrando pela rede pblica com destino de 1000 1299 ! sero
encaminhados para o proxy (ramais).
!
dial-peer voice 123 voip
destination-pattern [1-9]T
session protocol sipv2
session target ipv4:10.1.30.22
dtmf-relay sip-notify
O mdulo LCR
O modulo LCR implanta dois recursos. O mais importante encaminhamento
seqencial do pedido para um ou mais gateways (load_gws() and next_gw()). Estas
funes sero usadas para enviar chamadas para os gateways e no caso de uma falha
7 | Conectividade com a rede pblica 118
enviar para o gateway seguinte. Voc pode usar tambm o mdulo LCR para o
encaminhamento seqencial de contatos baseado no valor Q (normalmente setado no
telefone IP para permitir mltiplos registros) usando load_contacts() e
next_contacts().
Diagrama de configurao
usa1
10.1.30.45
SIP Proxy
10.1.30.22
PSTN
200.31.31.31
200.61.61.61
Voip Provider
Voip Provider Asia
Europe
+61 Australia
+31 Netherlands
+81 Japan
+49 Germany
A tabela LCR
Na tabela lcr voc ir implantar as rotas. Os campos lcr so descritos abaixo.
Chamadas locais e de longa distncia sero prefixadas com o nmero +1305.
119 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Prefix From_uri Grp_id Priority
+31 % 3 1
+49 % 3 1
+61 % 2 1
+81 % 2 1
+1 % 1 1
Prefix Este prefixo comparado com a parte usurio da URI (nmero do
telephone)
From_uri O campo From_URI pode conter caracteres especiais. Use o
% para bater com quaisquer nmeros e o _ para bater com um nico
caracter
Grp_id O Grp_id identifica o grupo de gateways
Priority Prioridade dos gateways
A tabela de gateways
gw_name grp_id ip_addr port uri_scheme transport strip Prefix
Usa1 1 756941066 5060 1 1 2
Usa2 1 773718282 5060 1 1 2
Asia1 2 1027423688 5060 1 1 0
Europe1 3 522133448 5060 1 1 0
gw_name Nome do Gateway
grp_id Identificao do grupo de gateways
ip_addr Endereo IP do gateway (notao decimal inversa)
port (porta UDP/TCP)
uri_scheme sip(1), sips(2)
transport udp(1), tcp(2), tls(3)
strip Nmero de caracteres a serem removidos
prefix Prefixo a ser aplicado antes de enviar para o gateway
Notas:
Exemplos:
121 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
LAB Usando o recurso de LCR
br1
192.168.1.177
Vamos executar um laboratrio simples com o LCR. Neste LAB ns iremos precisar
de um servidor OpenSER, dois gateways e um telefone IP. Voc pode simular
facilmente este laboratrio usando um servidor Asterisk como gateway.
Passo 1: Construa um laboratrio com os gateways. Configure o gateway usa1 para
Receber chamadas com o prefixo +1 e o gateway br1 para receber chamadas com o
prefixo +55. NO gateway voc pode prefixar e remover nmeros antes de enviar a
chamada para o gateway.
Passo 2: Faa o download do arquivo de configurao em
http://www.asteriskguide.com/openser/openser.lcr e copie o para openser.cfg.
cd /etc/openser
wget http://www.sermyadmin.org/openser/openser.chapter7-2
cp openser.chapter7-2 openser.cfg
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "uri.so"
loadmodule "uri_db.so"
loadmodule "domain.so"
loadmodule "permissions.so"
loadmodule "group.so"
route{
#
# -- 1 -- Request Validation
#
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
#
# -- 2 -- Routing Preprocessing
#
## Record-route all except Register
if (!method=="REGISTER") record_route();
##Loose_route packets
if (loose_route()) {
# marca a logica de roteamento no pedido
append_hf("P-hint: roteado por loose_route\r\n");
route(1);
};
123 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
# -- 3 -- Determine Request Target
#
if (method=="REGISTER") {
route(2);
} else {
route(3);
};
}
route[1] {
#
# -- 4 -- Forward request to target
#
## Forward statefully
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[2] {
## Register request handler
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("403", "Forbidden");
exit;
};
save("location");
exit;
} else if {
sl_send_reply("403", "Forbidden");
};
}
route[3] {
## INVITE request handler
if (is_from_local()){
# From an internal domain -> check the credentials and the FROM
if(!allow_trusted()){
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","1");
exit;
} else if (!check_from()) {
sl_send_reply("403", "Forbidden, use From=ID");
exit;
};
consume_credentials();
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
} else {
#From an external domain ->do not check credentials
route[4] {
# routing to the public network
if (!load_gws()) {
sl_send_reply("503", "Unable to load gateways");
exit;
}
if(!next_gw()){
sl_send_reply("503", "Unable to find a gateway");
exit;
}
route(1);
exit;
}
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
#Gateway destinations are handled by regular expressions
#In our example we will normalize the number to e164 +1305XXXXXX
#to facilitate the posterior billing.
125 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
append_hf("P-hint: inbound->inbound \r\n");
if (uri=~"^sip:[2-9][0-9]{6}@") {
if (is_user_in("credentials","local")) {
# Assuming your country is USA (+1) and area code (305)
prefix(+1305);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for local calls");
exit;
};
};
if (uri=~"^sip:1[2-9][0-9]{9}@") {
if (is_user_in("credentials","ld")) {
prefix(+);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (uri=~"^sip:011[0-9]*@") {
if (is_user_in("credentials","int")) {
strip(2);
prefix(+);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for international
calls");
};
};
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
route[12] {
route[13] {
#From an external domain outbound
#we are not accepting these calls
append_hf("P-hint: outbound->inbound \r\n");
sl_send_reply("403", "Forbidden");
exit;
}
failure_route[1] {
if(!next_gw()) {
t_reply("503", "Service not available, no more gateways");
exit;
}
t_on_failure("1");
t_relay();
Passo 3: Use o utilitrio ngrep para capturar pacotes e se certificar que voc est
enviando as ligaes para os destinos corretos.
Passo 4: Adicione as rotas e gateways de acordo com a tabela abaixo. Use os
comandos openserctl lcr.
Rotas lcr
Grupos de gateways
127 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Voc pode usar o serMyAdmin para inserir os gatewyas.
grp_id grp_name
1 Usa
2 Br
Gateways
Sumrio
Neste captulo voc aprendeu como configurar o OPENSER para encaminhar
chamadas para um gateway. Aprendeu que o mdulo PERMISSIONS permite que a
autenticao do OPENSER seja evitada para pacotes vindos de gateways que
normalmente no enviam credenciais de autenticao. O mdulo GROUP permite que
os usurios sejam organizados em grupos com direitos de acesso deferentes. Quando o
nmero de gateways e destinos para se gerenciar muito grande, o uso do mdulo
LCR se faz necessrio. Aprendemos no final do captulo como us-lo.
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Encaminhamento de Chamadas
Nesta seo vamos implantar trs tipos de encaminhamento de chamadas. Este
encaminhamento importante, por exemplo, para a operao do correio de voz:
Siga-me (Blind Call Forwarding) Todas as mensagens de INVITE enviadas ao
telefone sero interceptadas no roteador SIP. O roteador SIP ir criar uma nova perna
e enviar uma mensagem de INVITE ao novo destino. Isto significa que o telefone
programado com o siga-me no vai nem mesmo tocar. Isto tambm significa que no
importa se o telefone est registrado ou no.
Siga-me se ocupado (Forward on Busy) Se o telefone responder a mensagem de
INVITE com uma mensagem 486 Ocupado (486 Busy), o OPENSER ir
interceptar esta resposta e criar uma nova perna da chamada, e ento enviar uma
mensagem de INVITE ao destino final.
Siga-me se no atender (Forward No Answer) Se um telefone responder a uma
mensagem de INVITE com uma mensagem 408 tempo esgotado no pedido (408
Request Timeout), o OpenSER ir interceptar esta mensagem e criar uma nova perna
de chamada e enviar um novo INVITE ao destino final.
O siga-me processado de forma diferente do siga-me se ocupado e siga-me se no
atende, pois ele altera a mensagem original de INVITE para refletir a nova R-URI,
enquanto os outros dois mtodos precisam de bem mais esforo para funcionar. Nos
outros dois tipos, preciso processar a resposta do comando e alterar a R-URI,
adicionar o novo destino e finalmente encaminhar a mensagem.
Todas as configuraes de encaminhamento so armazenadas na tabela
USR_PREFERENCES. Ns vamos usar o mdulo AVPOPS para ler as configuraes
de encaminhamento de chamados. AVPOPS tambm ser usado para alterar a
seqncia de chamados e fazer a ramificao em srie necessria.
8 | Encaminhamento de chamadas 130
Pseudo-variveis
Pseudo-variveis, como o prprio nome diz, so variveis que voc pode usar no seu
script como parmetros para algumas funes. Estas variveis sero substitudas antes
da execuo da funo. Alguns dos mdulos que podem receber pseudo-variveis
como parmetros so:
Acc
Avpops
Textops
Uac
Xlog
Uma pseudo-varivel sempre iniciada com $. Se voc quiser usar o character $ no
seu script ter de referenci-lo como $$. Existe um conjunto pr-definido de pseudo-
variveis.
131 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
$mb SIP message buffer
$mf Flags
$mF Flags in hexadecimal
$mi SIP message id
$ml SIP message length
$od Domain in SIP requests original URI
$op Port of Sip requests original URI
$oP Transport protocol of SIP requests original URI
$ou Requests original URI
$oU Username in SIP requests original URI
$pp Process id
$rd Domain in SIP requests URI
$rb Body of request/reply
$rc Returned code
$rm SIP requests method
$rp SIP requests port of R-URI
$rP Transport protocol of SIP request URI
$rr SIP reply reason
$rs SIP reply status
$rt Refer-to URI
$ru SIP requests URI
$rU Username in SIP requests URI
$Ri Received IP address
$Rp Received Port
$si IP source address
$sp Source port
$td To URI domain
$tn To display name
$tt To tag
$tu To URI
$tU To URI Username
$Tf String formatted time
$Ts Unix time stamp
Onde o ID :
si:name O nome do identificador do AVP. s e i especificando string
ou inteiro
name O nome do alias AVP. Ele pode ser uma string ou um inteiro
Exemplos
$avp(i:700)
$avp(s:blacklist)
Para aqueles que conhecem o Asterisk, o mdulo AVPOPS est para o OpenSER da
mesma forma que o AstDB est para o Asterisk. Entretanto, a implantao bem
diferente. Alm disso, os AVPs so muito mais poderosos permitindo recursos
avanados tais como pesquisas na base de dados e enviar dados diretamente para os
cabealhos de um pacote SIP. Existem vrias funes associadas aos AVPs.
avp_db_load:Carrega os AVPs de uma base de dados para a memria
avp_db_store: Armazena os AVPs emu ma base de dados
avp_db_delete: Deleta os AVPs da base de dados
avp_db_query:Faz uma pesquisa no banco de dados e retorna o resultado
em um AVP.
avp_delete: Deleta os AVPs da memria
avp_pushto: Coloca o valor de um AVP em uma mensagem SIP
avp_check: Verifica o valor de um AVP usando um operador (=;<;>)
avp_copy: Copia um AVP para outro
avp_printf: Formata uma string em um AVP
avp_subst: Encontra e substitui valores em um AVP
avp_op: Permite operaes matemticas em um AVP
133 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
is_avp_set: Verifica se o nome de um AVP est sendo usado
avp_print: Imprime todos os AVPs na memria (para depurao)
Voc pode verificar a sintaxe para estas funes na documentao. Por enquanto,
vamos entender como usar as funes avp_db_load e avp_pushto que sero usadas no
nosso script. Existe um tutorial excelente sobre AVPs em http://www.voice-
system.ro/docs.
AVPs no so exatamente simples, mas se voc pensar neles como simples pares de
atributo:valor eles no so to complexos tambm. No entanto a carga destes AVPs a
partir do banco de dados pode parecer confusa a princpio. A tabela padro a
usr_preference (user preferences). Algumas vezes o valor que nos queremos no est
associado a um usurio especfico, mas ao domnio. De qualquer forma, todos os
AVPs sendo carregados da base de dados vm da tabela usr_preference.
Exemplo: Para o encaminhamento de chamadas, ns temos um atributo chamado call
forward associado ao usurio. Ele realmente uma preferncia do usurio. Vamos
verificar a estrutura da tabela usr_preference.
id uuid usernam domain attribute type value Last_modified
e
1001 callfwd 0 sip:1004@yourdomain
O id um campo auto-incrementvel.
uuid um identificador nico do usurio
username para nome do usurio
domain para domnio
attribute (O nome do AVP)
type (0Avp str|Val Str,1Avp str|Val Int,2Avp int|Val Str,3-Avp int|Val int)
value (O valor do AVP)
last modified (A data da ltima modificao)
Os AVPs podem estar associados a um usurio ou domnio. Isto permite que voc
carregue os AVPS associados com quaisquer destes parmetros. Voc pode associar
um AVP a um uuid (unique user id), a um nome de usurio (setup com nico
domnio) ou a um nome de usurio e domnio (mltiplos domnios).
Na funo avp_db_load o primeiro parmetro a fonte e o segundo o nome do AVP.
Desta forma, a funo abaixo ir carregar a AVP do tipo string chamada callfwd para
o usurio que corresponde a $ruri na coluna username.
(avp_db_load("$ruri/username","s:callfwd")
Mais tarde ns vamos colocar o valor deste AVP para o pacote SIP mudando a $ruri
original para a nova.
avp_pushto("$ruri","s:callfwd");
135 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Se voc estiver trabalhando em um ambiente multi-domnio, pro favor habilite o
parmetro multi-domnio do mdulo AVPOPS e insira os nomes de domnio tambm
a base de dados.
Com o registro acima estamos dizendo ao sistema para encaminhar todas as chamadas
do assinante 1001 para o assinante 1004 de forma incondicional.
Na seo route[3]:
if(avp_db_load("$ru/username","$avp(s:callfwd)")) {
avp_pushto("$ru", "$avp(s:callfwd)");
xlog("forwarded to: $avp(s:callfwd)");
route(1);
exit;
}
consume_credentials();
Passo 5: Registre os telefones 1001 e 1004. Chame de 1001 para o 1000. O sistema
deve encaminhar automaticamente para o telefone 1004 como, instrudo na tabela
usr_preferences.
137 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Failure Route
At the end of the file
Before the t_relay() failure_route[1] {
if (t_was_cancelled()) {
t_on_failure("1");
exit;
};
if (t_check_status("486")) {
revert_uri();
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
if (t_check_status("408") ||
t_check_status("480")) {
revert_uri();
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
}
Nesta lgica, logo antes de enviar o INVITE para o processamento padro, chamamos
a funo t_on_failure. Isto vai fazer com que possamos tratar as rotas na
failure_route(1).
Vamos usar como exemplo uma configurao mais parecida com a prtica possvel.
Ao receber uma chamada ocupada, vamos adicionar a letra b na frente da uri
original e despachar para um servidor Asterisk que vai processar a caixa de correio de
voz (voicemail(b${EXTEN}). Ao receber uma mensagem de timeout, vamos despachar
para o mesmo servidor Asterisk para o correio de voz, mas vamos adicionar a letra
u com a mensagem de no atendido (voicemail(u${EXTEN}).
Segue abaixo destacado as mudanas do script anterior para o novo.
#
# $Id: openser.cfg 1676 2007-02-21 13:16:34Z bogdan_iancu $
#
# simple quick-start config script
# Please refer to the Core CookBook at
http://www.openser.org/dokuwiki/doku.php
# for a explanation of possible statements, functions and parameters.
#
loadmodule "mysql.so"
loadmodule "sl.so"
route{
#
# -- 1 -- Request Validation
#
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
139 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
#
# -- 2 -- Routing Preprocessing
#
## Record-route all except Register
if (!method=="REGISTER") record_route();
##Loose_route packets
if (loose_route()) {
# marca a logica de roteamento no pedido
append_hf("P-hint: roteado por loose_route\r\n");
route(1);
};
#
# -- 3 -- Determine Request Target
#
if (method=="REGISTER") {
route(2);
} else {
route(3);
};
}
route[1] {
#
# -- 4 -- Forward request to target
#
## Forward statefully
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[2] {
## Register request handler
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("403", "Forbidden");
exit;
};
if (!save("location"));
sl_reply_error();
};
exit;
}
if(avp_db_load("$ru/username","$avp(s:callfwd)")) {
avp_pushto("$ru", "$avp(s:callfwd)");
xlog("$avp(s:callfwd)");
route(1);
exit;
}
consume_credentials();
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
} else {
#From an external domain ->do not check credentials
#Verify aliases, if found replace R-URI.
lookup("aliases");
if (is_uri_host_local()) {
#-- Outbound to inbound
route(12);
} else {
# -- Outbound to outbound
route(13);
};
};
}
route[4] {
# routing to the public network
141 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
if (!load_gws()) {
sl_send_reply("503", "Unable to load gateways");
exit;
}
if(!next_gw()){
sl_send_reply("503", "Unable to find a gateway");
exit;
}
route(5);
exit;
}
route[5] {
#
# -- 4 -- T_relay for gateways
#
## Forward statefully, if failure load other gateways
t_on_failure("2");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[10] {
#from an internal domain -> inbound
#Native SIP dest.are handled using the location table
#Gateway destinations are handled by regular expressions
append_hf("P-hint: inbound->inbound \r\n");
if (uri=~"^sip:[2-9][0-9]{6}@") {
if (is_user_in("credentials","local")) {
prefix("+1305");
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for local calls");
exit;
};
};
if (uri=~"^sip:1[2-9][0-9]{9}@") {
if (is_user_in("credentials","ld")) {
strip(1);
prefix("+1");
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (!lookup("location")) {
if (does_uri_exist()) {
## User not registered at this time.
## Use the IP Address of your e-mail server
revert_uri();
prefix("u");
rewritehostport("192.168.1.171"); #Use the IP address of your
voicemail server
route(1);
} else {
sl_send_reply("404", "Not Found");
exit;
}
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
route[12] {
# From an external domain -> inbound
# Verify aliases, if found replace R-URI.
lookup("aliases");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[13] {
#From an external domain outbound
#we are not accepting these calls
143 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
append_hf("P-hint: outbound->inbound \r\n");
sl_send_reply("403", "Forbidden");
exit;
}
failure_route[1] {
##--
##-- If cancelled, exit.
##--
if (t_was_cancelled()) {
exit;
};
##--
##-- If busy send to the e-mail server, prefix the "b"
##-- character to indicate busy.
##--
if (t_check_status("486")) {
revert_uri();
prefix("b");
xlog("L_ERR","Stepped into the 486 ruri=<$ru>");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
##--
##-- If timeout (408) or unavailable temporarily (480),
##-- prefix the uri with the "u"character to indicate
##-- unanswered and send to the e-mail
##-- sever
##--
if (t_check_status("408") || t_check_status("480")) {
revert_uri();
prefix("u");
xlog("L_ERR","Stepped into the 480 ruri=<$ru>");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
}
failure_route[2] {
if (t_was_cancelled()) {
exit;
};
if(!next_gw()) {
t_reply("503", "Service not available, no more gateways");
exit;
}
t_on_failure("1");
t_relay();
};
145 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
};
Se o status for igual a 486 (busy here) ele reverte a uri original, adiciona a letra b na
uri para processamento no correio de voz. Reescreve o host para o servidor onde est
o correio, emite o comando append_branch para adicionar o destino e encaminha o
pedido.
A mesma lgica seguida para as mensagens 408 e 480.
##-- If timeout (408) or unavailable temporarily (480),
##-- prefix the uri with the "u"character to indicate
##-- unanswered and send to the e-mail
##-- sever
##--
if (t_check_status("408") || t_check_status("480")) {
revert_uri();
prefix("u");
xlog("L_ERR","Stepped into the 480 ruri=<$ru>");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
exten=>_b.,2,hangup()
Sumrio
Neste captulo aprendemos como usar os pares atributo:valor para armazenarmos
dados referentes as preferncias dos usurios como siga-me. Usando o roteamento
em falhas, tratamos os trs tipos de situao mais comuns como usurio no
registrado, usurio no atende e usurio ocupado. Aprendemos como encaminhar
estes nmeros para uma mquina de correio de voz como o Asterisk.
147 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
9
Tcnicas de travessia de NAT
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Tipos de NAT
Existem quatro tipos de NAT. Como definidos
Full Cone
Restricted Cone
Port Restricted Cone
Symmetric
Para um dado endereo interno, os trs primeiros tipos de NAT mantm um
mapeamento do seu endereo interno que independente do endereo de destino
sendo visto. O quarto tipo de NAT ir alocar um novo mapeamento para cada
endereo de destino de forma independente. A menos que haja uma tabela de
mapeamento esttico, o mapeamento aberto quando o primeiro pacote enviado de
um cliente atravs do NAT pode ser vlido apenas por certo tempo, tipicamente
alguns minutos, a menos que os pacotes continuem a ser enviados e recebidos em uma
porta IP.
149 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Por exemplo:
Um computador atrs de um NAT com IP 10.0.0.1 enviando e recebendo na porta
8000 mapeado para a porta externa IP no dispositivo NAT no endereo IP
200.180.4.168:1234. Qualquer um na Internet pode enviar pacotes para este endereo
e porta IP e estes pacotes sero passados para o cliente na mquina que est esperando
no endereo IP 10.0.0.1:8000.
o caso de Firewalls sem controle de sesso. Normalmente isto implantado atravs
de filtros de pacotes sendo o tipo menos seguro de firewall. Este tipo de firewall
cada vez menos comum nos dias de hoje.
Simtrico
151 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Resumo dos tipos de Firewall
Tipos de NAT Precisa enviar possvel Ele restring os
dados antes de determinar o par pacotes de
receber ip:porta para os entrada para o
pacotes de retorno destino ip:porta
Cone No Sim No
SIP/2.0 200 OK
Via: SIP/2.0/UDP 200.247.7.1:5060;branch=a5678432-fe567ea
Via: SIP/2.0/UDP 192.168.1.1:5060;received=200.215.1.1;rport=12400
;branch=a5678432-fe567ea
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.1:5060;received=200.215.1.1;rport=12400
;branch=a5678432-fe567ea
200.215.1.1:12400
External address and port
SIP Proxy
192.168.1.1:5060
UAC 200.247.7.1 UAC
SIP SIP
SI
P P
SI
SDP
manipulation
RT P
P RT
RTP RTP
Media Proxy
Bridges de RTP flows
(registered IP address)
Quando voc usa um Media Proxya, que tambm conhecido como Media Relay
Server, ele conecta os dois fluxos de mdia vindo dos UACs. Por enquanto, o nico
meio de passar por um dispositivo operando como NAT simtrico. O script ir mudar
o endereo SDP para forar os pacotes de RTP sobre o Media Proxy usando a funo
use_media_proxy().
Voc deve especificar a soma dos testes a serem feitos. A funo ira retornar
verdadeiro se qualquer um dos testes der positivo. Se voc quiser fazer os testes 1,
2 e 4, por exemplo, especifique a soma, 7, como o parmetro da funo.
if (client_nat_test("3")) {
xlog("L_INFO", "Route[3] M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
append_hf("P-hint: Route(3)- setflag7,forcerport,fix_contact \r\n");
setflag(7);
force_rport();
fix_contact()
};
155 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Nos pedidos do tipo REGISTER ns lidvamos apenas com o protocolo SIP. Agora
nas mensagens de INVITE temos de lidar com mensagens de SIP e RTP. Para isto
teremos de modificar os cabealhos SIP e SDP. Alm disso, a informao de contato
est errada, ela aponta para um endereo RFC1918. A funo fix_nated_contact()
exportada pelo modulo NATHELPER vai mudar o endereo do campo CONTACT
para o seu correspondente pblico. Outras mensagens como ACK, BYE e CANCEL
tambm precisam ser corrigidas.
if (isflagset(6) || isflagset(7)) {
xlog("L_INFO", "Use mediaproxy: M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n");
append_hf("P-hint: Route[6]: mediaproxy \r\n");
use_media_proxy();
};
cd /usr/local
wget http://mediaproxy.ag-projects.com/mediaproxy-1.8.2.tar.gz
tar xzvf mediaproxy-1.8.2.tar.gz
[Dispatcher]
;Section for configuring the proxy dispatcher
;
;The following options are available here:
;;start Boolean value that specifies if to start the dispatcher.
; Default value: Yes
;
157 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
; socket Path to the UNIX socket where the dispatcher receives commands
; from SER. This should match the value for mediaproxy_socket in
; openser.cfg. Use the keyword None to disable listening on a
; local socket.
; Default value: /var/run/proxydispatcher.sock
;
; listen Network address where the dispatcher receives commands from
; a remote Mediaproxy to close sessions for which media did
; timeout.
; Valid values for this are:
; - Default
; when using this keyword it will listen on 0.0.0.0:25061
; - address[:port]
; listen on the specified address and port
; address can be an IP a hostname or the keyword Any
; (in which case it will listen on 0.0.0.0). If address is
; a hostname, that should map in DNS to an IP address
; present on the machine, through an A record.
; If port is missing assume 25061.
;
; Default value: Default
;
; group Put the socket in this group and make it group writable.
; Default value: openser
;
; defaultProxy Default mediaproxy to use in case the From/To domains
; involved in the call don't define any.
; Valid values for this are:
;
; -None
; don't use any default proxies. domains without
; mediaproxy SRV records won't work
; -/path/to/unix/socket
; use a single MediaProxy server identified by the given
; UNIX socket path
; -IP_or_hostname[:port]
; use a single MediaProxy server identified by its network
; address. The network address consists of an IP address
; or a hostname and an optional port number separated by
; a double colon. If port is missing 25060 will be
; assumed.
; Examples:
; 10.0.0.1 (connect to 10.0.0.1 on port 25060)
; 10.0.0.1:90 (connect to 10.0.0.1 on port 90)
; mp1.mydomain.com
; mp1.mydomain.com:7000
; -domain://domain_name
; Use all MediaProxies defined by domain_name, honoring
; their priority and weight to create a cluster of
; proxies with fallback and load balancing capabilities.
;
; Default value: /var/run/mediaproxy.sock
;
;start = yes
[MediaProxy]
;
; Section for configuring the MediaProxy server
;
; The following options are available here:
;
; start Boolean value that specifies if to start the RTP proxy server.
; Default value: Yes
;
; socket Path to the UNIX socket where MediaProxy receives commands
; from the dispatcher or SER. Use the keyword None to disable
; listening on a local socket.
; Default value: /var/run/mediaproxy.sock
;
; group Put the socket in this group and make it group writable.
; Default value: openser
;
; listen Network address where MediaProxy receives commands from
; a remote dispatcher.
; Valid values for this are:
;
; - None
; don't listen for network connections at all
; - address[:port]
; listen on the specified address and port
; address can be an IP a hostname or the keyword Any
; (in which case it will listen on 0.0.0.0). If address is
; a hostname, that should map in DNS to an IP address
; present on the machine, through an A record.
; If port is missing assume 25060.
;
; Default value: None
;
; allow List of addresses that are allowed to connect to this
; MediaProxy server and send commands.
; They are specified as a comma separated list of entries, with
; each entry being specified in the CIDR network/mask notation
; (ex. 10.0.0.0/8)
;
; In addition simple IP addresses or hostnames are allowed, in
; which case the mask is considered to be 32.
;
; In addition to network ranges/addresses 2 keywords can be used
; for this option:
; None to specify that none is allowed to connect (not very
; useful but this is the default for security reasons)
; Any to specify that anyone is allowed to connect
; (dangerous!)
;
159 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
; Example: allow = 10.0.0.0/24, home-pc.mydomain.com, 1.2.3.4
;
; Default value: None
;
; proxyIP IP address to use to talk to the phones. If not specified, the
; first found will be used. However first found usually means
; first defined in /etc/hosts which may not be what you want.
; If you find that the address that's automatically selected is
; not the one you want, you can specify the right one using this
; option. The address must be one that's present on one of the
; host's interfaces.
;
; portRange The range of ports to use for proxying the rtp streams.
; This option is specified as minport:maxport with minport and
; maxport being even numbers in the range 1024-65536
; Default value: 60000:65000
;
; TOS Mark all forwarded RTP packets with this specific TOS value.
; Unless you know what TOS means, leave this option alone.
; The TOS value can be specified either as a decimal number or
; as a hex number in the 0xnn format.
; Default value: 0xb8
;
; idleTimeout Expire idle sessions after this much time.
; Default 60 seconds
;
; holdTimeout Expire calls on hold after this much time.
; Default value is 3600 seconds
;
; forceClose Forcibly close a RTP session after this many seconds even
; if it's still active. If forceClose is 0, then
a session
; is never closed no matter how long it lasts.
; Default value: 0
;
start = yes
socket = /var/run/mediaproxy.sock
group = openser
;listen = None
;allow = None
proxyIP = 10.0.0.1
;portRange = 60000:65000
;TOS = 0xb8
;idleTimeout = 60
;holdTimeout = 3600
;forceClose = 0
[Accounting]
; one of none, radius or database
accounting = none
[Database]
user = dbuser
password = dbpass
[Radius]
secret = secret
server = localhost
authport = 1812
acctport = 1813
dictionaries = /etc/radiusclient-ng/dictionary,
/etc/openser/radius/dictionary, /usr/local/mediaproxy/dictionary
retries = 2
timeout = 3
loadmodule "/usr/lib/openser/modules/nathelper.so"
loadmodule "/usr/lib/openser/modules/mediaproxy.so"
modparam("nathelper", "natping_interval", 0)
161 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
O OpenSER e o controlador do Media Proxy se comunicam via um socket padro do
Unix que especificado aqui.
modparam("mediaproxy","mediaproxy_socket", "/var/run/mediaproxy.sock")
O Media Proxy pode precisar conhecer quando um SIP UA assimtrico com respeito
sua porta SIP. A maioria dos UAs simtrica, em outras palavras eles recebem e
enviam as mensagens na mesma porta. Se voc encontrar clientes assimtricos que
no so manuseados corretamente, voc pode especificar seus cabealhos de User-
Agent neste local.
modparam("mediaproxy","sip_asymmetrics","/etc/openser/sip-clients")
Usamos o parmetro abaixo para permitir que o mdulo Registrar armazene o flag de
nmero 6 (arbitrariamente escolhido). Isto vai indicar na tabela de localizao que
este cliente est atrs de NAT
modparam("registrar", "nat_flag", 6)
};
};
route(1);
A seo route[6] um bloco usado para habilitar o uso do Media Proxy no caso do
emissor (flag 7) ou o recipiente da mensagem (flag 6) estarem atrs de NAT.
};
};
};
No evento de nossa mensagem no mais ser gerenciada pelo nosso SIP router,
chamamos nossa rotina de manuseio do NAT para habilitar o Media Proxy se
necessrio antes de enviar a mensagem para o seu destino.
165 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
};
sl_reply_error();
};
exit;
Roteamento
#
# $Id: openser.cfg 1676 2007-02-21 13:16:34Z bogdan_iancu $
#
# simple quick-start config script
# Please refer to the Core CookBook at
http://www.openser.org/dokuwiki/doku.php
# for a explanation of possible statements, functions and parameters.
#
loadmodule "mysql.so"
loadmodule "sl.so"
route{
167 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
# -- 1 -- Request Validation
#
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
#
# -- 2 -- Routing Preprocessing
#
## Record-route all except Register
## Mark packets with nat=yes
## This mark will be used to identify the request in the loose
## route section
if(!is_method("REGISTER")){
if(nat_uac_test("19")){
record_route(";nat=yes");
} else {
record_route();
};
};
##Loose_route packets
if (has_totag()) {
#sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
#Check authentication of re-invites
if(method=="INVITE" && (!allow_trusted())) {
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","1");
exit;
} else if (!check_from()) {
sl_send_reply("403", "Forbidden, use From=ID");
exit;
};
};
if(method=="BYE" || method=="CANCEL") {
end_media_session();
};
##Detect requests in the dialog behind NA, flag with 6
if(nat_uac_test("19") || search("^Route:.*;nat=yes")){
append_hf("P-hint: LR|fixcontact,setflag6\r\n");
fix_contact();
setbflag(6);
};
route(1);
} else {
sl_send_reply("404","Not here");
#CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans()) {
end_media_session();
t_relay();
};
exit;
}
t_check_trans();
#
# -- 3 -- Determine Request Target
#
if (method=="REGISTER") {
route(2);
} else {
route(3);
};
}
route[1] {
#
# -- 4 -- Forward request to target
#
# Forward statefully
t_on_reply("1");
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[2] {
## Register request handler
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("403", "Forbidden");
exit;
};
169 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
fix_nated_register();
force_rport();
};
save("location");
exit;
} else if {
sl_send_reply("403", "Forbidden");
};
}
route[3] {
## Requests handler
if (is_from_local()){
# From an internal domain -> check the credentials and the FROM
if(!allow_trusted()){
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
exit;
} else if(!check_from()) {
sl_send_reply("403", "Forbidden, use From=ID");
exit;
};
};
if (client_nat_test("3")) {
append_hf("P-hint: setflag7|forcerport|fix_contact\r\n");
setbflag(7);
force_rport();
fix_contact();
};
consume_credentials();
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
route[4] {
# routing to the public network
if (!load_gws()) {
sl_send_reply("503", "Unable to load gateways");
exit;
}
if(!next_gw()){
sl_send_reply("503", "Unable to find a gateway");
exit;
}
t_on_failure("2");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[6] {
#
# -- NAT handling --
#
if (isbflagset(6) || isbflagset(7)) {
append_hf("P-hint: Route[6]: mediaproxy \r\n");
use_media_proxy();
};
}
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
#Gateway destinations are handled by regular expressions
append_hf("P-hint: inbound->inbound \r\n");
if (uri=~"^sip:[2-9][0-9]{6}@") {
if (is_user_in("credentials","local")) {
prefix("+1305");
route(6);
171 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for local calls");
exit;
};
};
if (uri=~"^sip:1[2-9][0-9]{9}@") {
if (is_user_in("credentials","ld")) {
strip(1);
prefix("+1");
route(6);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (uri=~"^sip:011[0-9]*@") {
if (is_user_in("credentials","int")) {
strip(3);
prefix("+");
route(6);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for international calls");
};
};
if (!lookup("location")) {
if (does_uri_exist()) {
## User not registered at this time.
## Use the IP Address of your e-mail server
revert_uri();
prefix("u");
rewritehostport("192.168.1.171"); #Use the IP address of your
voicemail server
route(6);
route(1);
} else {
sl_send_reply("404", "Not Found");
exit;
}
sl_send_reply("404", "Not Found");
exit;
};
route(6);
route(1);
}
route[12] {
# From an external domain -> inbound
# Verify aliases, if found replace R-URI.
lookup("aliases");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[13] {
#From an external domain outbound
#we are not accepting these calls
append_hf("P-hint: outbound->inbound \r\n");
sl_send_reply("403", "Forbidden");
exit;
}
failure_route[1] {
##--
##-- If cancelled, exit.
##--
if (t_was_cancelled()) {
exit;
};
##--
##-- If busy send to the e-mail server, prefix the "b"
##-- character to indicate busy.
##--
if (t_check_status("486")) {
revert_uri();
prefix("b");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
##--
##-- If timeout (408) or unavailable temporarily (480),
##-- prefix the uri with the "u"character to indicate
##-- unanswered and send to the e-mail
##-- sever
##--
if (t_check_status("408") || t_check_status("480")) {
revert_uri();
173 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
prefix("u");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
}
failure_route[2] {
if(!next_gw()) {
t_reply("503", "Service not available, no more gateways");
exit;
};
t_on_failure("2");
t_relay();
}
onreply_route[1] {
#
#-- On-replay block routing --
#
if (client_nat_test("1")) {
append_hf("P-hint: Onreply-route - fixcontact \r\n");
fix_contact();
};
175 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
a=fmtp:101 0-15.
a=sendrecv.
177 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
o=sdp_admin 30472538 21739392 IN IP4 192.168.0.111.
s=A conversation.
c=IN IP4 8.8.3.48.
t=0 0.
m=audio 60012 RTP/AVP 0 4 18 8 101.
a=rtpmap:0 PCMU/8000.
a=rtpmap:4 G723/8000.
a=rtpmap:18 G729/8000.
a=rtpmap:8 PCMA/8000.
a=rtpmap:101 telephone-event/8000.
a=fmtp:101 0-15.
a=sendrecv.
179 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
m=audio 60012 RTP/AVP 0 4 18 8.
a=rtpmap:0 PCMU/8000.
a=rtpmap:4 G723/8000.
a=rtpmap:18 G729/8000.
a=rtpmap:8 PCMA/8000.
a=sendrecv.
181 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Ambiente do Laboratrio
PC com Linux
Instalado e
OpenSER
SIP - Proxy
Internet
Firewall 1 Firewall 2
Adaptador de
Telefonia
Analgica
Estao de
trabalho com
Softfone
Passo 6: Monte o seu laboratrio e register os telephones 1000 e 1001 atrs dos
dispositivos NAT.
Passo 7: Use o ngrep para capturar todos os pacotes
ngrep p q W byline port 5060
Usando STUN
A travessia simples do UDP sobre NAT ou simplesmente STUN um dos mtodos
mais comuns para travessia de NAT implantada nos clientes. Ele definido na
Test I
No yes yes
No
UDP Blocked Response? Same IP? Test II
NAT
No
No
NAT Symmetric
Full Cone Response?
Detected Firewall
Yes
Yes
Test I No
2nd IP Response? Test II Open Internet
Address
yes
yes
Symmetric No Test
Same IP? Response Restricted
NAT III
No
Port restricted
183 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Se voc usar o STUN no cliente, no ser necessrio fazer quaisquer
mudanas no script openser.cfg. Ele trabalha como se os clientes estivessem
conectados Internet
Sumrio
Neste captulo voc foi apresentado os diferentes tipos de NAT. Voc entendeu as
implicaes de dispositivos com NAT simtrico e tambm quando usar STUN ou
TURN. No final teve a oportunidade de implantar uma soluo baseada no software
Media Proxy que resolve os problemas mais comuns de travessia de NAT.
185 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
10
Bilhetagem usando Radius e
CDRTool
Neste captulo vamos primeiro aprender a instalar a contabilizao. Ela vai medir a
durao das ligaes a partir do estabelecimento da chamada at o seu encerramento.
Vamos comear com a contabilizao das chamadas usando o MySQL por ser mais
simples. Depois vamos aumentar o grau de dificuldade contabilizando as chamadas
em um servidor Radius. importante entender que a contabilizao s computa o
nmero de minutos da chamada. preciso uma ferramenta de tarifao (rating) que
permita aplicar valores as chamadas. Na ltima parte deste captulo vamos instalar
uma ferramenta de tarifao no nosso servidor.
Ao final deste captulo o leitor deve estar apto :
Habilitar a bilhetagem no MySQL
Habilitar a bilhetagem em um servidor Radius
Fazer a tarifao dos bilhetes usando CDRTool
Onde estamos?
Ns vamos trabalhar na parte de bilhetagem do sistema. O Proxy j est funcionando
bem, completando chamadas entre usurios e gateways. No entanto, ns ainda no
estamos bilhetando as chamadas. A bilhetagem um processo em duas fases. Na
primeira, determinamos a durao da chamada. Isto feito atravs de Radius ou
MySQL. A segunda fase colocar um preo na chamada. Ns iremos usar o
CDRTool, uma ferramenta em cdigo livre para nos ajudar com esta tarefa.
The SIP provider MySQL/Postgres/
Big Picture Unixodbc Database
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Autenticao e
Contabilizao no MySQL
UAC
UAC
187 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Configurando e Instalando a Bilhetagem
A bilhetagem uma forma excepcional de verificao das mensagens, j que ela traz
o status das transaes. importante ressaltar que o SIP transacional, ento a
bilhetagem traz o resultado das transaes de INVITE e BYE. Correlacionar elas fica
a cargo de um software externo. Um SIP Proxy no o local ideal para contabilizar as
ligaes, uma ligao onde o BYE no tenha sido recebido ficar em aberto. O local
apropriado para contabilizar so os gateways PSTN onde possvel configurar um
timeout de uma ligao que no tenha recebido a transao BYE. De qualquer
forma habilitar a bilhetagem no difcil ela vai contabilizar corretamente a maioria
das ligaes e uma ferramenta de depurao excepcional.
Para contabilizar usaremos o mdulo ACC. Ele vai contabilizar dentro do banco de
dados MySQL na tabela ACC. O mdulo ACC para a verso 1.2 um pouco diferente
do existente na verso 1.1. O mdulo registra por default apenas os seguintes dados:
id method from_tag to_tag callid sip_code sip_reason time
1 INVITE 5d09d45a 27095f70 ZTY5ND. 200 OK 2008-04-07
09:13:21
2 BYE 5d09d45a 27095f70 ZTY5ND. 200 OK 2008-04-07
09:13:30
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "uri.so"
loadmodule "uri_db.so"
loadmodule "domain.so"
loadmodule "permissions.so"
loadmodule "group.so"
loadmodule "acc.so"
modparam("usrloc", "db_mode", 2)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("rr", "enable_full_lr", 1)
modparam("auth_db|permissions|uri_db|usrloc","db_url","mysql://openser:opens
errw@localhost/openser")
modparam("permissions", "db_mode", 1)
modparam("permissions", "trusted_table", "trusted")
modparam("acc", "db_flag", 2)
modparam("acc", "db_missed_flag", 3)
modparam("acc", "db_url", "mysql://openser:openserrw@localhost/openser")
modparam("acc", "db_extra", "from_uri=$fu; to_uri=$tu")
route{
189 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
#
# -- 1 -- Request Validation
#
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
#
# -- 2 -- Routing Preprocessing
#
## Record-route all except Register
if (!method=="REGISTER") record_route();
##Loose_route packets
if (has_totag()) {
#sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if(method=="BYE") {
#Account BYE transactions
setflag(2);
};
#Check authentication of re-invites
if(method=="INVITE" && (!allow_trusted())) {
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","1");
exit;
} else if (!check_from()) {
sl_send_reply("403", "Forbidden, use From=ID");
exit;
};
};
route(1);
} else {
sl_send_reply("404","Not here");
}
exit;
}
#CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans()) t_relay();
exit;
};
t_check_trans();
route[1] {
#
# -- 4 -- Forward request to target
#
## Forward statefully
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[2] {
## Register request handler
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("403", "Forbidden");
exit;
};
save("location");
exit;
} else if {
sl_send_reply("401", "Forbidden");
};
}
route[3] {
## Non-Register request handler
if (method=="INVITE") {
# Account INVITE packets
setflag(2);
# Account Missed calls
setflag(3);
};
if (is_from_local()){
# From an internal domain -> check the credentials and the FROM
if(!allow_trusted()){
if (!proxy_authorize("","subscriber")) {
191 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
proxy_challenge("","1");
exit;
} else if (!check_from()) {
sl_send_reply("403", "Forbidden, use From=ID");
exit;
};
} else {
log("Request bypassed the auth.using allow_trusted");
};
consume_credentials();
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
} else {
#From an external domain ->do not check credentials
route[4] {
# routing to the public network
rewritehostport("10.125.123.177");
route(1);
}
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
#Gateway destinations are handled by regular expressions
append_hf("P-hint: inbound->inbound \r\n");
if (uri=~"^sip:[2-9][0-9]{6}@") {
if (is_user_in("credentials","local")) {
prefix("+1305");
route(4);
if (uri=~"^sip:[2-9][1-9]{9}@") {
if (is_user_in("credentials","ld")) {
prefix("+1");
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (uri=~"^sip:011[0-9]*@") {
if (is_user_in("credentials","int")) {
strip(3);
prefix("+");
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for international
calls");
};
};
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
route[12] {
# From an external domain -> inbound
# Verify aliases, if found replace R-URI.
lookup("aliases");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
193 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
}
route[13] {
#From an external domain outbound
#we are not accepting these calls
append_hf("P-hint: outbound->inbound \r\n");
sl_send_reply("403", "Forbidden");
exit;
};
};
UAC
Servidor SIP RADIUS
UAC (Radius Client) SERVER
Contabilizao
A L
Ba ute TCP(1646) SQ
se ntic o
s
O a a iu
UAC pe o b i l i z ra d
nS SQ
n t a se
a
ER L
Co B
MySQL
195 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Instalao do FreeRadius.
A instalao do Freeradius sem dvida um desafio. Diversos passos precisam ser
seguidos a risca para que possamos ter uma instalao funcional. Por isso, vamos
separar a instalao do Freeradius em quatro etapas:
1. Instalao dos pacotes necessrios ao funcionamento
2. Configurao do banco de dados
3. Configurao do Freeradius server
4. Configurao do Radiusclient-ng
5. Configurao do OpenSER
Passo 3: Aplique o patch para contabilizao no Radius que vem junto com o
CDRTool. Este patch corrige um problema com o pacote de contabilizao do tipo 15.
O outro patch, chamado radacct-patch, modifica as instrues SQL de envio dados
para a base de dados SQL do Radius.
Faa o download dos patchs do freeradius
wget http://download.dns-hosting.info/CDRTool/freeradius/freeradius.patch
Aplique o patch.
apt-get build-dep freeradius
apt-get source freeradius
apt-get install devscripts
cd freeradius-1.1.3
patch -p1 -s < ../freeradius.patch
debuild
cd ../
dpkg -i freeradius*.deb
Exemplos:
client 127.0.0.1 {
secret=openser
shortname=OpenSER
nastype=other
}
197 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Accounting {
acct_unique
detail
sql
unix
radutmp
$INCLUDE /etc/freeradius/dictionary.ser
127.0.0.1 openser
ENUM-TLD=$avp(s:enum_tld)")
Verifica a contabilizao na base de dados Radius na tabela radacct. Voc pode usar
o utilitrio phpmyadmin para isto.
199 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
No evento inicial, o atributo Calling-Station-Id identifica a origem da chamada e o
Called-Station-Id identifica o destino da chamada. A durao da chamada dada
pela diferena dos timestamps nos eventos incio e fim.
Exemplo de contabilizao:
Sun Mar 12 17:29:21 2006
Acct-Status-Type = Start
Service-Type = Sip-Session
Sip-Response-Code = 200
Sip-Method = INVITE
User-Name = "101@openser.org"
Calling-Station-Id = "sip:101@openser.org"
Called-Station-Id = "sip:102@openser.org"
Sip-Translated-Request-URI = "sip:102@192.168.0.12:5066"
Acct-Session-Id = "1dbe198c82543fa2@192.168.0.11"
Sip-To-Tag = "00D0E90101B8_T9513"
Sip-From-Tag = "111aa0fda452c726"
Sip-Cseq = "4435"
Sip-Src-IP = "192.168.0.11"
Sip-Src-Port = "5068"
NAS-IP-Address = 127.0.0.1
NAS-Port = 5060
Acct-Delay-Time = 0
Client-IP-Address = 10.10.10.10
Acct-Unique-Session-Id = "37fb00358437ff4d"
Timestamp = 1142177361
Acct-Status-Type = Stop
Service-Type = Sip-Session
Sip-Response-Code = 200
Sip-Method = BYE
User-Name = "102@openser.org"
Calling-Station-Id = "sip:102@openser.org"
Called-Station-Id = "sip:101@openser.org"
Sip-Translated-Request-URI = "sip:101@192.168.0.11:5068"
Acct-Session-Id = "1dbe198c82543fa2@192.168.0.11"
Sip-To-Tag = "111aa0fda452c726"
Sip-From-Tag = "00D0E90101B8_T9513"
Sip-Cseq = "3305"
Sip-Src-IP = "192.168.0.12"
NAS-IP-Address = 127.0.0.1
NAS-Port = 5060
Acct-Delay-Time = 0
Client-IP-Address = 10.10.10.10
Acct-Unique-Session-Id = "597f048f3aa62ca0"
Timestamp = 1142177368
201 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
GRANT ALL ON cdrtool.* TO cdradmin@'192.168.1.%' IDENTIFIED by 'password';
GRANT ALL ON cdrtool.* TO locker@'localhost' IDENTIFIED by 'password';
O script ir criar os bancos de dados cdrtool. Ele tambm cria uma conta inicial para
login com o usurio admin e senha admin.
Passo 2: Crie o arquivo de configurao global.inc.
cd /var/www/CDRTool
cp setup/global.inc.new.installation global.inc
Edite o global.inc e configure suas variveis para baterem com seu sistema. Para cada
fonte diferente de dados voc deve criar uma nova instncia.
<?
#
# 1. Change all hostnames and passwords according to the installation
# 2. Copy this file to /var/www/CDRTool/global.inc
#
###########################################
# System and web paths
$CDRTool['tld'] = "/CDRTool";
$CDRTool['Path'] = "/var/www/CDRTool";
$_PHPLIB['libdir'] = $CDRTool['Path']. "/phplib/";
include($_PHPLIB["libdir"] . "prepend.php3");
$global_local = $CDRTool['Path']."/global.inc.local";
###########################################
# PHP Error reporting
###########################################
# Service provider information
$CDRTool['provider']['name'] = "VOFFICETel";
$CDRTool['provider']['service'] = "SIP service";
$CDRTool['provider']['timezone'] = "Sao Paulo";
$CDRTool['provider']['fromEmail'] = "flavio@voffice.com.br";
$CDRTool['provider']['toEmail'] = "support@voffice.com.br";
$CDRTool['provider']['sampleLoginSubscriber'] = "number@voffice.com.br";
$CDRTool['provider']['sampleLoginDomain'] = "voffice.com.br";
###########################################
# Where the rating engine listens for network requests:
$memcache_server = "127.0.0.1:11212";
###########################################
# Normalize engine settings
$CDRTool['normalize']['defaultCountryCode'] = "55";
$CDRTool['normalize']['CountryNumberLength'] = "10";
###########################################
# Anti-fraud settings
# create group quota in SER and deny calls to users in this group
$UserQuota["default"]["traffic"] = 5000; // MBytes
$UserQuota["default"]["cost"] = 1000; // Euro
###########################################
# CDRTool datasources
203 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
class DomainAuthLocal extends DomainAuth { // defined in
phplib/local.inc
}
$DATASOURCES=array(
"unknown"=>array(
"class" => "CDRS_unknown" // leave it here
),
"ser_radius"=>array(
"name" => "OpenSER",
"class" => "CDRS_ser_radius",
"table" => "radacct",
"db_class" => "DB_radius",
"db_class_readonly" => "DB_radius",
"db_class_siponline" => "DB_ser",
"rateField" => "Rate",
"rating" => "1",
"priceField" => "Price",
"normalize0SecCalls" => "1",
"DestinationIdField" => "DestinationId",
"normalizedField" => "Normalized",
"BillingPartyIdField"=> "UserName",
"AccountsDBClass" => "DB_ser",
"intAccessCode" => "00",
"sipTraceDataSource" => "sip_trace",
"traceOutURL" => array(
"sipvm.example.com"=>"asterisk",
"pstn.example.com"=>"cisco"
),
"UserQuotaClass" => "SERQuota",
"UserQuotaTable" => "user_quota",
"UserQuotaVerbose" => "",
"UserQuotaNotify" => "0",
"MinPstnNumLen" => "9",
"EnableSIPOnline" => "0",
"EnableNetworkRating"=> "1",
"domainTranslation" => array(
"gw02.example.com" =>
"pstn.example.com"
),
"EnableSIPOnline" => 1,
"RotateTables" => "Ym",
"RotateThisMonth" => 0,
"purgeCDRsAfter" => 120 // how many days to keep the
CDRs
),
"asterisk_vm" =>array("name" => "Voicemail server",
"class" => "CDRS_asterisk",
"SIP"=>array("WEBName"=>"OpenSER"),
),
"traceInURL" => array(
"SIP"=>"ser_radius"
),
"traceOutURL" => array(),
"purgeCDRsAfter" => 180 // how many days to keep the
CDRs
),
"sip_trace" =>array(
"name" => "SIP trace",
"db_class" => "DB_ser",
"table" => "sip_trace",
"purgeRecordsAfter" => "7"
)
);
if ($REMOTE_ADDR=="192.168.1.209") {
//$verbose=1;
} else {
// prevent set of verbose via post/get
unset($verbose);
}
?>
205 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Re-inicie o Apache:
/etc/init.d/apache2 restart
Passo 7: Faa o login usando o usurio admin com senha admin. Mude a senha logo
que puder para evitar problemas de segurana
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "uri.so"
loadmodule "uri_db.so"
207 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
X-RTP-Stat=$hdr(X-RTP-Stat); \
Contact=$hdr(contact); \
Event=$hdr(event); \
SIP-Proxy-IP=$avp(s:sip_proxy_ip); \
ENUM-TLD=$avp(s:enum_tld)")
route{
#
# -- 1 -- Request Validation
#
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
#
# -- 2 -- Routing Preprocessing
#
## Record-route all except Register
## Mark packets with nat=yes
## This mark will be used to identify the request in the loose
## route section
if(!is_method("REGISTER")){
if(nat_uac_test("19")){
record_route(";nat=yes");
} else {
record_route();
};
};
##Loose_route packets
if (has_totag()) {
#sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if(method=="BYE") {
#Account BYE transactions
setflag(2);
};
#Check authentication of re-invites
if(method=="INVITE" && (!allow_trusted())) {
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","1");
exit;
#CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans()) {
end_media_session();
t_relay();
};
exit;
}
t_check_trans();
#
# -- 3 -- Determine Request Target
#
if (method=="REGISTER") {
route(2);
} else {
route(3);
};
}
route[1] {
#
# -- 4 -- Forward request to target
#
# Forward statefully
t_on_reply("1");
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
};
exit;
209 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
}
route[2] {
## Register request handler
if (is_uri_host_local()) {
if (!www_authorize("", "subscriber")) {
www_challenge("", "1");
exit;
};
if (!check_to()) {
sl_send_reply("403", "Forbidden");
exit;
};
} else if {
sl_send_reply("403", "Forbidden");
};
}
route[3] {
## Requests handler
if (method=="INVITE") {
# Account INVITE packets
setflag(2);
# Account Missed calls
setflag(3);
# Radius Extra
$avp(s:sip_proxy_ip)="127.0.0.1";
};
if (is_from_local()){
# From an internal domain -> check the credentials and the FROM
if(!allow_trusted()){
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
exit;
} else if(!check_from()) {
sl_send_reply("403", "Forbidden, use From=ID");
exit;
};
};
if (client_nat_test("3")) {
consume_credentials();
if (is_uri_host_local()) {
# -- Inbound to Inbound
route(10);
} else {
# -- Inbound to outbound
route(11);
};
} else {
route[4] {
# routing to the public network
if (!load_gws()) {
sl_send_reply("503", "Unable to load gateways");
exit;
}
if(!next_gw()){
sl_send_reply("503", "Unable to find a gateway");
exit;
}
211 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
t_on_failure("2");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[6] {
#
# -- NAT handling --
#
if (isbflagset(6) || isbflagset(7)) {
append_hf("P-hint: Route[6]: mediaproxy \r\n");
use_media_proxy();
};
}
route[10] {
#from an internal domain -> inbound
#Native SIP destinations are handled using the location table
#Gateway destinations are handled by regular expressions
append_hf("P-hint: inbound->inbound \r\n");
if (uri=~"^sip:[2-9][0-9]{6}@") {
if (is_user_in("credentials","local")) {
prefix("+1305");
route(6);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for local calls");
exit;
};
};
if (uri=~"^sip:1[2-9][0-9]{9}@") {
if (is_user_in("credentials","ld")) {
strip(1);
prefix("+1");
route(6);
route(4);
exit;
} else {
sl_send_reply("403", "No permissions for long distance");
exit;
};
};
if (uri=~"^sip:011[0-9]*@") {
if (is_user_in("credentials","int")) {
strip(3);
prefix("+");
route(6);
route(4);
if (!lookup("location")) {
if (does_uri_exist()) {
## User not registered at this time.
## Use the IP Address of your e-mail server
revert_uri();
prefix("u");
rewritehostport("192.168.1.171"); #Use the IP address of your
voicemail server
route(6);
route(1);
} else {
sl_send_reply("404", "Not Found");
exit;
}
sl_send_reply("404", "Not Found");
exit;
};
route(6);
route(1);
}
route[11] {
# from an internal domain -> outbound
# Simply route the call outbound using DNS search
append_hf("P-hint: inbound->outbound \r\n");
route(1);
}
route[12] {
# From an external domain -> inbound
# Verify aliases, if found replace R-URI.
lookup("aliases");
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
};
route(1);
}
route[13] {
#From an external domain outbound
#we are not accepting these calls
append_hf("P-hint: outbound->inbound \r\n");
sl_send_reply("403", "Forbidden");
exit;
}
213 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
failure_route[1] {
##--
##-- If cancelled, exit.
##--
if (t_was_cancelled()) {
exit;
};
##--
##-- If busy send to the e-mail server, prefix the "b"
##-- character to indicate busy.
##--
if (t_check_status("486")) {
revert_uri();
prefix("b");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
##--
##-- If timeout (408) or unavailable temporarily (480),
##-- prefix the uri with the "u"character to indicate
##-- unanswered and send to the e-mail
##-- sever
##--
if (t_check_status("408") || t_check_status("480")) {
revert_uri();
prefix("u");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
}
failure_route[2] {
if(!next_gw()) {
t_reply("503", "Service not available, no more gateways");
exit;
};
t_on_failure("2");
t_relay();
}
onreply_route[1] {
#
#-- On-replay block routing --
#
if (client_nat_test("1")) {
append_hf("P-hint: Onreply-route - fixcontact \r\n");
fix_contact();
};
Arquitetura do CDRTool
Esta ferramenta usa duas bases de dados. A base de dados do Radius, mais
especificamente a tabela RADACCT e a prpria base de dados chamada CDRTool. O
principal processo o engenho de tarifao (rating engine)
(/var/www/CDRTool/scripts/ratingEngine.php). Este software responsvel por
pegar a durao de chamadas e calcular o preo de acordo com uma srie de
parmetros para atribuir um valor a uma chamada em particular. O software expo6e
algumas funes permitindo a voc acesso online a dados como o balano atual,
essencial para a bilhetagem pr-paga. Vamos explicar nesta seo como as tarifas so
calculadas.
RatingEngine Functions
Calculate the price of a finished session
Show the maximum time allowed based on caller
info
Add Balance to a prepaid customer
Get Current balance for a prepaid customer
Get last calls for a subscriber
Reload rating tables
215 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
As tarifas esto relacionadas diretamente com a hora do dia, dia da semana e feriados.
Uma chamada pode iniciar e terminar em perfis diferentes e ainda assim ser
corretamente tarifada. Cada cliente pode ter designado um plano de tarifao
dedicado.
A tarifao do CDRTool segue o seguinte fluxo.
1. Determinao da parte a ser bilhetada (billig-party)
O CDRTool identifica o plano de tarifao pela seguinte ordem.
Conta SIP user@domain
Domnio SIP da conta
IP fonte da sesso
Padro
2. Determinao do destino
O CDRTool identifica o destino usado no processo de rating pela ordem
Canonical-URI
SIPTranslated RequestURI
CalledStationID
3. Tarifao da rede pblica de telefonia
3.1 Pesquisa o perfil de bilhetagem na tabela pela ordem abaixo e usa o perfil ou
perfis que correspondam ao dia da semana ou hora.
Subscriber
Domain
Gateway
3.2 Usando o perfil, determina a identificao da tarifa (RateID) usada por um destino
especifico e uma determinada aplicao (a nica suportada no momento udio).
3.3 Calcula o preo baseado na durao ou no Array de durao baseado nos
parmetros relacionados abaixo. Estes parmetros podem ser alterados no arquivo
global.inc e alguns so especficos por cliente (customer).
"priceDenominator" => 10000, // e.g. 1 Eur = 10000 units
"priceDecimalDigits" => 4, // how many digits to round the prices to
"minimumDurationCharged" => 0, // Only calls greater than this
duration will be charged
"durationPeriodRated" => 60, // the prices from the rating table are
calculated per this period
"trafficSizeRated" => 1024, // same as above but for data traffic
"reportMissingRates" => 0, // send email notifications if rates are
missing from the ratingEngine
217 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Passo 3: Insira seu domnio como um cliente (customer). Todas as chamadas vindas
deste domnio sero tarifadas de acordo com os perfis inseridos. O primeiro perfil
(551) sera usado para tarifar as chamadas em dias da semana. O segundo (552) para
os fins de semana. No se esquea de configurar corretamente o fuso horrio e
recarregar as tabelas aps terminar.
Crie dois novos identificadores de taifas (551 e 552). Os identificadores das tarifas
so diferentes dos identificadores dos perfis. Neste caso ambos foram configurados
com o mesmo valor para tornar mais fcil a leitura. No exemplo acima, voc est
designando uma taxa de 150 (1,5 centavos) para cada chamada durante o horrio
normal e (1 centavo) para chamadas aps as 18:00. A aplicao sempre udio e o
parmetro de conexo permite que voc aplique tarifas de conexo.
Passo 6: Designe nomes para os identificadores de destino (Destination Id)
Sumrio
Neste captulo voc aprendeu a implantar um dos componentes mais sensveis de um
provedor de voz, a bilhetagem. Esta bilhetagem pode ser feita em MySQL muito
embora correlacionar os eventos manualmente no seja uma idia simples. Usando o
Radius voc facilita a bilhetagem e pode integrar a ferramenta de tarifao chamada
CDRTool. Esta ferramenta tem um papel muito importante no provedor de voz e no
clculo de preo das tarifas.
219 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
11
Ferramentas de resoluo de
problemas
Aps instalar o sistema como um todo, agora hora de iniciar os testes de stress para
verificarmos nossa configurao. Ns iremos usar o utilitrio SIPp para testar nosso
sistema. Antes de ns usarmos o SIPp para testar o site importante reconhecer as
ferramentas tais como o openserctl moni, openserctl online e o mdulo
SIPTRACE. As ferramentas de captura de pacotes so usadas no dia a dia da operao
de um provedor de VoIP, desta forma, teremos de aprender como usa-las. O
Wireshark, Tshark e o Ngrep so algumas das ferramentas mais usadas, por isto
vamos nos concentrar nelas primeiro. Mais tarde iremos checar o Sipsak, que se
intitula o canivete suo do VoIP. Ns podemos us-lo em conjunto com o Nagius e o
Monit para monitorar o OpenSER.
Objetivos
Ao final deste captulo voc estar apto :
Reconhecer as principais ferramentas usadas para gerenciar o OpenSER
Entender como usar ferramentas como o openserctl
Capturar e analisar pacotes usando Wireshark e o Ngrep
Resolver problemas de sinalizao do cliente usando o mdulo
SIPTRACE.
Testar o OpenSER sob condies de stress
Testar o OpenSER usando o Sipsak.
Onde estamos?
No ultimo captulo, ns terminamos a instalao do provedor VoIP. Agora hora de
colocar o sistema em produo. No dia-a-dia algumas ferramentas so necessrias
para lidar com os clientes reclamando de problemas de conectividade e qualidade de
voz.
The SIP provider MySQL/Postgres/
Big Picture Unixodbc Database
Ethernet
Media
User Radius
SIP PSTN Media Proxy CDRTool Monitoring
Portal Server Tools
Proxy Gateway Server Nat Rating
Provis. Traversal Acct.
Ethernet
Transaction Statistics:
200 OK
tm:UAS_transactions = 0
tm:UAC_transactions = 0
tm:inuse_transactions = 0
221 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
UsrLoc Stats:
200 OK
usrloc:registered_users = 0
usrloc:location-users = 0
usrloc:location-contacts = 0
usrloc:location-expires = 2
usrloc:aliases-users = 0
usrloc:aliases-contacts = 0
usrloc:aliases-expires = 0
Esta ferramenta imprime estatsticas dos mdulos TM, SL e USRLOC. Voc poder
apontar com este comando quantas transaes esto em uso e quantas j foram
executadas. Mensagens enviadas trazem a voc algumas informaes sobre erros e
permite verificar a sade do seu servidor. Finalmente as estatsticas de usrloc
permitem a voc verificar a sade dos processos de registro de pacotes.
Tshark e Wireshark
O Wireshark (antigo Ethereal) o analisador de protocolos mais usado do mercado e
ele distribudo com uma licena GPL. Normalmente voc no ter uma GUI no seu
servidor, mas mesmo assim voc ainda pode capturar pacotes usando a verso texto
do Wireshark chamada Tshark. Ns freqentemente usamos o Ngrep, porque ele
simples e leve. Ensin-lo detalhadamente como usar um analisador de protocolos est
fora do escopo deste material. No entanto, ns vamos dar a voc algumas dicas de
como analisar pacotes com os protocolos SIP e RTP.
O Wireshark possui algumas estatsticas especiais para o SIP e RTP. Aps carregar os
pacotes capturados, voc pode comear a analisar as estatsticas do protocolo SIP.
Vamos tentar, no wireshark selecione:
Statistics->sip
223 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Nesta tela voc pode selecionar a chamada que voc quer ter no grfico. Aps
selecionar a chamada pressione o boto Graph.
Voc ir receber este bonito grfico com o dilogo SIP. Agora voc pode facilmente
encontrar problemas em um dilogo especfico. Voc pode at mesmo tocar a
chamada no menu anterior se ela estiver codificada em G.711. Muito bom mesmo,
voc no acha? Ns ainda temos alguns truques na manga, ento segura um pouco e
vamos para o prximo.
Bem vamos verificar os pacotes RTP. No fim das contas os pacotes RTP determinam
a qualidade da voz. No existe uma frmula mgica, pessoalmente eu considero uma
qualidade de voz boa, quela onde a transferncia de pacotes RTP est com a latncia
est abaixo de 150ms, Jitter abaixo de 20ms e uma perda de pacotes inferior a 3%.
Voc pode at mesmo ter uma qualidade de voz boa com latncias maiores que
150ms, no entanto a interatividade da conversa comea a deteriorar. Teste para ver o
que funciona bem com voc. Use o Wireshark para medir estes parmetros. No menu
do Wireshark v para:
Statistics | RTP | Stream Analysis
Agora voc pode analisar, pacote por pacote, o Jitter, latncia(delta), banda passante e
perda de pacote dos seus fluxos. Voc pode at mesmo gerar um grfico do seu fluxo
RTP.
225 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
No nosso caso, ns podemos ver pelo grfico que nosso Jitter est abaixo de 5ms em
ambas as direes. JItter a diferena o tempo entre a chegada dos pacotes ou
variao da latncia.
O mdulo SIPTRACE
O OpenSER tem um mdulo chamado SIPTRACE. Ele permite que voc armazene as
mensagens SIP em um banco de dados. Ele gera informao para a interface grfica
do CDRTool que usada para rastrear chamadas diretamente a partir da bilhetagem.
O mdulo muito simples de se usar, simplesmente carregue o mdulo e marque as
transaes para serem rastreadas com um flag definido no parmetro do mdulo
SIPTRACE chamado trace_flag.
Voc provavelmente no ir querer registrar todas as mensagens para a base de dados
por causa da carga imposta ao servidor por este processo. O mdulo permite que voc
ligue e desligue o rastreamento usando o utilitrio openserctl. Para isto voc vai
precisar configurar o parmetro do mdulo chamado trace_on para 0 e manualmente
iniciar ou parar o rastreamento das mensagens usando openserctl fifo sip_trace on
e openserctl fifo sip_trace off. No se esquea de configurar o parmetro db_url
do mdulo. No CDRTool voc ver uma tela semelhante a mostrada abaixo.
Sipsak
O sipsak uma ferramenta usada em linha de comando por administradores SIP. Ela
usada para rodar testes simples contra um servidor SIP. uma boa ferramenta para
verificar a segurana do servidor porque voc pode criar o pedido SIP exatamente da
Exemplo de uso:
sipsak U s sip:1000@192.168.1.185 a 1000 W 1 vvvvv
SIPp
Explicar cada detalhe do SIP est alm do escopo deste material. A idia aqui dar a
voc uma viso geral do SIPp e ensinar a voc como comear. Aloque tempo
suficiente para testar sua plataforma antes de coloc-la em produo.
O SIPp uma ferramenta de gerao de trfego e testes de stress para o SIP. uma
boa ferramenta para gerar trfego para o seu servidor SIP e test-lo antes de colocar
em produo. Ele estabelece e libera mltiplas chamadas com mtodos como o
INVITE e BYE. A taxa de chamadas pode ser ajustada dinamicamente. Mais
informaes podem ser encontradas no seu web site
http://sipp.sourceforge.net/doc/reference.html.
Vamos ver alguns exemplos em cenrios reais no qual voc poderia usar esta
ferramenta.
Instalando o SIPp
Passo 1: Instalao das dependncias:
apt-get install g++
apt-get install ncurses-dev
apt-get install openssl-devel
apt-get install libssl-dev
apt-get install libnet1-dev
apt-get install libpcap0.8-dev
227 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
SIP Server
192.168.1.185:5060
Para que o SIPp funcione, voc vai precisar registrar manualmente um usurio
adicionando um mapeamento esttico na tabela de localizao dos usurios. No
exemplo abaixo, ns estamos dizendo que o usurio 1003 est no endereo
192.168.1.117 (onde carregamos o User Agent Server).
openserctl ul add 1003 sip:1003@192.168.1.117:5060
Tome cuidado quando testar o sistema com a contabilizao ligada. Voc pode
encher o disco rapidamente com os bilhetes do sistema.
229 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Para iniciar o UAS com eco de RTP use um comando semelhante ao abaixo. Por
favor, adapte o cenrio para a sua situao antes de testar.
Exemplo:
sipp sf uas.xml rtp_echo mi 192.168.1.116 mp 1000
Veja na figura os dados relacionados aos pacotes RTP ecoados pelo sistema.
Para iniciar o UAC com a funo pcap gerando pacotes de RTP use um comando
como o abaixo:
sipp -sf uac_pcap.xml -s 1003 192.168.1.185:5060
Testando o MediaProxy
Para testar apenas o Mediaproxy usando o RTP, voc pode usar o gerador RTP
provido pela AG-Projects. Voc pode verificar o desempenho dele usando:
./rtpgenerator --g711 count=30
Para usar vrias mquinas para o teste use os seguintes comandos em vrias mquinas
./rtpgenerator ip=ipof the mediaproxy --g711 count=50
Verifique a CPU usando a aplicao do Linux chamada top. Voc pode tambm usar
o utilitrio sessions.py para ver as sesses disponveis.
Ferramentas de monitoramento
Para monitorar o OpenSER voc pode usar um conjunto de utilitrios junto com as
ferramentas de monitoramento de redes. Voc pode usar o Nagios junto com o sipsak
para monitorar transaes reais como o REGISTER e o INVITE. A ferramenta
MONIT(www.tildeslash.com) outra que voc pode usar para monitorar o status do
sistema e o daemon do OpenSER. Um bom tutorial em como configurar o MONIT
com o OpenSER pode ser encontrado em http://www.voip-
info.org/wiki/view/OpenSER+And+Monit.
231 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
A
Expresses regulares
.
especial dentro de uma expresso regular. Quaisquer caracteres no mencionados aqui
no so especiais.
um caractere especial que bate com qualquer coisa exceto um caractere newline.
Usando concatenao, ns podemos criar expresses regulares como a.b que bate
quaisquer strings com trs caracteres que iniciem com a e terminem com b
*No uma construo por si s; ele um sufixo, que significa que a expresso regular
precedente pode ser repetida tantas vezes quanto possvel. Em fo*, o * se aplica ao
o, de forma que fo* bate com f seguido por quaisquer nmeros de os. O caso de
zero os permitido fo* bate com f. * sempre se aplica menor expresso
precedente possvel. Deste modo, fo* tem um o repetindo e no um fo repetindo. O
processo que faz a correspondncia processa um * batendo imediatamente tantas
repeties quantas podem ser encontradas. Ento ele continua com o restante do
padro. Por exemplo, batendo c[ad]*ar contra a string caddaar, o primeiro [ad]* bate
com addaa, mas isto no permite o prximo a no padro. a ser batido. Desta forma a
ltima das correspondncias revertida e tentada novamente e agora tem sucesso.
\( ...\)conjunto
uma construo de agrupamento que serve trs propsitos: Para confinar um
de alternativas \| para outras operaes. Deste modo \(foo\|bar\)x casa com
foox e barx. Para confinar uma expresso complicada para depois acrescentar um *.
Deste modo ba\(na\)* casa com bananana, etc.. com quaisquer nmeros de nas. Para
marcar uma substring casada para referncia futura. Esta ltima aplicao no uma
conseqncia da idia de agrupamento parenttico; ele um recurso separado que
designado como o segundo significado para a mesma construo \(...\) porque no
existe conflito na prtica entre os dois significados. Aqui est uma explicao deste
recurso.
aps o fim de uma construo \(...\), o processo lembra o incio e o fim do texto
\DIGITOcasado pela construo. Ento, mais tarde na expresso regular, voc pode usar o \
seguido por um digito para dizer bata com o mesmo texto casado com a ensima vez
pela construo \(...\). As construes \(...\) so numeradas na ordem inicial pela
expresso regular. As strings batendo com as primeiras nove construes aparecendo
nas expresses regulares tem designados os nmeros de 1 9. \1 at \9 podem ser
usadas para se referir ao texto casado pela construo \(...\) correspondente. Por
exemplo, \(.*\)\1 casa com qualquer string que composta por duas metades iguais. A
\(.*\) bate com a primeira metade, que pode ser qualquer coisa, mas o \1 que segue
bate apenas com o mesmo exato texto.
\bbate com uma string vazia, mas apenas se ele est no incio ou no fim de uma palavra.
Deste modo \bfoo\b bate com qualquer ocorrncia de foo como uma palavra separada.
\bball\(s\|\)\b casa com ball ou balls como uma palavra separada.
bate com uma string vazia, contanto que ela no esteja no incio ou fim de uma
\Bpalavra.
\<bate com uma string vazia, mas apenas se ela estiver no inicio de uma palavra.
bate com uma string vazia, mas apenas se ela estiver no fim de uma palavra.
\>Outras expresses ainda podem ser usadas. Uma boa referncia rpida para as
expresses regulares pode ser encontrada em http://www.regular-
expressions.info/reference.html.
3XX Redirection
300 Multiple Choices
301 Moved Permanently
303 See Other
305 Use Proxy
380 Alternative Service
4XX Client-Error
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
413 Request Entity Too Large
414 Request-URI Too Large
415 Unsupported Media Type
420 Bad Extension
480 Temporarily not available
481 Call Leg/Transaction does not exist
482 Loop Detected
483 Too Many Hops
484 Address Incomplete
485 Ambiguous
486 Busy Here
487 Request Terminated
488 Not Acceptable Here
489 Bad Event
491 Request Pending
493 Undecipherable
5XX Server-Error
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Time-out
505 SIP Version not supported
513 Message Too Large
580 Precondition Failure
237 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
C
Definies usadas no SIP
239 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
roteamento (Route Header). Estes procedimentos separam o destino do pedido
(presente no Request-URI) de conjunto de proxies que precisam ser visitados ao longo
do caminho (presente no campo cabealho de roteamento). Um proxy que adere a
estes mecanismos tambm conhecido como um loose router.
Outbound Proxy:
Um proxy que recebe pedidos de um cliente, embora ele normalmente ele no seja o
destino final da chamada. Tipicamente um UA (agente-usurio) configurado
manualmente com um outbound proxy ou pode aprender sobre a existncia dele
atravs dos protocolos de auto-configurao.
Paralell Search (Busca paralela):
Em uma busca paralela, um proxy ao receber um pedido dispara vrios outros pedidos
para locais possveis. Ao invs de emitir um pedido e esperar pela resposta final antes
de emitir um novo pedido, ele emite todos os pedidos sem esperar pelos resultados
dos anteriores.
Provisional Response (Resposta provisria):
Uma resposta usada por um servidor para indicar progresso da chamada, mas no
terminal a transao SIP. Respostas 1xx so provisrias, outras respostas so
consideradas finais.
Proxy, (Servidor Proxy):
Uma entidade intermediria que atua ambos como um servidor e um cliente para o
propsito de fazer pedidos em nome de outrem. O objetivo primrio de um servidor
proxy rotear o pedido para outra entidade mais prxima do usurio final. Proxies
tambm so teis para aplicar uma poltica (por exemplo, certificar-se que o usurio
tem permisso de fazer a chamada). Um proxy interpreta e se necessrio reescreve
partes de uma mensagem antes de encaminh-la.
Recursion (Recurso):
Um cliente recursa em uma resposta 3xx quando ele gera um novo pedido para uma
ou mais URIs do campo do cabealho Contact na resposta.
Redirect Server (Servidor de redirecionamento):
Um servidor de redirecionamento um UAS (agente-usurio servidor) que gera
respostas 3xx para pedidos que ele recebe, dirigindo o cliente a contatar um conjunto
alternativo de URIs.
Registrar: (Servidor de Registro):
Um servidor de registro aquele que aceita um pedido de registro e coloca as
informaes que ele recebe no servio de localizao para o domnio que ele gerncia.
Regular Transaction (Transao regular):
Uma transao regular qualquer transao com um mtodo outro que INVITE, ACK
ou CANCEL.
Ring Back (Sinal de retorno da campainha):
O Ringback o tom de sinal produzido pela aplicao de discagem indicando que a
parte chamada est sendo alertada (tocando).
241 Erro! Utilize o separador Base para aplicar Ttulo 1 ao texto que
pretende que aparea aqui.
Target Refresh Request (Pedido de atualizao do alvo):
Um pedido de atualizao do alvo enviado dentro de um dilogo definido como um
pedido que pode modificar o alvo remoto do dilogo.