eturnal: chamadas de áudio e vídeo via XMPP

eturnal: como fazer chamadas de áudio e vídeo com seu servidor XMPP

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.

Prosody com botão de ligar através do servidor eturnal.
Prosody com botão de ligar através do servidor eturnal.

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.

Botão Doar com Mercado Pago