FolioPierEstudos de TI

Escutar e conectar: bind e interfaces (Transporte)

Nota 19 de 54 · 4 min de leitura
Nesta página
  1. Todo servidor escolhe onde escutar
  2. O bind no banco de dados MySQL
  3. Por que o problema passa despercebido
  4. Como verificar
  5. Os dois erros espelhados

Um serviço pode estar em execução e, ainda assim, não aceitar conexões vindas da rede. O motivo, muitas vezes, está no endereço em que o serviço escuta.

Todo servidor escolhe onde escutar

Um programa servidor não abre uma porta no computador como um todo. O programa se vincula a um endereço específico e a uma porta, e esse vínculo se chama bind, palavra inglesa que significa ligar ou vincular. O bind é uma configuração do programa, mas define em qual endereço e em qual porta a camada de Transporte aceita conexões para ele. Três situações são comuns:

  • 0.0.0.0:3306: o serviço escuta em todas as interfaces do computador e fica acessível pela rede;
  • 192.168.1.10:3306: o serviço escuta apenas na interface com esse endereço e fica acessível pela rede por meio dela;
  • 127.0.0.1:3306: o serviço escuta apenas no loopback e fica inacessível para os outros computadores.

Nesse contexto, o endereço 0.0.0.0 significa qualquer endereço do próprio computador.

Um serviço vinculado a um endereço específico depende desse endereço. Se o endereço do servidor mudar, o serviço pode deixar de iniciar ou deixar de aceitar conexões.

O bind no banco de dados MySQL

No banco de dados MySQL, o endereço de escuta é definido pela opção bind-address, no arquivo de configuração do servidor, que no Windows se chama my.ini. Com o valor 127.0.0.1, o banco de dados funciona no próprio servidor e recusa as conexões das estações. Com a opção skip-networking, o MySQL nem abre a porta TCP. Depois de qualquer alteração no arquivo de configuração, o serviço do MySQL precisa ser reiniciado para que a mudança tenha efeito.

Por que o problema passa despercebido

Um serviço vinculado a 127.0.0.1 funciona perfeitamente no próprio computador, e quem testa no servidor vê tudo certo. Nenhuma correção na rede resolve o problema: firewall liberado, encaminhamento de porta, endereço fixo, cabo, switch e Internet funcionando. O serviço simplesmente não aceita conexões vindas de fora.

Como verificar

No servidor, o comando a seguir mostra em qual endereço o serviço escuta na porta 3306:

  • netstat -ano | findstr :3306

Na coluna do endereço local, três resultados são comuns:

  • TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 3120: o serviço escuta em todas as interfaces e atende as estações;
  • TCP 192.168.1.10:3306 0.0.0.0:0 LISTENING 3120: o serviço escuta apenas no endereço de rede do servidor e também atende as estações;
  • TCP 127.0.0.1:3306 0.0.0.0:0 LISTENING 3120: o serviço escuta apenas no loopback, e só o próprio servidor consegue se conectar.

A palavra LISTENING indica que o serviço está à espera de conexões, e o último número identifica o processo, que pode ser localizado no Gerenciador de Tarefas. Nos três casos, o programa está em execução e a porta aparece aberta. A diferença está apenas no endereço local.

Os dois erros espelhados

  • Cliente configurado com 127.0.0.1: a estação tenta se comunicar consigo mesma e nunca alcança o servidor. O erro aparece no arquivo de configuração do sistema, na estação.
  • Servidor escutando em 127.0.0.1: nenhum computador de fora consegue se conectar. O erro aparece no endereço local exibido pelo netstat, no servidor.

No suporte

Quando o sistema funciona no servidor e não funciona nas estações, o sintoma é clássico de serviço escutando apenas no loopback. Antes de alterar o firewall, convém conferir o netstat no servidor.

Para guardar

  • O bind é o endereço em que o serviço aceita conexões.
  • O endereço 127.0.0.1 aceita apenas o próprio computador, e o endereço 0.0.0.0 aceita conexões em todas as interfaces.
  • O serviço vinculado ao endereço de rede do servidor também atende as estações, mas depende desse endereço.
  • No MySQL, o bind fica na opção bind-address, e o serviço precisa ser reiniciado após a alteração.
  • O netstat no servidor mostra em qual endereço o serviço escuta.
No servidor, o comando netstat -ano | findstr :3306 mostra TCP 127.0.0.1:3306 com o estado LISTENING. O banco de dados está em execução. Por que as estações não conseguem se conectar?

Porque o MySQL está vinculado apenas ao loopback, e só o próprio servidor alcança a porta. É preciso ajustar a opção bind-address do servidor e reiniciar o serviço. Alterações no firewall ou na rede não resolvem.

Depois de uma troca de endereço do servidor da loja, o serviço do banco de dados deixou de iniciar. O arquivo de configuração ainda indica o endereço antigo na opção bind-address. Qual é a relação entre os dois fatos?

O serviço estava vinculado a um endereço específico, que deixou de existir no computador. Sem esse endereço, o serviço não consegue abrir a porta. A solução é ajustar o bind-address para o novo endereço ou para 0.0.0.0 e reiniciar o serviço.

Publicado a partir do Obsidian · FolioPier