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.
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 -tlnpnum 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
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.
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 HomehostConclusã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.