Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Guia: conexão recusada na porta 3306 do MySQL — causa e correção

16 min de leitura  ·  Guia técnico

Conexão recusada na porta 3306 ocorre quando o cliente MySQL não consegue estabelecer comunicação TCP com o servidor porque nenhum processo está escutando naquele endereço e porta. As causas mais frequentes são o serviço MySQL ou MariaDB parado, o parâmetro bind-address restrito ao localhost ou uma regra de firewall bloqueando o tráfego. Veja abaixo como diagnosticar e corrigir cada cenário com segurança.

Pré-requisitos

  • Acesso SSH com privilégios root ou sudo ao servidor
  • MySQL 8.0 ou MariaDB 10.6+ instalado (os comandos funcionam em ambos)
  • Sistema operacional: Debian 12, Ubuntu 22.04/24.04 LTS, Rocky Linux 9 ou AlmaLinux 9
  • Ferramentas de rede disponíveis: ss, telnet ou nc
  • Firewall ativo (UFW, firewalld ou nftables) — você precisará ajustar regras
  • Conhecimento básico de edição de arquivos com nano ou vim

Diagnóstico da conexão recusada na porta 3306 do MySQL

Antes de alterar qualquer configuração, é essencial identificar exatamente onde a cadeia de comunicação está quebrada. O erro connection refused na porta 3306 pode ter três origens distintas: serviço inativo, bind incorreto ou firewall bloqueando. Execute os passos abaixo em sequência para isolar a causa.

Passo 1 — Verificar se o serviço MySQL está ativo

O primeiro passo é confirmar se o daemon do banco de dados está em execução:

systemctl status mysql

Em distribuições que usam MariaDB, substitua mysql por mariadb:

systemctl status mariadb
Output esperado (serviço ativo):
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled)
     Active: active (running) since Mon 2025-01-20 10:32:15 UTC; 2h 14min ago

Se o status mostrar inactive (dead) ou failed, o serviço está parado. Inicie-o com:

systemctl start mysql

Para garantir que ele suba automaticamente após reinicializações:

systemctl enable mysql

Passo 2 — Verificar em qual endereço o MySQL está escutando

Com o serviço ativo, confirme se ele está vinculado à porta 3306 e em qual interface:

ss -tlnp | grep 3306
Output esperado (escutando em todas as interfaces):
LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=21))

Output esperado (restrito ao localhost):
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=21))

Se a saída estiver vazia, o MySQL está ativo mas não vinculado à porta 3306 — verifique o arquivo de configuração. Se aparecer 127.0.0.1:3306, conexões externas serão recusadas mesmo com o firewall liberado.

Passo 3 — Testar conectividade TCP a partir do cliente

No servidor ou na máquina cliente, use nc para testar se a porta responde:

nc -zv IP_DO_SERVIDOR 3306
Output quando a porta está aberta:
Connection to 203.0.113.10 3306 port [tcp/mysql] succeeded!

Output quando a porta está fechada ou bloqueada:
nc: connect to 203.0.113.10 port 3306 (tcp) failed: Connection refused

A diferença entre Connection refused (porta fechada no host) e Connection timed out (firewall descartando pacotes) ajuda a identificar se o problema é no serviço ou no firewall.

Corrigindo o bind-address para aceitar conexões remotas

O parâmetro bind-address controla em qual interface de rede o MySQL aceita conexões. Por padrão, muitas instalações definem 127.0.0.1, o que impede qualquer acesso externo mesmo que o firewall esteja liberado. Esta é a causa mais comum de connection refused em ambientes de produção.

Localizando o arquivo de configuração

O arquivo principal varia conforme a distribuição:

  • Debian 12 / Ubuntu 22.04 / Ubuntu 24.04: /etc/mysql/mysql.conf.d/mysqld.cnf
  • Rocky Linux 9 / AlmaLinux 9: /etc/my.cnf ou /etc/my.cnf.d/mysql-server.cnf
  • MariaDB (qualquer distro): /etc/mysql/mariadb.conf.d/50-server.cnf

Abra o arquivo com o editor de sua preferência:

nano /etc/mysql/mysql.conf.d/mysqld.cnf

Alterando o bind-address

Localize a linha com bind-address e ajuste conforme sua necessidade:

# Antes (restrito ao localhost):
bind-address = 127.0.0.1

# Opção 1 — Escutar em todas as interfaces (use com firewall restritivo):
bind-address = 0.0.0.0

# Opção 2 — Escutar apenas no IP privado do servidor (mais seguro):
bind-address = 10.0.0.5

Atenção: definir bind-address = 0.0.0.0 sem regras de firewall adequadas expõe o MySQL a toda a internet. Sempre combine esta configuração com restrições de IP no firewall, conforme descrito na próxima seção.

Após salvar o arquivo, reinicie o serviço para aplicar a mudança:

systemctl restart mysql

Confirme que o bind foi atualizado:

ss -tlnp | grep 3306
Output esperado:
LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=21))

Liberando a porta 3306 no firewall com segurança

Mesmo com o MySQL escutando em 0.0.0.0, o firewall do servidor pode estar descartando pacotes destinados à porta 3306. A abordagem correta é liberar o acesso apenas para IPs específicos, nunca para qualquer origem.

UFW (Ubuntu 22.04 / Ubuntu 24.04 / Debian 12)

Verifique o status atual do UFW:

ufw status verbose

Libere a porta 3306 apenas para o IP do cliente que precisa acessar o banco:

ufw allow from 203.0.113.50 to any port 3306 proto tcp

Aplique as regras:

ufw reload
Output esperado:
Firewall reloaded

Para verificar se a regra foi adicionada corretamente:

ufw status numbered
Output esperado:
     To                         Action      From
     --                         ------      ----
[ 1] 3306/tcp                   ALLOW IN    203.0.113.50

firewalld (Rocky Linux 9 / AlmaLinux 9)

No Rocky Linux 9 e AlmaLinux 9, o firewall padrão é o firewalld. Para liberar a porta 3306 para um IP específico:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
Output esperado:
success

Confirme a regra:

firewall-cmd --list-rich-rules

nftables (Debian 12 com configuração manual)

Se você usa nftables diretamente no Debian 12, adicione uma regra na chain de entrada:

nft add rule inet filter input ip saddr 203.0.113.50 tcp dport 3306 accept

Para tornar a regra persistente, salve o conjunto de regras:

nft list ruleset > /etc/nftables.conf

Criando permissão de usuário MySQL para acesso remoto

Mesmo com o bind correto e o firewall liberado, a conexão pode ser recusada em nível de autenticação do banco de dados. O MySQL verifica não apenas a senha, mas também o host de origem do usuário. Um usuário criado como 'app'@'localhost' não pode conectar remotamente — é necessário criar ou ajustar o grant para o IP do cliente.

Criando um usuário com acesso a partir de IP específico

Conecte ao MySQL localmente como root:

mysql -u root -p

Dentro do prompt do MySQL, crie o usuário com o host correto:

CREATE USER 'app_user'@'203.0.113.50' IDENTIFIED BY 'SenhaForte#2025';
GRANT ALL PRIVILEGES ON nome_do_banco.* TO 'app_user'@'203.0.113.50';
FLUSH PRIVILEGES;

Para verificar os grants do usuário:

SHOW GRANTS FOR 'app_user'@'203.0.113.50';
Output esperado:
+-----------------------------------------------------------------------------------+
| Grants for [email protected]                                                  |
+-----------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON `nome_do_banco`.* TO `app_user`@`203.0.113.50`           |
+-----------------------------------------------------------------------------------+

Se você precisa conectar remotamente via cPanel, consulte o artigo Conectando remotamente ao MySQL - cPanel para o procedimento específico do painel.

Alternativa segura: túnel SSH para acesso remoto ao MySQL

Para cenários onde a exposição da porta 3306 não é desejável — mesmo com restrição de IP — o túnel SSH é a alternativa mais segura. Ele encapsula o tráfego MySQL dentro de uma conexão SSH criptografada, sem necessidade de abrir a porta 3306 no firewall.

No terminal do cliente (Linux ou macOS), execute:

ssh -L 3307:127.0.0.1:3306 usuario@IP_DO_SERVIDOR -N

Este comando cria um túnel: a porta local 3307 do seu computador é redirecionada para a porta 3306 do servidor via SSH. Enquanto o túnel estiver ativo, conecte ao banco usando:

mysql -u app_user -p -h 127.0.0.1 -P 3307 nome_do_banco

Com esta abordagem, o bind-address pode permanecer em 127.0.0.1 e a porta 3306 não precisa ser aberta no firewall, reduzindo significativamente a superfície de ataque. Para configurar autenticação SSH por chave e tornar o processo mais prático, veja o artigo Acessando servidores VPS Linux da AviraHost.

Problemas comuns e como resolver

Sintoma: MySQL reinicia mas volta a recusar conexões externas

Causa: Existe um arquivo de configuração adicional com bind-address = 127.0.0.1 que sobrescreve o arquivo principal. No Debian/Ubuntu, o diretório /etc/mysql/conf.d/ e /etc/mysql/mysql.conf.d/ são carregados em ordem alfabética, e um arquivo secundário pode sobrescrever suas alterações.
Solução: Verifique todos os arquivos de configuração carregados com mysqld --print-defaults e identifique qual arquivo está definindo o bind-address indesejado. Edite ou remova a diretiva conflitante e reinicie o serviço.

Sintoma: Porta 3306 aparece aberta no ss mas a conexão ainda é recusada pelo cliente

Causa: O firewall está descartando os pacotes antes de chegarem ao MySQL. A diferença entre Connection refused (host rejeita ativamente) e Connection timed out (firewall descarta silenciosamente) pode confundir o diagnóstico.
Solução: Execute ufw status verbose ou firewall-cmd --list-all para verificar as regras ativas. Adicione a regra de liberação para o IP do cliente conforme descrito na seção de firewall acima. Se usar iptables diretamente, verifique com iptables -L INPUT -n -v | grep 3306.

Sintoma: Erro "Host 'x.x.x.x' is not allowed to connect to this MySQL server"

Causa: A conexão TCP foi estabelecida com sucesso, mas o MySQL rejeitou a autenticação porque o usuário não tem permissão para conectar a partir daquele host. Este erro é diferente de connection refused — ele ocorre após a porta ser alcançada.
Solução: Conecte localmente ao MySQL e verifique os usuários existentes com SELECT user, host FROM mysql.user WHERE user = 'nome_do_usuario';. Crie ou ajuste o grant para incluir o IP do cliente remoto conforme demonstrado na seção de permissões acima.

Sintoma: MySQL falha ao iniciar após alterar o bind-address

Causa: O endereço IP configurado no bind-address não existe nas interfaces de rede do servidor, ou há um erro de sintaxe no arquivo de configuração.
Solução: Verifique os logs de erro do MySQL com journalctl -u mysql -n 50 --no-pager ou consulte /var/log/mysql/error.log. Confirme que o IP configurado existe com ip addr show. Corrija o arquivo de configuração e reinicie o serviço.

Sintoma: Conexão funciona localmente mas falha de outro servidor na mesma rede privada

Causa: O bind-address está configurado para o IP público do servidor, mas a comunicação entre servidores ocorre pelo IP privado (ou vice-versa). O MySQL só aceita conexões na interface especificada.
Solução: Defina bind-address = 0.0.0.0 para escutar em todas as interfaces e use o firewall para restringir quais IPs podem conectar. Alternativamente, especifique o IP da interface de rede privada no bind-address.

Perguntas frequentes sobre conexão recusada na porta 3306

Por que a porta 3306 do MySQL aparece como connection refused?

A mensagem connection refused na porta 3306 indica que nenhum processo está escutando naquela porta no endereço solicitado. As causas mais comuns são: o serviço MySQL ou MariaDB está parado, o parâmetro bind-address está configurado para 127.0.0.1 (bloqueando conexões externas) ou o firewall do servidor está descartando pacotes destinados à porta 3306. Execute systemctl status mysql e ss -tlnp | grep 3306 para identificar rapidamente qual das três causas está ativa no seu servidor.

Como verificar se o MySQL está escutando na porta 3306?

Execute o comando ss -tlnp | grep 3306 no terminal do servidor. Se a saída estiver vazia, o serviço não está ativo ou não está vinculado à porta. Se aparecer 0.0.0.0:3306 ou :::3306, o MySQL está escutando em todas as interfaces; se aparecer 127.0.0.1:3306, está restrito ao localhost e conexões externas serão recusadas mesmo com o firewall liberado. Este comando é o diagnóstico mais rápido e deve ser o primeiro a ser executado.

É seguro abrir a porta 3306 do MySQL para a internet?

Não é recomendado expor a porta 3306 diretamente à internet sem restrição de IP. A prática segura é liberar a porta apenas para IPs específicos via firewall (UFW, firewalld ou nftables) ou usar um túnel SSH para conexões remotas. Expor o MySQL publicamente aumenta o risco de ataques de força bruta e exploração de vulnerabilidades conhecidas. Se precisar de acesso remoto frequente, o túnel SSH é a alternativa mais segura pois não requer abertura de nenhuma porta adicional.

Como liberar a porta 3306 no UFW sem expor o servidor?

Use o comando ufw allow from IP_DO_CLIENTE to any port 3306 proto tcp, substituindo IP_DO_CLIENTE pelo endereço IP que precisa acessar o banco. Isso libera a porta apenas para aquele IP específico, mantendo o acesso bloqueado para todos os demais. Após o comando, execute ufw reload para aplicar a regra e ufw status numbered para confirmar que ela foi adicionada corretamente.

O MySQL pode estar rodando mas ainda recusar conexão na porta 3306?

Sim. Mesmo com o serviço ativo, a conexão pode ser recusada se o bind-address no arquivo my.cnf estiver definido como 127.0.0.1, pois o MySQL só aceitará conexões originadas do próprio servidor. Além disso, o usuário do banco pode não ter permissão para conectar a partir do host remoto, gerando erro de autenticação após a conexão TCP ser estabelecida. Esses são dois problemas distintos que exigem correções diferentes: um no arquivo de configuração do MySQL e outro nos grants do usuário.

Conclusão

  • Diagnostique em ordem: verifique primeiro se o serviço está ativo (systemctl status mysql), depois o bind (ss -tlnp | grep 3306) e por último o firewall — essa sequência evita alterações desnecessárias.
  • Nunca exponha a porta 3306 sem restrição de IP: use ufw allow from IP_ESPECIFICO to any port 3306 ou prefira o túnel SSH para conexões remotas pontuais.
  • Combine bind-address + firewall + grants: as três camadas precisam estar alinhadas para que a conexão funcione — corrigir apenas uma delas não resolve o problema se as outras estiverem bloqueando.

Leia também

Precisa de ajuda com MySQL e banco de dados no servidor?

Configurar corretamente o acesso remoto ao MySQL envolve múltiplas camadas de segurança que podem ser complexas de ajustar sem experiência prévia. Os planos de VPS da AviraHost oferecem suporte técnico especializado e infraestrutura otimizada para aplicações que dependem de banco de dados com alta disponibilidade.

Conheça os planos de VPS da AviraHost

  • 0 Os usuários acharam isso útil
  • MySQL, porta-3306, banco-de-dados, firewall, AviraHost
Esta resposta foi útil?

Artigos Relacionados

Instalando painel de gerenciamento de hospedagem VirtualMin.

O virtualmin é um painel de gerenciamento de hospedagem de sites gratuito, que é suportado por...

Como usar a ferramenta oficial de acesso remoto do Windows no PC e celular

1. Pelo menu Iniciar, acesse os “Acessórios do Windows” e abra o “Conexão de Área de Trabalho...

Como acessar o painel de gerenciamento dos meus Serviços.

Para acessar o painel de gerenciamento do seu serviço basta seguir o passo á passo abaixo.   1....

Compreendendo o Servidor VPS: O que é e Como Funciona!

Um servidor VPS (Virtual Private Server) é uma solução de hospedagem na qual um servidor físico é...

Como trocar a senha do usuário root do servidor VPS ou Dedicado.

Para trocar a senha do usuário root em um servidor VPS da AviraHost, você pode seguir os...