Porta 3306 (MySQL): o que é, como testar e por que não expor

A porta 3306 é a porta padrão do MySQL — é por ela que qualquer aplicação conversa com o banco de dados. Quando o seu site em PHP faz uma consulta, ou quando você abre o DBeaver para olhar uma tabela, é na 3306 que a conexão bate.

Mas ela tem uma diferença importante em relação às outras portas conhecidas: a 3306 não deveria estar aberta para a internet. Enquanto a porta 443 precisa ficar aberta para o site funcionar, a 3306 exposta ao mundo é uma das falhas de segurança mais comuns — e mais exploradas — em servidores. Este guia explica o que é a porta 3306, como testar, como liberar o acesso remoto quando você realmente precisa, e por que na maioria dos casos você não precisa.

Resposta rápida

A porta 3306 (TCP) é a porta padrão do MySQL e também do MariaDB, reservada pela IANA. Para testar se está aberta: Test-NetConnection servidor -Port 3306 no Windows, ou nc -zv servidor 3306 no Mac e Linux. Regra de ouro: a 3306 não deve ficar aberta para a internet. Se a aplicação e o banco estão no mesmo servidor, ela nem precisa sair da máquina — o correto é bind-address = 127.0.0.1. Se você precisa de acesso remoto, prefira um túnel SSH pela porta 22.

O que é a porta 3306

Toda conexão de rede chega a um servidor por uma porta — um número que diz qual serviço deve atender. A porta 3306, no protocolo TCP, é onde o MySQL escuta.

É por ela que passa tudo que fala com o banco: o PHP do seu site, o Python da sua API, o phpMyAdmin, o DBeaver, o mysqldump do backup noturno. Quando você escreve uma string de conexão sem informar porta nenhuma, o cliente assume a 3306 sozinho.

Se você ainda está se situando, vale começar por o que é MySQL e o que é um banco de dados. Este artigo é sobre a porta — o canal por onde essa conversa acontece.

O MariaDB usa a mesma porta 3306

Um ponto que confunde bastante: o MariaDB também escuta na 3306.

Isso não é coincidência nem descuido. O MariaDB nasceu como um fork do MySQL, feito para ser compatível — a ideia era que qualquer aplicação escrita para MySQL funcionasse no MariaDB sem alterar uma linha. Manter a mesma porta faz parte disso.

Na prática, isso significa que você não descobre qual dos dois está rodando olhando a porta. Os dois atendem na 3306, os dois respondem ao mesmo cliente. Para saber qual é qual, é preciso perguntar ao servidor — o guia de como descobrir a versão do MySQL mostra como.

E tem uma consequência prática: os dois não podem rodar ao mesmo tempo na mesma máquina com a configuração padrão. O segundo a subir encontra a porta ocupada e falha.

Existe também a porta 33060 (e quase ninguém sabe)

A partir do MySQL 8.0, o servidor passou a escutar em duas portas por padrão.

A 3306 continua sendo a porta do protocolo clássico do MySQL, usado por praticamente tudo. Mas o MySQL 8 introduziu o X Protocol, um protocolo novo usado pelo MySQL Shell e por drivers modernos — e ele atende na porta 33060.

Por que isso importa na prática:

  • Se você rodar ss -tlnp num servidor com MySQL 8 e vir duas portas abertas, não é problema nem invasão. É o comportamento normal.
  • Se você liberou a 3306 no firewall e alguma ferramenta moderna ainda não conecta, pode ser que ela esteja tentando a 33060.
  • E a 33060 merece exatamente o mesmo cuidado da 3306: se você fechou uma para a internet e esqueceu a outra, não fechou nada.

Por que a porta 3306 não deve ficar aberta para a internet

⚠️ A regra mais importante deste artigo

Uma porta 3306 aberta para a internet significa que qualquer pessoa no mundo pode tentar se conectar ao seu banco de dados. Não a um site que consulta o banco — ao banco em si, direto, com todos os seus dados. Bots varrem a internet inteira procurando exatamente isso, e a cada varredura encontram centenas de milhares de servidores MySQL expostos. É assim que vazamentos acontecem sem que ninguém tenha “invadido” nada: a porta simplesmente estava aberta.

Compare com as outras portas do cluster e a diferença fica evidente:

Porta Serviço Deve ficar aberta para a internet?
443 HTTPS Sim — é o site funcionando
80 HTTP Sim — para redirecionar e renovar o SSL
22 SSH Só se precisar — de preferência restrita a IPs
3306 MySQL Quase nunca — o banco não conversa com o público

A lógica é simples: quem conversa com o visitante é o site, não o banco. O PHP roda no servidor, consulta o MySQL localmente e devolve a página pronta. O visitante nunca toca no banco — nem precisa. Se a aplicação e o banco estão na mesma máquina, a porta 3306 não tem motivo nenhum para sair dela.

Local ou remoto: a distinção que define tudo

Conexão local — aplicação e banco na mesma máquina. É o caso da maioria absoluta dos sites em hospedagem compartilhada. O hostname é localhost e a conexão nem passa pela rede: vai pela interface de loopback, ou por um socket Unix. A porta 3306 pode (e deve) ficar invisível para o mundo. Se quiser entender esse mecanismo, veja o que é localhost.

Conexão remota — a aplicação está num servidor e o banco em outro. Aí sim a 3306 precisa aceitar conexões de fora, mas de forma controlada: só dos IPs certos, nunca do mundo inteiro. Qual valor usar no hostname em cada caso está em MySQL host: qual hostname usar.

O bind-address: a configuração que quase ninguém conhece

Antes de mexer em firewall, existe uma linha no MySQL que decide se a porta 3306 sequer aparece na rede: o bind-address.

Ele fica no arquivo de configuração (/etc/mysql/my.cnf ou /etc/my.cnf) e diz em qual interface o MySQL escuta:

bind-address = 127.0.0.1 # só aceita conexões da própria máquina (seguro) bind-address = 0.0.0.0 # aceita de qualquer lugar (perigoso)

Com 127.0.0.1, o MySQL só escuta na interface local. Alguém de fora tentando conectar na 3306 nem chega ao banco: não há nada escutando naquele endereço. É a proteção mais forte, porque não depende de firewall nenhum.

Essa distinção resolve uma confusão frequente: “fechei a porta no firewall, então estou seguro”. Firewall é uma camada; o bind-address é outra, mais profunda. As duas juntas é o ideal — e se você não precisa de acesso remoto, o bind-address sozinho já resolve o problema na raiz.

Como testar se a porta 3306 está aberta

De fora, a partir do seu computador:

Windows (PowerShell): Test-NetConnection 200.151.24.50 -Port 3306 Mac / Linux: nc -zv 200.151.24.50 3306

Um detalhe interessante: se a porta responder, o MySQL costuma devolver um “cumprimento” com a versão do servidor, mesmo antes de qualquer login. É útil para diagnóstico — e é também um dos motivos para não deixá-la exposta: a porta aberta já entrega informação sobre o que está rodando ali.

De dentro do servidor, para ver o que está escutando e em qual interface:

sudo ss -tlnp | grep 3306

A leitura do resultado é o que importa:

  • 127.0.0.1:3306 — escutando só localmente. É o cenário seguro.
  • 0.0.0.0:3306 — escutando em todas as interfaces, exposto à rede. Confira se isso é mesmo necessário.

Teste conectando de verdade, o que valida porta, usuário e permissão de uma vez:

mysql -h 200.151.24.50 -P 3306 -u usuario -p

A forma certa de acessar o MySQL remotamente

Se o que você quer é abrir o DBeaver na sua máquina e olhar um banco que está no servidor, existe uma solução melhor do que abrir a 3306: o túnel SSH.

A ideia é elegante. Em vez de expor o banco, você usa a conexão SSH — que já existe e já é criptografada — como um cano: a porta 3306 da sua máquina passa a ser, na prática, a porta 3306 do servidor.

ssh -L 3306:localhost:3306 usuario@servidor

Com o túnel aberto, você configura o cliente para conectar em localhost:3306 — e a conexão sai pelo SSH, atravessa criptografada e chega ao banco do outro lado. Do ponto de vista do servidor, é uma conexão local, então o bind-address = 127.0.0.1 continua valendo e a 3306 continua fechada para o mundo.

Vantagens sobre abrir a porta: o tráfego vai criptografado, a autenticação é a do SSH na porta 22 (com chave, de preferência), e não há uma porta nova exposta. O DBeaver e o HeidiSQL inclusive têm essa opção embutida, na aba de SSH da conexão — o guia do DBeaver mostra a tela de configuração.

Se você realmente precisa liberar a 3306

Há casos legítimos: aplicação em um servidor e banco em outro, por exemplo. Nesse caso, libere para IPs específicos, nunca para todos:

Ubuntu/Debian: sudo ufw allow from 200.151.24.50 to any port 3306 CentOS/Rocky: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \ source address="200.151.24.50" port port="3306" protocol="tcp" accept' sudo firewall-cmd --reload

Repare que a regra tem um from: só aquele IP passa. Isso é diferente de ufw allow 3306, que libera para o mundo inteiro — e é justamente o comando que costuma aparecer em tutoriais apressados.

Além do firewall, é preciso ajustar duas coisas no MySQL: o bind-address (para ele escutar na interface externa) e a permissão do usuário, já que no MySQL o usuário é definido pelo par usuário + origem:

CREATE USER 'usuario'@'200.151.24.50' IDENTIFIED BY 'senha'; GRANT ALL PRIVILEGES ON meubanco.* TO 'usuario'@'200.151.24.50'; FLUSH PRIVILEGES;

⚠️ Evite o coringa 'usuario'@'%', que aceita conexões de qualquer origem. E se a sua hospedagem é compartilhada com cPanel, o caminho é outro — mais simples e sem mexer em firewall: veja como fazer acesso remoto ao MySQL, que mostra o procedimento pelo painel.

Problemas comuns na porta 3306

Erro Causa provável O que fazer
2003 - Can't connect (refused) MySQL parado, ou escutando só em 127.0.0.1 Confira o serviço e o bind-address
2003 com timeout Firewall barrando no caminho Libere o seu IP no firewall do sistema e no do painel
1045 - Access denied A porta está OK — é usuário, senha ou origem Confira o GRANT para o seu IP de origem
1130 - Host not allowed Chegou ao banco, mas o IP não tem permissão Crie o usuário com a sua origem no GRANT
Funciona local, falha remoto bind-address = 127.0.0.1 É o comportamento esperado — use um túnel SSH
MySQL não sobe Porta 3306 já em uso (MariaDB, ou outra instância) ss -tlnp | grep 3306 mostra quem ocupou

A distinção mais útil aqui é entre o 2003 e o 1045. O 2003 é problema de rede: a conexão não chegou. O 1045 é problema de credencial: chegou, o banco atendeu e recusou o login. Se você recebeu 1045, pare de mexer em firewall — a porta está funcionando.

Perguntas frequentes

O que é a porta 3306?
É a porta TCP padrão do MySQL, reservada pela IANA para o serviço. É por ela que aplicações, sites e ferramentas de administração se conectam ao banco de dados. O MariaDB, por ser compatível com o MySQL, também usa a mesma porta 3306.

A porta 3306 pode ficar aberta para a internet?
Não é recomendado, e na maioria dos casos é desnecessário. Uma porta 3306 aberta significa que qualquer pessoa no mundo pode tentar se conectar ao seu banco de dados — e bots varrem a internet exatamente à procura disso. Se a aplicação e o banco estão no mesmo servidor, o correto é usar bind-address = 127.0.0.1, para que o MySQL nem apareça na rede.

Como saber se a porta 3306 está aberta?
Do seu computador, use Test-NetConnection servidor -Port 3306 no PowerShell do Windows, ou nc -zv servidor 3306 no Mac e Linux. De dentro do servidor, sudo ss -tlnp | grep 3306 mostra se o MySQL está escutando e em qual interface: 127.0.0.1 significa apenas local, e 0.0.0.0 significa exposto à rede.

O MariaDB usa a mesma porta do MySQL?
Sim, os dois usam a porta 3306. O MariaDB é um fork do MySQL criado para ser compatível, e manter a mesma porta faz parte disso. Por consequência, os dois não podem rodar simultaneamente na mesma máquina com a configuração padrão: o segundo a iniciar encontra a porta ocupada e falha.

O que é a porta 33060?
É a porta do X Protocol, introduzido no MySQL 8.0 e usado pelo MySQL Shell e por drivers modernos. Um servidor MySQL 8 escuta nas duas portas por padrão: a 3306 para o protocolo clássico e a 33060 para o X Protocol. Ela merece os mesmos cuidados de segurança da 3306.

Como acessar o MySQL remotamente com segurança?
A forma mais segura é um túnel SSH, com o comando ssh -L 3306:localhost:3306 usuario@servidor. Assim o cliente conecta em localhost, a conexão trafega criptografada pelo SSH e o servidor a enxerga como local — sem precisar expor a porta 3306. Se realmente precisar abrir a porta, libere apenas para IPs específicos no firewall.

O que significa o erro 2003 do MySQL?
Significa que o cliente não conseguiu alcançar o servidor MySQL. Se vier como conexão recusada, o serviço está parado ou escutando apenas em 127.0.0.1. Se vier como timeout, um firewall está barrando o caminho. É diferente do erro 1045, em que a conexão chegou e foi recusada por credencial inválida.

Qual a diferença entre o erro 2003 e o 1045?
O 2003 é um problema de rede: a conexão não chegou ao banco, seja por serviço parado, bind-address ou firewall. O 1045 é um problema de credencial: a conexão chegou, o MySQL atendeu e negou o login por usuário, senha ou origem incorretos. Se você recebeu 1045, a porta está funcionando.

Seu banco de dados protegido por padrão

Na hospedagem da Homehost o MySQL já vem configurado para acesso local, com a porta 3306 fechada para a internet e liberação por IP quando você precisar. Sem bind-address, sem firewall — e sem banco exposto por engano.

Conhecer a hospedagem Homehost

Conclusão

A porta 3306 é a porta oposta à 443: enquanto uma precisa estar aberta para o site existir, a outra deve ficar fechada para o banco continuar seu. Três coisas valem guardar: o bind-address = 127.0.0.1 resolve o problema na raiz, sem depender de firewall, e é a configuração certa para a maioria dos sites; para acesso remoto, o túnel SSH entrega o mesmo resultado sem expor nada; e a distinção entre o 2003 (a conexão não chegou) e o 1045 (chegou e foi recusada) economiza horas de diagnóstico no lugar errado. Se você precisou abrir a 3306 para o mundo, quase sempre existe um caminho melhor.

Este artigo foi útil?

Obrigado pela resposta!
Picture of Gustavo Gallas

Gustavo Gallas

Analista de sistemas, formado pela PUC-Rio. Programador, gestor de redes e diretor da empresa Homehost. Pai do Bóris, seu pet de estimação. Gosta de rock'n'roll, cerveja artesanal e de escrever sobre assuntos técnicos.

Contato: gustavo.blog@homehost.com.br

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!