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
rootousudoao 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,telnetounc - Firewall ativo (UFW, firewalld ou nftables) — você precisará ajustar regras
- Conhecimento básico de edição de arquivos com
nanoouvim
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.cnfou/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 3306ou 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
- Como otimizar o MySQL para alta performance em VPS Linux: guia completo
- Checklist para Migração de Banco de Dados MySQL: diagnóstico e prevenção de erros
- Passo a passo para configurar acesso remoto seguro ao MySQL em VPS Linux e servidor dedicado
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.