Comunicação OpenSIPS ao SIPPROXY TSi Telecom
Este relatório descreve, de forma completa e acessível, a plataforma de comunicação SIP construída com OpenSIPS 3.6.6 na TSi Telecom, sua arquitetura de serviços, portas, módulos, fluxos de chamada e a integração com o SIP Proxy oficial sipproxy.tsitelecom.com.br.
1. O que é o OpenSIPS nesta arquitetura
O OpenSIPS é um servidor SIP de alto desempenho que atua como SBC (Session Border Controller), registrador, roteador e softswitch na infraestrutura da TSi Telecom. Ele é o ponto central que recebe e envia toda a sinalização SIP entre endpoints (telefones, softphones, PABXs) e o mundo externo.
Nesta implementação, o OpenSIPS não apenas registra usuários e roteia chamadas: ele também gerencia autenticação, diálogos, NAT traversal, áudio RTP (via RTPProxy), filas de call center, balanceamento de carga entre gateways e rastreamento de chamadas. Tudo isso é feito com base em módulos especializados carregados dinamicamente.
A conexão com a operadora de telefonia é feita por meio do SIPPROXY, o servidor SIP da TS Telecom que recebe as chamadas destinadas à rede pública (PSTN) e devolve as chamadas recebidas. O endereço desse proxy é sipproxy.tsitelecom.com.br, que resolve para 177.10.116.79 e escuta na porta 5060 (UDP e TCP).
2. Arquitetura e diagrama completo
A plataforma é dividida em camadas bem definidas. A camada de sinalização SIP é independente da camada web de relatórios, garantindo segurança e isolamento.
Nota importante: a landpage que você está lendo faz parte da camada web de documentação. A sinalização SIP em si flui diretamente entre o OpenSIPS Core e o SIPPROXY, sem passar por navegadores ou pela internet comum.
3. Serviços, containers e funções
Cada componente da stack é executado em um container Docker independente, conectado à rede interna tsi-network. Essa separação facilita manutenção, atualizações e escalabilidade.
| Serviço | Container | IP interno | Função principal |
|---|---|---|---|
| OpenSIPS Core | tsi-opensips-core | 172.20.50.2 | Processa toda a sinalização SIP: REGISTER, INVITE, BYE, OPTIONS etc. É o cérebro da plataforma. |
| MariaDB | tsi-opensips-mariadb | 172.20.50.3 | Banco de dados relacional que armazena usuários SIP (subscriber), domínios, rotas PSTN, diálogos ativos, permissões e logs de call center. |
| OpenSIPS-CP | tsi-opensips-ocp | 172.20.50.4 | Painel web de administração. Permite gerenciar usuários, aliases, rotas de discagem, DID, gateways, filas de call center e visualizar estatísticas. |
| RTPProxy | tsi-opensips-rtpproxy | 172.20.50.5 | Media relay para áudio RTP. Faz o encaminhamento do fluxo de voz entre endpoints, especialmente em cenários com NAT. |
| MOH | tsi-opensips-moh | 172.20.50.7 | Servidor Asterisk dedicado a fornecer música de espera para chamadas em fila do call center. |
| OpenSIPS-CLI | tsi-opensips-cli | 172.20.50.6 | Ferramenta de linha de comando para diagnóstico e administração, executada sob demanda (perfil admin). |
4. Portas, protocolos e firewall
Abaixo estão todas as portas utilizadas pelos serviços OpenSIPS, com indicação de onde são expostas e quem pode acessá-las.
Status de comunicação com o SIPPROXY
Testes de conectividade realizados diretamente com sipproxy.tsitelecom.com.br (177.10.116.79):
Portas expostas na internet (UFW)
| Porta | Protocolo | Origem permitida | Função |
|---|---|---|---|
| 5060 | UDP/TCP | Anywhere | Sinalização SIP padrão (registro e chamadas) |
| 5061 | TCP | Anywhere | Sinalização SIP criptografada com TLS |
| 30000-30100 | UDP | Anywhere | Fluxo de mídia RTP (áudio das chamadas) |
| 5060 | UDP/TCP | 177.10.116.79 | SIP exclusivo para o SIPPROXY TSi Telecom |
| 5061 | TCP | 177.10.116.79 | SIP/TLS exclusivo para o SIPPROXY TSi Telecom |
| 2775 | TCP | 177.10.116.79 | SMPP (SMS) para integração com o SIPPROXY, se necessário |
Portas internas (rede Docker tsi-network)
| Porta | Protocolo | Serviço | Acesso | Função |
|---|---|---|---|---|
| 3306 | TCP | MariaDB | 172.20.0.0/16 | Banco de dados da plataforma |
| 8888 | TCP | OpenSIPS MI HTTP | 172.20.0.0/16 | API de gerenciamento interno (Management Interface) |
| 9060 | TCP | OpenSIPS Homer | 172.20.0.0/16 | Captura de traces SIP para análise (atualmente desabilitado) |
| 7899 | UDP | RTPProxy | Rede interna | Controle do RTPProxy pelo OpenSIPS |
| 80 | TCP | OpenSIPS-CP | Via Traefik | Painel web de administração |
5. Módulos ativos e o que cada um faz
O poder do OpenSIPS vem dos seus módulos. Cada módulo adiciona uma capacidade específica à plataforma. Abaixo estão os principais módulos carregados na configuração atual.
| Módulo | Função resumida |
|---|---|
signaling | Envio de respostas SIP e funções básicas de sinalização. |
sl | Respostas SIP stateless, como erros rápidos. |
tm | Gerenciamento de transações SIP (stateful forwarding) — essencial para t_relay(). |
rr | Record-Route, garante que as respostas SIP retornem pelo mesmo caminho. |
maxfwd | Valida o cabeçalho Max-Forwards para evitar loops infinitos. |
sipmsgops / textops | Manipulação de cabeçalhos e corpo das mensagens SIP. |
proto_udp / proto_tcp / proto_tls | Transportes SIP: UDP, TCP e TLS. |
tls_mgm / tls_openssl | Gerenciamento de certificados TLS para chamadas seguras. |
db_mysql | Conector MySQL/MariaDB para os módulos que precisam de banco. |
usrloc | Localização dos usuários SIP registrados (onde cada ramal pode ser encontrado). |
registrar | Processa mensagens REGISTER e armazena o binding no banco. |
auth / auth_db | Autenticação digest dos usuários contra a tabela subscriber. |
domain | Gerenciamento de domínios SIP suportados pela plataforma. |
dialog | Controle de diálogos ativos, com persistência no banco. |
acc | Accounting: registra detalhes de chamadas para bilhetagem. |
nathelper | Ajuda a resolver cenários de NAT, mantendo endpoints atrás de roteadores alcançáveis. |
rtpproxy | Integração com o RTPProxy para encaminhamento de mídia. |
presence | Suporte a presença SIP (disponível/ocupado). |
b2b_entities / b2b_logic | Back-to-Back User Agent, útil para cenários avançados de controle de chamadas. |
permissions | Listas de permissões por endereço IP (tabela address). |
load_balancer | Distribuição de carga entre gateways SIP. |
call_center | Filas de atendimento e distribuição de chamadas para agentes. |
drouting | Roteamento dinâmico de chamadas, usado para rotear números para o PSTN. |
tracer | Captura de traces SIP para auditoria e depuração. |
proto_smpp | Protocolo SMPP para integração com gateways de SMS. |
6. Fluxo completo de uma chamada
Entender o caminho de uma chamada ajuda a diagnosticar problemas e a treinar equipes. Abaixo está o fluxo passo a passo.
6.1 Registro de um ramal (REGISTER)
- O telefone envia um
REGISTER sip:opensips.tsiapp.io SIP/2.0para a VPS na porta 5060. - O OpenSIPS recebe a mensagem e verifica se o domínio é conhecido (
is_myself("$rd")). - O módulo
auth_dbexige autenticação digest usando usuário e senha da tabelasubscriber. - Se autenticado, o
registrarsalva a localização do ramal nousrloce no MariaDB. - O telefone recebe
200 OKe fica disponível para receber chamadas.
6.2 Chamada para fora (INVITE → PSTN via SIPPROXY)
- O ramal disca um número, por exemplo
5511999999999, e enviaINVITEao OpenSIPS. - A rota principal detecta que o destino é numérico e direciona para
route(pstn). route(require_auth)verifica se o originador é confiável (tabelaaddress) ou exige autenticação.- O módulo
droutingconsulta as rotas de discagem e define o próximo salto. - O
rtpproxyinsere um SDP intermediário para permitir que o áudio flua corretamente. - O OpenSIPS encaminha o
INVITEparasipproxy.tsitelecom.com.br:5060(177.10.116.79). - O SIPPROXY completa a chamada na rede pública (PSTN).
- Respostas e BYE trafegam pelo mesmo caminho, gerenciados pelo módulo
dialog.
6.3 Chamada para o Call Center (filas)
- O usuário disca
*800. - O OpenSIPS identifica o prefixo e direciona para
route(callcenter). - O módulo
call_centercoloca a chamada na filatsiapp_support. - Quando um agente fica disponível, a chamada é entregue a ele.
- Durante a espera, o
MOH(Asterisk) fornece música de espera.
7. Configuração do SIPPROXY explicada
No arquivo /opt/tsi-stack/apps/opensips/config/opensips.cfg, existe um tratamento especial para mensagens REGISTER cujo domínio de destino seja o SIPPROXY. Isso é útil quando endpoints são configurados para se registrar diretamente no domínio da operadora, mas o OpenSIPS precisa interceptar e redirecionar para o IP correto.
Trecho de configuração
if (is_method("REGISTER")) {
if ($rd == "sipproxy.tsitelecom.com.br") {
xlog("L_INFO", "REGISTER outbound override: $rd -> 177.10.116.79:5060\n");
$rd = "177.10.116.79";
$rp = "5060";
}
}
O que esse trecho faz?
$rdé a variável que representa o domínio do Request-URI da mensagem SIP.$rprepresenta a porta do Request-URI.- Se um REGISTER chegar destinado a
sipproxy.tsitelecom.com.br, o OpenSIPS altera o destino para o IP177.10.116.79e porta5060. - Em seguida, como o novo destino não é local (
!is_myself("$rd")), o fluxo cai emroute(relay), que chamat_relay()e encaminha o REGISTER ao SIPPROXY.
Por que isso é importante?
Alguns telefones e PABXs são configurados com o domínio textual da operadora em vez do IP. Sem esse override, o OpenSIPS tentaria resolver o domínio ou tratar a mensagem localmente, o que poderia falhar. Com o override, a mensagem é encaminhada de forma determinística para o IP correto.
$rd e $rp são pseudo-variáveis do Request-URI, e a atribuição direta a elas é equivalente ao uso das funções sethost() e setport(). A função t_relay() é o mecanismo recomendado para encaminhamento stateful de mensagens SIP.
8. Ferramentas de operação
OpenSIPS-CP
Painel web disponível em opensips.tsiapp.io/cp. Por meio dele é possível:
- Criar e editar usuários SIP (ramais).
- Gerenciar aliases e domínios.
- Configurar rotas de discagem (drouting).
- Visualizar e administrar filas de call center.
- Acompanhar estatísticas e logs básicos.
OpenSIPS-CLI
Ferramenta de terminal para administradores. Permite:
- Recarregar tabelas de rotas e permissões.
- Consultar estatísticas de tráfego.
- Depurar configurações e variáveis.
- Executar scripts de manutenção.
MI HTTP (Management Interface)
A porta 8888 expõe uma API JSON-RPC que permite consultar e controlar o OpenSIPS programaticamente. Exemplo de consulta de versão:
POST http://172.20.50.2:8888/mi/
Content-Type: application/json
{
"jsonrpc": "2.0",
"method": "version",
"id": 1
}
Resposta típica:
{"jsonrpc":"2.0","result":{"Server":"OpenSIPS (3.6.6 (x86_64/linux))"},"id":1}
Backup e recuperação
O script /opt/tsi-stack/apps/opensips/scripts/backup.sh realiza backup automatizado do banco MariaDB e dos arquivos de configuração. Os backups são armazenados em /opt/tsi-stack/apps/opensips/backups/ com data e hora.
9. Camadas de segurança
🔐 Autenticação digest
Ramais precisam se autenticar com usuário e senha armazenados no MariaDB. Gateways confiáveis são listados na tabela address do módulo permissions.
🛡️ TLS para SIP
Chamadas criptografadas utilizam TLS na porta 5061. Os certificados estão em /opt/tsi-stack/apps/opensips/certs.
🚫 Lockout no painel
O OpenSIPS-CP possui proteção contra brute-force: 5 tentativas falhas de login geram bloqueio de 15 minutos.
🔒 Firewall UFW
Apenas as portas necessárias estão abertas. Portas administrativas (8888, 3306, 9060) são restritas à rede Docker interna.
🧱 Separação de camadas
A camada web (landpage e OCP) é servida pelo Traefik, enquanto a sinalização SIP flui diretamente pelo OpenSIPS. Isso evita que a interface web tenha acesso direto ao tráfego de voz.
📝 Accounting e tracing
Os módulos acc e tracer registram eventos de chamada e mensagens SIP, permitindo auditoria e investigação de incidentes.
10. Troubleshooting rápido
| Sintoma | Possível causa | Ação sugerida |
|---|---|---|
| Ramal não registra | Credenciais incorretas ou domínio errado | Verificar usuário/senha no OCP e confirmar domínio opensips.tsiapp.io. |
| Chamada cai após atender | Problema de RTP ou NAT | Verificar se o RTPProxy está ativo e se as portas 30000-30100 UDP estão liberadas. |
| Não disca para números externos | Rota PSTN ou SIPPROXY inacessível | Testar conectividade para 177.10.116.79:5060 e verificar tabela drouting. |
| Sem áudio em ambos os lados | SDP ou RTP bloqueado | Confirmar que rtpproxy_offer e rtpproxy_answer estão ativos nas rotas. |
| Painel OCP não abre | Container com problema ou credenciais bloqueadas | Verificar logs com docker logs tsi-opensips-ocp e aguardar lockout expirar. |