Ir para o conteúdo

Servidor de retransmissão (TURN)

As ligações puramente ponto a ponto por vezes não conseguem estabelecer-se, por causa de firewalls ou de NAT em casa de um dos utilizadores ou de todos. Para o resolver e atravessar as firewalls mais renitentes, podem ser instalados um ou vários servidores TURN (Traversal Using Relay NAT).

Utilizamos o coturn (github.com/coturn/coturn) para os nossos servidores TURN, como a maioria dos fabricantes, entre os quais o Slack e o Zoom. O coturn funciona igualmente como servidor STUN, encarregue de responder à questão «qual é o meu endereço IP público».

Máquina dedicada

Desaconselhamos a implantação de um servidor TURN na máquina que já aloja o Drovio Server, por razões de segurança e de desempenho.

Instalar em Debian

O coturn está empacotado para Debian, sendo que a versão 13 traz uma versão praticamente atual, e funciona tanto em x64 como em arm64, sendo os comandos abaixo idênticos em ambos. Passo a passo, numa máquina Debian 13 acabada de instalar:

sudo apt update
sudo apt install coturn
sudo nano /etc/default/coturn
  • Descomente TURNSERVER_ENABLED=1 e guarde.
  • Abra o ficheiro de configuração, ver Configurar o coturn abaixo:
sudo nano /etc/turnserver.conf

Instalar em RHEL

O coturn está disponível através do EPEL em RHEL 9 e 10. Passo a passo:

sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install coturn

O primeiro comando ativa o EPEL, aqui na sua versão para RHEL 9: adapte o URL à sua versão.

Abra em seguida o ficheiro de configuração, ver Configurar o coturn abaixo:

sudo nano /etc/coturn/turnserver.conf

Configurar o coturn

Altere turnserver.conf como se segue.

Escuta e rede:

  • listening-port e tls-listening-port devem valer 80 e 443 em vez das portas predefinidas, a fim de atravessar a maioria das firewalls.
  • listening-ip: o IP público, ou o IP privado se estiver atrás de um NAT, por exemplo em AWS EC2.
  • relay-ip: idêntico a listening-ip.
  • external-ip: o IP público, unicamente quando listening-ip é um endereço privado atrás de um NAT.
  • min-port=49152 e max-port=65535: o intervalo de portas UDP que o coturn aloca ao tráfego retransmitido. Abra este intervalo em UDP na sua firewall.

Autenticação:

  • fingerprint deve estar descomentado.
  • static-auth-secret=MySeCrEt: substitua por uma longa cadeia aleatória. É o segredo partilhado entre o Drovio Server e o coturn.
  • realm=turn.example.com: a substituir; este valor não precisa de resolver para o que quer que seja.
  • stale-nonce=600 deve estar descomentado.

Largura de banda:

  • max-bps: número máximo de bytes por segundo e por sessão. Comente a linha para não a limitar, ou fixe-a pelo menos no débito máximo configurado em settings.conf, sob webrtc.service_quality.maximum. Atenção, max-bps exprime-se em bytes por segundo enquanto webrtc.service_quality.maximum se exprime em kbits por segundo: o valor predefinido de 10 Mbps corresponde a 1 250 000 bytes por segundo.

TLS (facultativo, para o suporte de TURNS):

  • cert e pkey devem designar o seu certificado e a sua chave privada. Se não precisar de TURNS, salte esta parte e utilize apenas a porta 80 ao designar este servidor, ver Configurar o Drovio Server.
  • Preencha cipher-list com "ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM".
  • no-tlsv1 e no-tlsv1_1 devem estar descomentados.

Endurecimento:

  • no-multicast-peers deve estar descomentado. allow-loopback-peers deve permanecer comentado, sendo o loopback recusado por predefinição desde o coturn 4.5.2.
  • no-tcp-relay deve estar descomentado: o Drovio só utiliza a retransmissão UDP, e desativar a retransmissão TCP reduz a superfície de ataque.
  • denied-peer-ip=0.0.0.0/8, denied-peer-ip=10.0.0.0/8, denied-peer-ip=172.16.0.0/12, denied-peer-ip=192.168.0.0/16 e denied-peer-ip=127.0.0.0/8: impedem o tráfego retransmitido de atingir as redes privadas ou de loopback.
  • no-software-attribute deve estar descomentado, o que oculta a versão do coturn nas respostas.
  • no-rfc5780, no-stun-backward-compatibility e response-origin-only-with-rfc5780 devem estar descomentados. Desativam funções STUN herdadas, inúteis aqui, e reduzem a exposição.

Provavelmente também quererá isolar este servidor na sua própria rede ou VPC.

Interface de linha de comandos:

  • cli-ip=127.0.0.1, cli-port=5766 e cli-password=myclipassword: mude a palavra-passe. Esta interface serve para verificar os pares ligados, lançando telnet localhost 5766, introduzindo a palavra-passe e depois ps. Não exponha esta porta para o exterior.

Guarde e reinicie em seguida o coturn:

sudo systemctl restart coturn

O seu servidor de retransmissão TURN, e STUN, está agora operacional.

Configurar o Drovio Server

De volta à sua instância Drovio Server:

sudo nano /etc/drovio-server/settings.conf

Localize webrtc, substitua turn_servers_secret pelo valor de static-auth-secret definido acima e adapte a configuração seguinte às suas necessidades, tendo o cuidado de substituir o URL turn.example.com pelo URL ou pelo IP da sua máquina coturn:

"webrtc": {
  "turn_servers_secret": "MySeCrEt",
  "turn_servers_auth_timeout": 300,
  "ice_servers": [
    { "url": "stun:turn.example.com:443" },
    { "url": "turn:turn.example.com:443" },
    { "url": "turn:turn.example.com:443?transport=tcp" },
    { "url": "turns:turn.example.com:443" }
  ],
  "service_quality": {
    "minimum": 1000,
    "maximum": 10000
  }
}
  • A primeira entrada é o STUN, que apenas responde aos pedidos «qual é o meu endereço IP».
  • A segunda é o TURN clássico em UDP na 443, sem camada TLS.
  • A terceira é o TURN em TCP na 443, sem camada TLS.
  • A quarta é o TURNS em UDP na 443, com uma camada TLS suplementar.

Isto deverá funcionar com a maioria das firewalls renitentes. A secção webrtc aplica-se a quente, não havendo portanto nada a reiniciar: as novas retransmissões são tidas em conta em poucos segundos.

Verificar o servidor de retransmissão

Para verificar que o servidor de retransmissão funciona corretamente:

  1. Lance o Firefox.
  2. Introduza about:config na barra de endereços, aceite e continue.
  3. Na barra de pesquisa, escreva relay.
  4. Passe media.peerconnection.ice.relay_only para true.
  5. Abra a aplicação Drovio e inicie sessão.
  6. Utilize o ícone em forma de envelope e clique em Invite by URL.
  7. Cole a hiperligação do convite no Firefox e prossiga.
  8. Introduza um nome de apresentação, sem escolher lançar a aplicação, e prossiga no navegador.
  9. Deverá ver o seu próprio ecrã, em espelho quando olha para o ecrã partilhado.
  10. Abra um novo separador no Firefox, sem fechar o anterior, e introduza about:webrtc.
  11. Clique em Show details.
  12. Deverá ler ICE State: succeeded, nominated: true, selected: true, e ver relay mencionado ao lado do seu endereço IP, em vez de host, srflx ou prflx.

Reponha a definição

Não se esqueça de voltar a passar media.peerconnection.ice.relay_only para false.