Não consigo conectar ao MySql pela internet

Bem, estou fazendo uma aplicação java que irá acessar um banco de dados em um servidor na web…
O servidor esta com Ubuntu Linux, Apache 2 e o MySql 5, ja configurei o apache e esta tudo ok, quando uma maquina cliente acessa o http://ip-do-server:porta ele mostra a mensagem de Its Works!, porem na hora que a aplicação vai logar no banco de dados ela simplismente trava…segue o trecho do código:

			Connection conn = null;

			Cadastro cad = null;

			try {

				Class.forName("com.mysql.jdbc.Driver");

			} catch (ClassNotFoundException e1) {

				JOptionPane.showMessageDialog(null, "Erro ao abrir o driver do mysql");
				System.exit(-1);
			}

			try{

			conn = DriverManager.getConnection("jdbc:mysql://IP-DO-SERVIDOR/Teste?user="+t_login.getText()+"&password="+t_senha.getText());

			}catch(com.mysql.jdbc.exceptions.jdbc4.CommunicationsException a){

				JOptionPane.showMessageDialog(null, "Erro ao conectar ao mysql");

				System.exit(-1);

			}catch(java.sql.SQLException b){

				JOptionPane.showMessageDialog(null, "Erro ao logar no banco de dados");

				System.exit(-1);

			}

Quando a pessoa clica no botão de logar da interface que fiz, ele executa esse trecho ai e simplesmente trava…ja editei o /etc/mysql/my.cnf, comentei a linha “bind-address = 127.0.0.1” e tudo que tinha “port” eu mudei para uma porta aberta no meu modem…to procurando uma solução a um tempo e não acho, se alguem ai puder ajudar

  1. Para formatar seu código use sempre as tags [code] e [/code] e não as tags [quote] e [/quote].

  2. Qdo “trava” lança alguma exceção? caso sim poste a exceção completa lançada no console.

Ah sim, nao tinha visto o [code]…é o custume com o [quote ]

e eu resolvi o problema agora a pouco…nao gerava uma exceção tipo “link failure”…eu descobri que era o iptables q tava instalado no servidor e tava bloqueando…agora ta funcionando beleza, valeu pela atenção!

ah, e isso foi para conectar via rede interna…mais tarde vou testar pela internet mesmo e respondo aqui

Provavelmente você não vai conseguir acessar um banco de dados diretamente pela Internet.

Os provedores de acesso costumam bloquear as portas mais famosas (1433 para o SQL Server, 3306 para o MySQL, 5000 para o Sybase, 1521 para o Oracle) justamente para que você não ponha diretamente um banco na Web e seja vítima de hackers.

O que se costuma fazer é disponibilizar alguma transação (web service, servlet etc.) que atenda em uma das portas padrão (80, 443, 8080), e que se comuniquem com seu banco de dados.

Se você desbloqueou o MySQL reconfigurando o iptables, vou lhe dar alguns dias (ou talvez horas) para que seu banco seja invadido. É inevitável; portanto, nunca deixe um servidor de banco de dados atendendo diretamente na Internet.

thingol, eu liberei a porta 3306 no router…se mesmo assim não funcionar será que colocando outra porta para o mysql funcionaria?

Hum… como é que estão configuradas as coisas?

  • A aplicação Web (que roda sob o Apache) consulta um banco MySQL (que está rodando na mesma máquina) ?
    Nesse caso você pode configurar o MySQL de forma que ele só possa ser acessível por aplicações rodando nessa máquina, mas não pela Internet. Isso deve ser uma configuração no IPTABLES.

  • A aplicação Web consulta um banco MySQL que está rodando em uma máquina separada, mas que está fora da Internet.
    Nesse caso você tem de configurar o IPTABLES da máquina do MySQL de forma que não aceite conexões da Internet, só dessa máquina que roda a aplicação Web.

  • A aplicação Web consulta um banco MySQL que está rodando em uma máquina separada (fica até em outro lugar físico), que está na Internet por algum motivo.
    Se essa máquina estiver na Internet, ela tem de ser acessada via VPN; ela não pode estar na Internet senão por alguns breves momentos, depois dos quais ela terá fatalmente sido hackeada.

Esse tipo de coisa requer um administrador de redes experiente; não faça as coisas sem saber (e principalmente “chutando”). Se você ficar “chutando” é bem capaz de acabar sendo hackeado.

É o seguinte: estou desenvolvendo um aplicativo em JAVA que acessa o MySql, porém esse acesso será da seguinte forma: uma máquina X roda o aplicativo, e a máquina Y contem o banco de dados…inicialmente esse acesso se dará pela rede interna apenas…mas pode evoluir e ser via internet, ou seja, várias máquinas acessariam a maquina Y que esta rodando em outro local, via internet. Realmente via VPN seria mais seguro, tinha pensado nessa possibilidade caso fosse impossível um acesso direto pela internet, mas caso isso seja necessário vou utilizar sim uma VPN.

Uma coisa que sei é que mesmo via VPN é MUITO LENTO você acessar uma máquina de banco de dados pela Internet.
Ela deve sempre estar em uma rede interna e separada da Internet.

O problema é que a pessoa que quer esse programa pede um “sistema integrado”…no fundo o que ele quer é acessar o banco de qualquer computador…

Normalmente, quando se quer isso com segurança, você tem as seguintes opções:

  • Cria uma servlet ou web service para disponibilizar algumas transações que acessam o banco
    ou
  • Acessa o banco apenas via VPN.

O acesso via VPN costuma ser mais lento, porque para cada acesso ao banco (como ler um simples registro) é necessário efetuar uma requisição TCP, transformá-la no protocolo interno da VPN, enviá-la ao servidor de VPN, que por sua vez irá transferir essa requisição TCP, chamar o banco de dados e ele, por sua vez, irá fornecer os dados, etc. etc. etc. Mas como o protocolo da VPN costuma compactar dados, pelo menos o tráfego não é tão grande assim.
Ao passo que, usando uma servlet ou web service, você irá efetuar uma requisição e receber uma resposta grande de uma vez, tipicamente usando um protocolo como http ou https.

Agora, ninguém em sã consciência deixa um banco atendendo na porta 3306 na Internet sem proteção nenhuma. Isso costuma dar problemas muito sérios, como furto, corrupção de dados ou outras coisas mais graves.

[quote=thingol]Normalmente, quando se quer isso com segurança, você tem as seguintes opções:

  • Cria uma servlet ou web service para disponibilizar algumas transações que acessam o banco
    ou
  • Acessa o banco apenas via VPN.

O acesso via VPN costuma ser mais lento, porque para cada acesso ao banco (como ler um simples registro) é necessário efetuar uma requisição TCP, transformá-la no protocolo interno da VPN, enviá-la ao servidor de VPN, que por sua vez irá transferir essa requisição TCP, chamar o banco de dados e ele, por sua vez, irá fornecer os dados, etc. etc. etc. Mas como o protocolo da VPN costuma compactar dados, pelo menos o tráfego não é tão grande assim.
Ao passo que, usando uma servlet ou web service, você irá efetuar uma requisição e receber uma resposta grande de uma vez, tipicamente usando um protocolo como http ou https.

Agora, ninguém em sã consciência deixa um banco atendendo na porta 3306 na Internet sem proteção nenhuma. Isso costuma dar problemas muito sérios, como furto, corrupção de dados ou outras coisas mais graves. [/quote]

desculpa a ignorância, e reviver um tópico antigo mas, quando se diz, deixar na porta 3306 sem proteção nenhuma, de que proteção estamos falando?

abrass vlw