SSD Nodes Learn 🎉 VPS desde $5.50/mês
Guias Matt ConnorPor Matt Connor

Servidor VoIP próprio com Asterisk e FreePBX

Configure Asterisk ou FreePBX no VPS com SIP trunk, portas RTP e firewall contra scanners. Veja como o toll fraud começa e proteja as chamadas.

O que é um servidor VoIP autogerido

Um servidor VoIP autogerido é um servidor SIP executado num VPS que controla, para que as chamadas sejam encaminhadas pela sua própria máquina em vez de por um serviço telefónico alojado. VoIP (voz sobre IP) transporta a fala como pacotes UDP. SIP (protocolo de iniciação de sessão) é a sinalização que estabelece e termina uma chamada. O áudio não passa pelo SIP, e esse facto é responsável pela maioria dos problemas descritos abaixo.

São necessárias quatro partes para ter um sistema funcional.

  • O software PBX (central telefónica privada). Asterisk é a escolha habitual. Gere as extensões e o plano de discagem.
  • Os endpoints. Telefones de secretária ou softphones que se registam no PBX com um nome de utilizador e um segredo.
  • O SIP trunk. Uma conta paga num fornecedor que liga o sistema à rede telefónica pública e aluga números de telefone reais.
  • O caminho de media. Os fluxos RTP (protocolo de transporte em tempo real) transportam o áudio através das suas próprias portas UDP.

Autogerir o PBX não significa autogerir os números de telefone. Os números são fornecidos por uma operadora, e continua a pagar por número e por minuto. O que controla é o encaminhamento das chamadas, o correio de voz, as gravações e a lista de extensões. Também é responsável pela segurança de um serviço que é atacado para obter dinheiro.

Quais portas são necessárias para um servidor VoIP autoalojado?

A sinalização SIP usa a porta 5060 para UDP e TCP, e a porta 5061 para SIP sobre TLS (segurança da camada de transporte). Essas portas transportam apenas a configuração das chamadas. O áudio de cada chamada é um fluxo UDP separado, enviado para uma porta escolhida do intervalo RTP. O Asterisk inclui um exemplo rtp.conf que define rtpstart=10000 e rtpend=20000, e os valores predefinidos compilados são 5000 e 31000. Cada chamada usa duas portas desse intervalo: uma para RTP e outra para RTCP (protocolo de controlo RTP).

É nesta separação que a maioria das primeiras tentativas falha. A chamada é estabelecida, os dois telefones mostram-na como atendida e nenhum dos lados ouve áudio, porque a firewall permite 5060 e descarta todos os pacotes RTP. A sinalização e os meios são fluxos separados, por isso precisam de regras de firewall separadas. Se esta distinção for nova para si, vale a pena ler como funcionam as portas e os sockets de escuta no Linux antes de abrir qualquer porta.

Reduza o intervalo antes de o abrir. Vinte mil portas são muito mais do que um sistema pequeno precisa. Duas portas por chamada significam que um intervalo de duzentas portas suporta cem chamadas em simultâneo.

[general]
rtpstart=10000
rtpend=10200

Aplique a configuração com sudo asterisk -rx "core reload".

Você deve instalar Asterisk ou FreePBX?

Asterisk é o mecanismo. Você o configura com ficheiros de texto em /etc/asterisk e escreve o dialplan por conta própria. FreePBX é uma interface web escrita em PHP e JavaScript que funciona sobre o Asterisk, gera esses ficheiros por você e adiciona módulos para correio de voz e filas de chamadas.

A diferença relevante num VPS é quem administra a máquina. Em agosto de 2026, o instalador oficial do FreePBX 17 espera um sistema Debian 12 sem alterações e instala Asterisk, um servidor web, um servidor de base de dados e PHP. Se você o executar num servidor que já aloja outros serviços, o resultado será problemático. Dê ao FreePBX o seu próprio VPS.

wget https://github.com/FreePBX/sng_freepbx_debian_install/raw/master/sng_freepbx_debian_install.sh -O /tmp/sng_freepbx_debian_install.sh
sudo bash /tmp/sng_freepbx_debian_install.sh

O log da instalação fica em /var/log/pbx/freepbx17-install.log. Esse é o primeiro local a consultar quando o script termina prematuramente.

O FreePBX controla os ficheiros de configuração que gera. Se editar pjsip.conf manualmente num servidor FreePBX, a sua alteração desaparecerá na próxima vez que a interface web gravar esse ficheiro. O FreePBX lê ficheiros separados que têm _custom no nome para configurações escritas manualmente e não os altera.

A escolha envolve um compromisso claro. O FreePBX fornece uma interface web e coloca uma página de início de sessão do seu sistema telefónico na internet pública. O Asterisk sem FreePBX não tem qualquer superfície web, e cada definição é uma diretiva documentada que você pode ler num ficheiro e manter no git. Se instalar o FreePBX, restrinja a porta web ao seu próprio endereço ou aceda a ela através de uma VPN, porque uma interface de administração de um PBX é um alvo com acesso direto a operações financeiras.

Nota sobre versões, correta em agosto de 2026: Asterisk 22 é a versão atual de suporte de longo prazo, publicada em outubro de 2024 e com correções de segurança previstas até outubro de 2028. Asterisk 23 é a versão standard. Ubuntu 24.04 inclui Asterisk 20.6.0 no repositório universe.

Instalar o Asterisk no Ubuntu 24.04

O pacote da distribuição é o caminho mais rápido. O Ubuntu aplica os seus patches e inicia-o automaticamente através do systemd.

sudo apt update
sudo apt install -y asterisk
sudo asterisk -rx "core show version"

Compilar a partir do código-fonte dá-lhe, em alternativa, a versão atual com suporte de longo prazo.

sudo apt update
sudo apt install -y build-essential wget
cd /usr/local/src
sudo wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
sudo tar -xzf asterisk-22-current.tar.gz
cd asterisk-22.*
sudo contrib/scripts/install_prereq install
sudo ./configure
sudo make menuselect
sudo make -j"$(nproc)"
sudo make install
sudo make samples
sudo make config
sudo ldconfig

install_prereq install instala as dependências de compilação da sua distribuição, e install_prereq test mostra os comandos que executaria sem alterar nada. make menuselect abre o seletor de módulos, onde ativa codec_opus em Codec Translators. Execute make samples apenas numa instalação nova, porque esse comando grava a configuração de exemplo em /etc/asterisk. make config instala o script de inicialização em /etc/init.d/asterisk, e o systemd executa-o através da sua camada de compatibilidade com SysV; por isso, sudo systemctl enable --now asterisk funciona depois.

Independentemente do caminho escolhido, sudo asterisk -rvvv liga-se ao daemon em execução e disponibiliza a CLI. Executar core show version nesse contexto mostra o que foi realmente instalado.

Configurar um tronco SIP e uma extensão

PJSIP é o controlador de canal SIP nas versões atuais do Asterisk. A configuração fica em /etc/asterisk/pjsip.conf e é composta por pequenas secções tipadas que fazem referência umas às outras pelo nome. Secções de tipos diferentes podem partilhar um nome, por isso todos os blocos abaixo se chamam mytrunk.

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[mytrunk]
type=registration
outbound_auth=mytrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60

[mytrunk]
type=auth
auth_type=userpass
username=1234567890
password=REPLACE_WITH_A_LONG_RANDOM_SECRET

[mytrunk]
type=aor
contact=sip:sip.example.com:5060

[mytrunk]
type=endpoint
context=from-trunk
disallow=all
allow=ulaw
outbound_auth=mytrunk
aors=mytrunk

[mytrunk]
type=identify
endpoint=mytrunk
match=sip.example.com

O objeto registration envia o REGISTER que indica ao seu fornecedor para onde deve entregar as suas chamadas. O objeto identify determina como uma chamada recebida do fornecedor é associada a este endpoint através do endereço de origem. Normalmente, o fornecedor publica vários endereços que devem ser indicados nesse objeto. O registo de saída e o endpoint são objetos separados por uma razão: um informa o fornecedor de onde está, e o outro decide o que acontece às chamadas.

Um telefone de secretária precisa de mais três objetos.

[6001]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=auth6001
aors=6001
direct_media=no

[auth6001]
type=auth
auth_type=userpass
username=6001
password=REPLACE_WITH_A_LONG_RANDOM_SECRET

[6001]
type=aor
max_contacts=1

direct_media=no mantém o Asterisk no caminho da comunicação multimédia. Se o omitir, o Asterisk tentará fazer com que os dois endpoints enviem RTP diretamente entre si. Isto falha quando um telefone está atrás de NAT (tradução de endereços de rede) num router doméstico. Nunca faça o segredo corresponder ao número da extensão. O exemplo a montante usa password=6001 para a extensão 6001 para manter o exemplo legível, e os scanners tentam primeiro exatamente esse padrão.

O dialplan em /etc/asterisk/extensions.conf determina o que cada contexto pode fazer.

[internal]
exten => 6001,1,Dial(PJSIP/6001,20)
exten => _9X.,1,Dial(PJSIP/${EXTEN:1}@mytrunk,60)

[from-trunk]
exten => 1234567890,1,Dial(PJSIP/6001,20)
same => n,Hangup()

Esses dois contextos são uma fronteira de segurança. from-trunk trata as chamadas recebidas do fornecedor e só pode fazer tocar a extensão 6001. Não consegue corresponder ao padrão _9X., por isso uma chamada externa não pode voltar a fazer chamadas através do seu tronco. Se juntar os contextos, cria o caminho clássico para fraude de chamadas: um desconhecido liga para o seu número, o seu dialplan faz uma chamada de saída através da sua conta e é você quem paga.

Aplique a configuração e verifique-a.

sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show registrations"
sudo asterisk -rx "pjsip show endpoints"

pjsip show registrations deve listar mytrunk com o estado Registered. Rejected significa que o fornecedor recusou as suas credenciais. Unregistered significa que o seu REGISTER não está a receber resposta, por isso verifique primeiro a firewall.

Regras de firewall para SIP e RTP

A sinalização e os media requerem tratamentos diferentes porque têm riscos diferentes. Restrinja a porta 5060 aos endereços que o seu fornecedor utiliza efetivamente e às redes onde estão os seus telefones.

sudo ufw allow proto udp from 203.0.113.10 to any port 5060
sudo ufw allow proto tcp from 203.0.113.10 to any port 5060
sudo ufw allow 10000:10200/udp
sudo ufw status verbose

O intervalo RTP é a parte que não pode restringir tanto, porque os media chegam frequentemente de um endereço diferente do da sinalização. Peça ao seu fornecedor as sub-redes dos media e restrinja o acesso a essas sub-redes se forem publicadas. Mantenha o intervalo apenas com o tamanho necessário para a hora de maior utilização. As políticas predefinidas, a ordem das regras e o restante modelo do ufw são abordados no guia básico do firewall ufw para um VPS.

Verifique também o IPv6. Se IPV6=no estiver definido em /etc/default/ufw, o ufw não filtra IPv6, pelo que um daemon associado a :: fica acessível através de IPv6 sem aplicar nenhuma das regras acima. Abrir portas para IPv6 com ufw explica as diferenças entre as duas famílias. A maioria dos fornecedores também disponibiliza um firewall de rede separado no painel de controlo. Esse firewall é aplicado antes de os pacotes chegarem ao VPS, por isso a porta tem de estar aberta nos dois locais.

Força bruta no SIP e fraude de tarifação não são problemas opcionais

Exponha a porta 5060 num endereço público e os scans começam. O padrão é constante: pedidos REGISTER e INVITE de muitos endereços de origem, a tentar números de extensão comuns com segredos comuns. O Asterisk regista cada falha, e a linha tem este formato.

Request 'REGISTER' from '<sip:1000@198.51.100.20>' failed for '198.51.100.20:5060' (callid: 5f1a5c0d) - No matching endpoint found

A razão para isto exigir um esforço efetivo é financeira. Uma extensão roubada é usada para fazer chamadas internacionais dispendiosas, muitas vezes para números de tarifa premium que pagam uma comissão ao atacante. A fatura fica do seu lado porque as chamadas usaram as suas credenciais. O ataque funciona à velocidade da máquina e normalmente decorre durante a noite.

Seis controlos são obrigatórios, não medidas opcionais de hardening.

  • Nunca crie uma extensão cujo segredo seja o próprio número ou uma palavra curta. Gere um com openssl rand -base64 24 e cole-o.
  • Mantenha as chamadas de entrada anónimas desativadas. O PJSIP recusa chamadas não identificadas por predefinição e só as aceita se criar um endpoint chamado anonymous. Não crie um.
  • Mantenha o contexto do trunk separado de qualquer contexto que possa fazer chamadas de saída, conforme mostrado acima.
  • Restrinja a sinalização pelo endereço de origem, tanto no ufw como na firewall de rede do seu fornecedor.
  • Defina um limite de gastos com o fornecedor do seu trunk SIP e desative os destinos internacionais para os quais nunca liga. Este é o único controlo que limita a perda quando os outros falham.
  • Execute o fail2ban contra o log do Asterisk.

O Asterisk também pode gerar um evento de segurança depois de vários pedidos não correspondentes provenientes do mesmo endereço. A secção [global] de pjsip.conf usa unidentified_request_count, que tem o valor predefinido de 5, e unidentified_request_period, que tem o valor predefinido de 5 segundos. Em conjunto, isto significa que cinco pedidos não correspondentes do mesmo endereço dentro de cinco segundos geram um evento de segurança que o fail2ban pode processar.

Bloqueie os scanners com fail2ban

O fail2ban já inclui uma jail asterisk pronta. Ela abrange as portas 5060 e 5061, lê /var/log/asterisk/messages e usa maxretry = 10 por predefinição. A jail permanece desativada até a ativar em /etc/fail2ban/jail.local.

[asterisk]
enabled = true
maxretry = 5
findtime = 600
bantime = 86400
sudo systemctl restart fail2ban
sudo fail2ban-client status asterisk

Um resultado correto apresenta o ficheiro de log da jail e o número de endereços atualmente bloqueados. Numa porta 5060 pública, esse número deixa de ser zero no prazo de um dia. O filtro incluído deteta as mensagens No matching endpoint found acima e também as linhas estruturadas SecurityEvent do Asterisk. Esses eventos são enviados para um canal de log separado, comentado em /etc/asterisk/logger.conf. Ative-o nesse ficheiro e adicione o ficheiro ao logpath da jail se quiser detetar esses eventos.

[logfiles]
console => notice,warning,error
messages.log => notice,warning,error
security.log => security

Recarregue o logger com sudo asterisk -rx "logger reload". O filtro também inclui um journalmatch para asterisk.service, por isso um backend de journal funciona se preferir não manter ficheiros de log. A instalação, a estrutura jail.local e a remoção do bloqueio de um endereço que tenha bloqueado por engano estão descritas no guia do fail2ban para Ubuntu 24.04.

Latência e escolha de codec num VPS distante

A latência é determinada pela geografia e não pode ser eliminada com configuração. A ITU-T G.114 recomenda manter a latência de ida abaixo de 150 ms para conversas normais e considera que até cerca de 400 ms continua utilizável. O áudio de um telefone vai para o seu VPS e depois para o seu fornecedor de trunk, portanto um VPS na região errada faz esse percurso duas vezes. Coloque-o perto dos telefones ou do fornecedor. Quando essas opções forem incompatíveis, prefira a proximidade dos telefones, porque essa ligação normalmente passa pela Internet de consumo, onde o jitter é maior.

A escolha do codec determina a largura de banda por chamada. Cada codec apresentado envia um pacote a cada 20 ms, ou seja, 50 pacotes por segundo. Cada pacote transporta 40 bytes de cabeçalhos IP, UDP e RTP, além do payload de áudio.

ChartBandwidth per concurrent call, one direction, 20 ms packets
The data behind this chart
[
  {
    "label": "G.711 ulaw",
    "payload_kbps": 64,
    "ip_kbps": 80
  },
  {
    "label": "G.722",
    "payload_kbps": 64,
    "ip_kbps": 80
  },
  {
    "label": "Opus at 24 kbps",
    "payload_kbps": 24,
    "ip_kbps": 40
  },
  {
    "label": "G.729",
    "payload_kbps": 8,
    "ip_kbps": 24
  }
]

G.711 ulaw é o padrão na maioria dos trunks. O seu payload é de 64 kbps. Com os cabeçalhos, uma chamada em curso consome 80 kbps em cada direção. Opus a 24 kbps utiliza 40 kbps. G.729 reduz esse valor para 24 kbps, à custa da qualidade do áudio e de tempo de CPU. Estes valores resultam de cálculos dos cabeçalhos, não de medições: taxa do payload mais 40 bytes por pacote a 50 pacotes por segundo. O enquadramento Ethernet ou VLAN acrescenta um pouco mais ao tráfego no meio físico.

A transcodificação consome CPU. Se os seus telefones e o seu trunk utilizarem ambos ulaw, permita apenas ulaw e o Asterisk encaminhará o áudio sem o alterar. Opus funciona bem em ligações com perdas, mas a transcodificação entre Opus e G.711 requer o módulo externo codec_opus. Esse módulo é selecionado em make menuselect e não é compilado por predefinição.

O que falha e a mensagem que verá

A chamada é estabelecida, mas ninguém ouve nada. Não está a chegar RTP. Confirme se o intervalo em rtp.conf corresponde ao intervalo que abriu na firewall e monitorize os pacotes com sudo tcpdump -ni any udp portrange 10000-10200 enquanto faz uma chamada. Se não houver pacotes, a sua firewall ou a firewall de rede do fornecedor está a bloqueá-los.

Áudio apenas numa direção. Um dos lados está a enviar RTP para um endereço que não consegue recebê-lo. Isto é um problema de endereçamento, não de portas. Se o VPS tiver o endereço público diretamente na sua interface, não é necessário configurar o NAT. Se o fornecedor atribuir ao VPS um endereço privado com um mapeamento público um para um, defina o endereço público no transporte e indique o intervalo privado em local_net.

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
local_net=10.0.0.0/8
external_media_address=198.51.100.5
external_signaling_address=198.51.100.5

No matching endpoint found no log. O pedido não correspondeu a nenhum endpoint pelo endereço IP nem pelo nome de utilizador. A partir de um scanner, isto é normal e o fail2ban tratará do caso. A partir do seu próprio fornecedor, significa que a secção identify não inclui o endereço a partir do qual o fornecedor faz as chamadas para si.

O estado do registo é Rejected. O fornecedor recusou as credenciais na sua secção auth. Execute pjsip set logger on na CLI, monitorize um REGISTER e a resposta correspondente e compare client_uri e username com os valores fornecidos pelo fornecedor.

Não há nada útil no log. Por predefinição, o Asterisk escreve no log as mensagens de nível notice e superiores em messages.log. Aumente o nível com core set verbose 4 e pjsip set logger on enquanto reproduz o problema. Depois desative ambos, porque o logger SIP escreve todos os pacotes.

Antes de o expor

Uma PBX não é como os outros serviços que aloja por sua conta. Uma aplicação web avariada deixa uma página indisponível. Uma PBX avariada pode gerar uma fatura telefónica elevada em poucas horas, enquanto dorme. Execute-a numa VPS dedicada, sem outros serviços, restrinja a porta 5060 a endereços conhecidos, defina um segredo aleatório para cada extensão e estabeleça um limite de despesa na conta do trunk. O restante sistema precisa da mesma configuração de base que qualquer servidor exposto. Esta análise sobre a segurança real do alojamento em VPS explica essa configuração.

FAQ

Que portas devo abrir para um servidor VoIP autoalojado?

A porta 5060 para sinalização SIP por UDP e TCP, a porta 5061 se utilizar SIP sobre TLS e um intervalo de portas UDP para os meios RTP. O exemplo de rtp.conf do Asterisk utiliza 10000 a 20000, e os valores predefinidos compilados são 5000 a 31000. Cada chamada consome duas portas do intervalo, portanto um intervalo de duzentas portas suporta cem chamadas simultâneas. Abra o intervalo RTP como UDP e restrinja a porta 5060 aos endereços do seu fornecedor e às suas próprias redes, em vez de a deixar aberta a todos.

Devo instalar o Asterisk isoladamente ou utilizar o FreePBX?

Instale o Asterisk sem camadas adicionais quando quiser uma superfície de ataque reduzida, ficheiros de configuração que possa manter no git e estiver disposto a escrever o dialplan. Instale o FreePBX quando quiser uma interface gráfica para extensões, correio de voz e filas de chamadas. Em agosto de 2026, o instalador do FreePBX 17 espera uma máquina Debian 12 sem alterações e instala o Asterisk, um servidor web, um servidor de base de dados e PHP. Por isso, atribua-lhe o seu próprio VPS. O FreePBX regenera os ficheiros de configuração que gere, portanto as edições manuais devem ser feitas nos seus ficheiros _custom.

Porque não há áudio depois de a chamada ser estabelecida?

A sinalização funcionou, mas os meios não. O SIP estabeleceu a chamada na porta 5060, e o áudio utiliza um fluxo UDP separado para uma porta do intervalo RTP que está a ser bloqueado. Verifique se o intervalo em rtp.conf corresponde ao intervalo aberto na firewall. Verifique também a firewall de rede do fornecedor, além da firewall do servidor. Execute sudo tcpdump -ni any udp portrange 10000-10200 durante uma chamada: a ausência de pacotes significa que estão a ser bloqueados antes de chegarem.

Como impeço ataques de força bruta contra SIP e fraude de tarifação?

Atribua a cada extensão um segredo aleatório longo, que nunca corresponda ao número da extensão. Mantenha separado o contexto utilizado pelo seu trunk e qualquer contexto que possa efetuar chamadas externas, para que uma chamada recebida não possa efetuar uma chamada externa através da sua conta. Restrinja a porta 5060 aos endereços do seu fornecedor. Ative a jail asterisk no fail2ban. Essa jail lê /var/log/asterisk/messages e bloqueia os endereços que produzem No matching endpoint found falhas. Depois, defina um limite de despesa e bloqueie os destinos internacionais não utilizados junto do seu fornecedor, porque esse é o único controlo que limita a perda se os restantes falharem.

Um VPS numa região distante prejudica a qualidade das chamadas?

Sim, porque o áudio percorre dois segmentos: do telefone para o VPS e depois do VPS para o fornecedor do trunk. A recomendação ITU-T G.114 é manter o atraso num só sentido abaixo de 150 ms. Um VPS mal localizado pode consumir a maior parte desse limite apenas devido à distância. Escolha uma região próxima dos telefones, porque esse segmento normalmente utiliza a Internet de acesso, onde o jitter é maior. A escolha do codec não corrige o atraso. Apenas altera a largura de banda. Por isso, o G.729 poupa bytes, mas não resolve um percurso de 200 ms.

#voip#asterisk#freepbx#sip#self-hosting