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.1aceita apenas o próprio computador, e o endereço0.0.0.0aceita 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.