Agora que você já tem seu próprio servidor XMPP usando o Prosody conforme o último tutorial publicado, agora é hora de descobrir como realizar chamadas de áudio e vídeo através dele.
Caso ainda não tenha seu próprio servidor XMPP, dê uma lida no link acima antes de começar. Para este tutorial vamos usar o eturnal para, em parceria com o Prosody, tornar possível a comunicação por áudio e vídeo.
Há outras alternativas, como o coturn, mas ele depende de uma série de outros programinhas e um banco de dados enquanto o eturnal não depende de ninguém e apenas funciona — muito bem, diga-se.
Criando os registros DNS
O primeiro passo é criar um subdomínio chamado turn
no domínio usado pelo seu servidor XMPP. Assim, ao final ficaria algo como turn.exemplo.com
. Aponte ele para o IP do seu servidor VPS criando um A Record.
Usamos o nome TURN aqui por ser o mesmo nome do protocolo empregado pelo eturnal para intermediar a conexão entre cliente, peers e servidor.
Você vai precisar ainda criar alguns registros DNS chamados de SRV. Como as coisas mudam de acordo com o lugar onde o domínio é gerenciado, você precisará ver como proceder.
Os detalhes são os seguintes:
_stun._udp.exemplo.com. 14400 IN SRV 5 0 3478 turn.exemplo.com. _stun._tcp.exemplo.com. 14400 IN SRV 5 0 3478 turn.exemplo.com. _stuns._tcp.exemplo.com. 14400 IN SRV 5 0 5349 turn.exemplo.com. _turn._udp.exemplo.com. 14400 IN SRV 5 0 3478 turn.exemplo.com. _turn._tcp.exemplo.com. 14400 IN SRV 5 0 3478 turn.exemplo.com. _turns._tcp.exemplo.com. 14400 IN SRV 5 0 5349 turn.exemplo.com.
A ordem é: _serviço._protocolo.domínio
. Depois vem o time to live (TTL), então o tipo de registro (SRV
), depois a prioridade (5
), o peso (0
), a porta (3478
) e por fim para onde esse registro aponta (turn.exemplo.com
).
Altere somente o que está em negrito e sublinhado para o domínio do seu servidor XMPP.
Gerando o certificado TLS
Agora vamos gerar um novo certificado TLS para o subdomínio turn.exemplo.com
para permitir conexões criptografadas de áudio e vídeo. Para isso, de acordo com o tutorial do Prosody, faremos assim:
certbot certonly --standalone --agree-tos -m meu@email.com -d turn.exemplo.com
Como sempre, substitua os trechos sublinhados e em negrito com seu e-mail e o domínio usado pelo seu servidor XMPP.
Abrindo as portas no firewall
Se você seguiu o tutorial para instalar o Prosody, significa que tem o UFW instalado também. Portanto, para abrir as portas necessárias vamos usar os comandos abaixo executados no terminal SSH:
ufw allow 3478 ufw allow 5349 ufw allow 6000:7000
Instalando e configurando o eturnal
Para esta parte do tutorial, vamos executar os seguintes comandos via terminal SSH:
wget https://eturnal.net/repositories/eturnal.list -O /etc/apt/sources.list.d/eturnal.list wget https://eturnal.net/repositories/eturnal.gpg -O /etc/apt/trusted.gpg.d/eturnal.gpg apt update apt install eturnal
Agora, para configurar ele, vamos editar o arquivo /etc/eturnal.yml
. Para isso vamos usar o nano
digitando esse comando na frente do arquivo a ser editado, conforme abaixo:
nano /etc/eturnal.yml
Sempre que precisar editar algo, digite nano
seguido do caminho até o arquivo a ser alterado. O resultado após as modificações deve ficar mais ou menos assim (tirando a maioria dos comentários):
eturnal: secret: "código-super-secreto" relay_ipv4_addr: "ip-externo-do-seu-servidor" listen: - ip: "::" port: 3478 transport: udp - ip: "::" port: 3478 transport: tcp - ip: "::" port: 5349 transport: tls tls_crt_file: /caminho/ate/seu/certificado.pem tls_key_file: /caminho/ate/sua/chave.key tls_options: - no-sslv3 - no_tlsv1 - no_tlsv1_1 - cipher_server_preference tls_ciphers: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:@STRENGTH relay_min_port: 6000 relay_max_port: 7000 blacklist: - "127.0.0.0/8" - "::1" strict_expiry: false # This is the default. log_level: info # critical | error | warning | notice | info | debug log_rotate_size: 10485760 # 10 MiB (default: unlimited, i.e., no rotation). log_rotate_count: 5 # Keep 10 rotated log files. log_dir: stdout # Enable for logging to the terminal/journal. modules: mod_log_stun: {} # Log STUN queries (in addition to TURN sessions).
Mais uma vez, acima você vai precisar editar somente os trechos em negrito e sublinhado. Em secret
crie um código alfanumérico bem longo e com muitos caracteres especiais, como esses: @#$%&*
.
Ele não pode ser fácil de adivinhar ou memorizar, já que apenas o Prosody e o eturnal precisam saber qual é esse código.
Em tls_crt_file
e tls_key_file
você precisa definir o caminho que leva até, respectivamente, o certificado TLS e sua chave privada para o subdomínio turn
que criamos no início do tutorial.
Eles devem ser facilmente encontrados na pasta /etc/letsencrypt/live
. O ideal é você copiar o certificado e a chave para a pasta /etc/eturnal
e rodar o seguinte comando:
chown -R eturnal:eturnal /etc/eturnal
Isso é necessário pois o eturnal precisa que os arquivos estejam sob seu usuário no sistema operacional para que possa trabalhar com eles. Então no arquivo de configuração, em vez de apontar para /etc/letsencrypt/live
, você vai apontar para os dois arquivos copiados em /etc/eturnal
.
Configurando o Prosody
Agora a última parte do tutorial envolve comunicar o Prosody sobre o eturnal de modo que os dois trabalhem juntos em prol da capacidade de realizar chamadas de áudio e vídeo por meio do seu servidor XMPP.
Para isso, vamos editar o arquivo /etc/prosody/prosody.cfg.lua
. Em modules_enabled
, retire os dois hifens (--
) da frente da linha "turn_external"
. Então, o que antes era assim:
(...)
--"turn_external";
(...)
Vai ficar assim:
(...)
"turn_external";
(...)
Faça o mesmo com external_services
, se necessário. Agora, mais abaixo no arquivo de configuração, vamos editar (caso já existam) ou então adicionar as seguintes linhas:
turn_external_host = "turn.exemplo.com" turn_external_port = 3478 turn_external_secret = "código-super-secreto" external_service_secret = "código-super-secreto" external_services = { { type = "stun", transport = "udp", host = "turn.exemplo.com", port = 3478 }, { type = "turn", transport = "udp", host = "turn.exemplo.com", port = 3478, secret = true }, { type = "turns", transport = "tcp", host = "turn.exemplo.com", port = 5349, secret = true } }
Substitua apenas os trechos em negrito de acordo com o domínio usado pelo seu servidor XMPP e com o mesmo código secreto localizado em secret
no arquivo de configuração do eturnal.
Caso algumas dessas linhas já existam mas comecem com os dois hifens mencionados antes, remova o dois tracinhos e faça as alterações necessárias na linha para que tudo funcione como esperado.
Agora o golpe de misericórdia: após todos esses passos, vamos reiniciar os serviços envolvidos no esquema:
systemctl restart prosody eturnal
Caso não apareça nenhuma mensagem de erro, mesmo assim vamos averiguar mais de perto para ver se está tudo certo:
systemctl status prosody eturnal
Caso esteja tudo verdinho e sem erros, você está pronto. Basta logar em um cliente XMPP, como o Conversations (ele é grátis no F-Droid). Inicie uma conversa com um contato e toque no ícone de telefone no topo da tela.

Pronto! Se tudo correr como esperado, a chamada para seus contatos deve acontecer tranquilamente tanto por áudio quanto por vídeo. Perceba que o servidor do contato precisa ter suporte configurado também.
Outras coisas que podem atrapalhar são firewalls e também o Network Address Translation (NAT) de algumas redes. Mas pelo menos entre seus amigos, colegas e familiares no mesmo servidor tudo deve funcionar.
Testei esse tutorial através do WiFi de casa e dos dados móveis da minha operadora e tudo correu muito bem e com ótima qualidade, não deixando nada a desejar na comparação com soluções oferecidas por gigantes como Google.
Sem rastreadores. Sem anúncios. Sem paywall.
Se você gostou do conteúdo, considere pagar um cafezinho para o autor.
Este blog não mostra mais anúncios, nem conta com rastreadores ou paywall. De verdade. Não rouba seus dados e nem os vende. Ele conta apenas com a colaboração dos leitores.