terça-feira, 30 de setembro de 2014

Open Source SBC - Existe uma coisa dessas?

Session Border Controllers (SBCs) são utilizados como um meio para fornecer balanceamento de carga e estruturas de segurança para redes VoIP. Para ser completamente honesto, 90% dos meus clientes utilizam aparelhos SBC, seja Acme Packet, Juniper, NextOne, Veraz ou outros.

De acordo com um relatório da Transnesus , uma combinação de OpenSIP e Asterisk pode ser utilizado como uma estrutura de back-to-Back-User-Agent (B2BUA) - no entanto, a configuração geral e a configuração não é clara e direta. Eu estive pensando comigo mesmo: "Por que ninguém tinha escrito um Open Source SBC? como que poderia ser? geralmente há uma alternativa Open Source para qualquer produto comercial ".

Como qualquer outra pesquisa na net, eu apontei meu Firefox para o Google , e digitei a frase que não quer calar! "Open Source SBC", aparentemente, tal coisa existe, e é de uma empresa chamada Solegy - mais no endereço web: http://www.opensourcesip.org . Então minha tristeza, o domínio existe, mas não tem nada no lugar :(. 
Com muito custo eu consegui encontrar o código fonte, e depois de uma fase de 30 minutos compilação (tendo em mente que estou trabalhando em um servidor virtual rodando sob o Oracle Virtualbox no bom é velho Ruindows) - a compilação foi concluída.

Compilando era uma coisa, executá-lo era uma coisa completamente diferente - Levei um tempo para perceber onde o binário está localizado e como a configuração funciona - uma vez que fiz isso foi uma brisa. No meu sistema, após a compilação o binário foi localizado de acordo com o seguinte:
[root@opensbc obj_linux_x86_r]# pwd
/root/OpenSBC-1.1.5-RC1-Bundle/opensbc/obj_linux_x86_r
[root@opensbc obj_linux_x86_r]# ./opensbc -x

Message from syslogd@ at Thu Nov 13 23:15:35 2008 ...
tvms OpenSBC[18900]: Starting service process "OpenSBC" v1.1.5-25
Por as informações fornecidas pelo Solegy, o projeto OpenSBC suporta vários modos de operação, variando de acordo com o seguinte:
  • Modo Full - Por padrão OpenSBC é executado em modo full expondo sua capacidade, tanto como retransmitir proxy SIP, auxiliando, como também B2B User Agent. Quando o OpenSBC recebe um convite ou um pedido de registro ele ele segue com um procedimento de tomar uma decisão de como encaminhar um pedido:
    • Se o  Reques-URI resolve um domínio remoto, o pedido será retransmitido. Se uma rota do revezamento estiver disponível, o pedido é enviado para esse caminho. Se uma rota disponível, o URI é resolvido via DNS.
    • Se o Startline-URI resolve como um endereço local e a porta, para URI está marcada para resolver uma porta local. Então, o pedido seria utilizar as portas como um sip proxy ou uma resolução de DNS. O pedido URI seria reescrito para o novo ponto e resolvido.
    • INVITE: Se ambos Request URI e para URI resolve um convite local e a porta, B2BUA é usada como rota para encaminhar o convite.
    • REGISTER: Se ambos Request URI e para URI resolve para um ouvinte local e a porta, e auxiliar local, irá processar o registro. Isso incluiria Autorização do Usuário.
  • Modo B2BOnly - Este modo remove a capacidade de relay, mas expoe o REGISTER e as funcionalidades B2BUA. Este modo não faz as verificações realizadas pelo modo completo. Ele sempre processa o REGISTER e INVITE local.
    • INVITE: Este modo sempre usa B2BUA Route para roteamento das chamadas. Se não for encontrado uma rota, uma resolução de DNS será feita contra a Request URI ou para URI no caso de a Request-URI resolver para um endereço local.
    • REGISTER: As inscrições são sempre tratados pelo register local.
  • Proxy Only Mode - Este modo remove a funcionalidade B2BUA e expoe o REGISTER e funcionalidades do SIP Proxy.
    • Sempre usa rotas para retransmissão de todas as mensagens, incluindo o REGISTER. Se uma rota de revezamento não é configurada, os pedidos serão retransmitidos usando resolução de DNS. Se um INVITE é resolvido como local, o resgister vai lidar com o registro  incluindo a autorização.
  • Modo B2BUpperReg -  Este é quase o mesmo que o modo B2BOnly mas com o adicional da capacidade de retransmitir inscrições para registradores superiores.
    • INVITE: Este modo utiliza sempre B2BUA Route.
    • REGISTER: para registros, ele executa a solicitação URI e URI para verificação do relay para o domínio remoto ou processar o register no local para domínios locais.
    • Upper-Registration: Este modo também tem a capacidade de "hijack-regristrations" (Sequestrar os Registros) em relação aos montantes dos registradores.

Por acima, eu não entendo completamente o que devo usar para operações normais de telefones IP, assim, eu acho que estou mais ou menos na minha própria jornada para um melhor entendimento sobre minhas necessidades presentes. Meu entendimento geral diz que eu preciso usar o modo de B2BupperReg, no entanto, eu não posso dizer que estou totalmente certo sobre isso - eu vou estar fazendo experiências com OpenSBC e os servidores Asterisk virtuais.

Se alguém estiver em busca de conhecimento sobre SBC, vamos juntar os pensamentos e estudos.
Abraços a todos.

Instalar e configurar OpenSIPs 1.10.1 Ubuntu Server 12.04

Informação: Este tutorial esta sendo atualizado para a versão 1.10.1 do OpenSIPs para resolver alguns problemas de segurança e rendimento do SER, mais informações pode ser obtidas aqui.

Neste oportunidade vamos ver como instalar e configurar o OpenSIPs 1.10.1 (anteriormente OpenSER, que foi dividido em dois seguimentos de pesquisas, um deles é o OpenSIPs) e como fazer para os usuários se autenticarem em uma base de dados MySQL.

OpenSIPs é um servidor SIP, e serve como elemento principal de qualquer solução VoIP/ToIP e ITSP baseado em SIP. Tem um sistema de roteamento muito flexível e robusto, totalmente configurável. Tem capacidade de unificar os serviços de voz, vídeo, mensagens instantâneas e presença. É modular e graças ao seu alto desempenho suporta soluções empresariais e carrier-class.

Neste caso estou instalando sobre o Ubuntu Server 12.04 LTS com o MySQL 5.

Instalando OpenSIPs: Vou partir do ponto que você já tem o sistema operacional instalado com as configurações mínimas, incluindo acesso a Internet. Também recomendo que este servidor seja exclusivo para o SER. O primeiro passo é comprovar se nosso sistema operacional está atualizado e instalar os pacotes necessários para compilar e instalar o OpenSIPs. Lembre-se que temos que executar todos os comandos como usuario administrador do SO, ou seja, ROOT!

# apt-get update && apt-get upgrade
# apt-get dist-upgrade   
# apt-get autoclean
# apt-get autoremove
# apt-get install build-essential openssl bison flex

Com estes comandos já temos o sistema base para a instalação do OpenSIPs. Como a base de dados vai estar no mesmo servidor do SER vamos proceder a instalação do MySQL.

# apt-get install mysql-server libmysqlclient18 libmysqlclient-dev

Uma vez instalado vamos mudar a senha de acesso root.
  
# mysqladmin -u root password novopassword

Lembre-se de onde está escrito novopassword colocar sua senha.

Agora vamos baixar a última versão do OpenSIPs (no momento deste tutorial era a 1.10):

# cd /usr/src
# wget http://opensips.org/pub/opensips/1.10.1/src/opensips-1.10.1_src.tar.gz
# tar -xvzf opensips-1.10.1_src.tar.gz
# mv opensips-1.10.1-tls opensips
# cd opensips

Compilar o OpenSIPs: Para compilar o OpenSIPs com todos os módulos disponiveis devemos executar o seguinte comando:

# make all include_modules="db_mysql" modules 
# make install  include_modules="db_mysql" modules
Agora vamos copiar o arquivo de default (padrão) e init para que cada vez que iniciar o servidor o OpenSIPs seja iniciado automaticamente:

# cp -a /usr/src/opensips/packaging/debian/opensips.default /etc/default/opensips 

# cp -a /usr/src/opensips/packaging/debian/opensips.init /etc/init.d/opensips

Motificando os arquivos:

# vim /etc/default/opensips

E vamos trocar as seguintes linhas: 

RUN_OPENSIPS=yes 
# User to run as 
USER=opensips 
# Group to run as 
GROUP=opensips 
# Amount of memory to allocate for the running OpenSIPS server (in Mb) 
MEMORY=128

A quantidade de memoria destinada para OpenSIPs por padrão é de 64 Mb, dependendo das capacidades e necessidades do seu servidor pode variar este parâmetro.

Agora vamos modificar o outro arquivo:

# vim /etc/init.d/opensips

E vamos trocar a linha onde informa sobre DAEMON=/usr/sbin/opensips por:

DAEMON=/usr/local/sbin/opensips

Vamos agora dar atribuições de execução do arquivo:

# chmod +x /etc/init.d/opensips

Agora nos resta criar o usuario "opensips" no sistema operacional e o diretorio de trabalho do mesmo:

# adduser opensips

Vamos criar o diretorio abaixo:

# mkdir /var/run/opensips

Pronto temos neste ponto o OpenSIPs instalado, vamos passar para a configuração.

Configurando o OpenSIPs:  Primeiro temos que modificar o arquivo "opensipsctl" que se encontra em: 

# vim /usr/etc/opensips/opensipsctlrc

É vamos modificar as seguintes linhas:

SIP_DOMAIN=localhost 
DBENGINE=MYSQL 
DBHOST=localhost 
DBNAME=opensips 
DBRWUSER=opensips 
DBRWPW="opensipsrw" 
DBROUSER=opensipsro 
DBROPW=opensipsro 
DBROOTUSER="root" 
USERCOL="username" 
INSTALL_EXTRA_TABLES=ask 
INSTALL_PRESENCE_TABLES=ask 
INSTALL_SERWEB_TABLES=ask 
CTLENGINE="FIFO" 
OSIPS_FIFO="/tmp/opensips_fifo"


Agora vamos criar os bancos de dados necessarios executando o seguinte comando:

# opensipsdbctl create

Vai ser solicitado a senha do root, logo depois vai ser solicitado se queremos criar as bases de dados, para todas as perguntas responderemos sim (Yes).

Neste momento temos uma configuração basica no OpenSIPs. Agora vamos proceder para que o mesmo tenha o suporte ao MySQL.

Configurando Suporte ao MySQL:  Para isto iremos ter que modificar o arquivo de configuração do OpenSIPs.

# vim /usr/etc/opensips/opensips.cfg

listen=udp:192.168.20.20:5060   # CUSTOMIZE ME (linha 45

#Meus Modulos (linha 58)
loadmodule "db_mysql.so" (linha 59)
loadmodule "auth.so" (linha 60)
loadmodule "auth_db.so"  (linha 61)

#### USeR LOCation module (linha 97)
loadmodule "usrloc.so" (linha 98)
modparam("usrloc", "nat_bflag", "NAT") (linha 99)
#modparam("usrloc", "db_mode",   0) (linha 100)
ESTA LINHA IREMOS COMENTAR 

modparam("usrloc", "db_mode", 2) (linha 101)
modparam("usrloc", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") (linha 102)

# ----- auth_db params ----- (linha 104)
/* uncomment the following lines if you want to enable the DB based authentication */  (linha 105)
modparam("auth_db", "calculate_ha1", yes)  (linha 106)
modparam("auth_db", "password_column", "password") (linha 107) modparam("auth_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") (linha 108)

Agora podemos adicionar um usuario em nossa base de dados:

# opensipsctl add nome_usuario senha_acceso

Vamos usar a sitaxe acima para criar um usuario que queremos, vamos supor que seja "8000" então executamos:

[00:52:20] root@ser [~]# opensipsctl add 8000 8000
new user '8000' added
[00:52:46] root@ser [~]# opensipsctl add 8001 8001
new user '8001' added
[00:53:12] root@ser [~]#


Com este comando o enginer do SER vai lhe informar que foi criado um usuario.

Para remover um usuário a sintaxe é a abaixo informada:

# opensipsctl rm nomeusuario

Para alterar a senha de um usuário  use a sintaxe abaixo informada:

# opensipsctl passwd nomeusuario nova_senha

Chegou a hora de testar nosso SER.

Iniciando o OpenSIPs: Depois de todas as configurações que realizamos o SER está configurado para rodar junto com o inicio do SO. E se necessitar de controlar o mesmo, podemos fazer com uso dos comandos abaixo:

1. # /etc/init.d/opensips start | stop
2. # opensipsctl start | stop

Lembrando que você só pode utilizar um dos comandos acima. E também não pode terminar o serviço com a primeira e iniciar com a segunda.

A primeira opção utilizamos para iniciar o OpenSIPs para produção.

A segunda opção utilizamos para testar nosso SER quando estamos modificando arquivos de configuração e queremos ter mais detalhes do servidor.

Vamos testar nosso SER.

# opensipsctl start

Deve aparecer algo assim:

[01:04:15] root@ser [~]# opensips start
Listening on
             udp:
192.168.20.20 [192.168.20.20]:5060
Aliases:

[01:04:24] root@ser [~]#


Para comprovar que realmente o SER esta rodando execute o seguinte comando:

# ps aux | grep opensips

Devera aparecer varios processos mostrando que o SER esta rodando.

[01:52:01] root@ser [~]# ps aux | grep opensips
root      7610  0.0  0.5 166796  5448 ?        S    11:04   0:00 opensips start
root      7612  0.0  0.1 166800  1568 ?        S    11:04   0:00 opensips start
root      7613  0.0  0.1 166796  1332 ?        S    11:04   0:00 opensips start
root      7615  0.0  0.1 166796  1332 ?        S    11:04   0:00 opensips start
root      7617  0.0  0.1 166796  1332 ?        S    11:04   0:00 opensips start
root      7619  0.0  0.1 166796  1332 ?        S    11:04   0:00 opensips start
root      7621  0.2  0.0 166796   924 ?         S    11:04   0:12 opensips start
root      7622  0.0  0.1 166796  1336 ?        S    11:04   0:01 opensips start
root      7843  0.0  0.5 166796  5448 ?        S    11:07   0:00 opensips start
root      7846  0.0  0.1 166800  1568 ?        S    11:07   0:00 opensips start
root      7847  0.0  0.2 166796  2800 ?        S    11:07   0:00 opensips start
root      7849  0.0  0.2 166796  2568 ?        S    11:07   0:00 opensips start
root      7851  0.0  0.2 166796  2560 ?        S    11:07   0:00 opensips start
root      7852  0.0  0.2 166796  2564 ?        S    11:07   0:00 opensips start
root      7855  0.2  0.0 166796   924 ?         S    11:07   0:12 opensips start
root      7856  0.0  0.1 166796  1816 ?        S    11:07   0:01 opensips start
root     12092  0.0  0.0   9392   940 pts/0    S+   12:36   0:00 grep --color=auto opensips
[02:36:45] root@ser [~]#

Para ver se está chegando requisição em seu servidor use o TSHARK.

# tshark -R sip -i any

Lembrando que este comando está antes do seu Firewall localhost. Se esta chegando e não consegue autenticar reveja seu Firewall.

Você pode conectar seu usuário utilizando um softphone como o X-Lite ou 3CX Phone ou ainda o Zoiper.

Este tutorial é uma atualização do "Instalación de OpenSER 1.3.2 postado em Tribulinux realizado pelo usuário May.

Espero que ajude a quem esta inicializando neste novo mundo, o do SER!