Como eu permito o acesso remoto do MySQL a um único IP estático?

7

Estou tentando habilitar o acesso remoto ao MySQL pela porta 3306, mas sem sorte. Recebi acesso root a uma máquina de produção para poder pegar arquivos e bancos de dados, trabalhá-los localmente e colocar versões modificadas de volta.

Meu acesso me permite acessar o SSH na caixa e permite FTP sobre SSH. Agora estou tentando obter o acesso do MySQL ao SSH. O MySQL está rodando (escutando localmente) e acessível na linha de comando e pode acessá-lo sem problemas.

Eu percebo que eu poderia simplesmente despejar o banco de dados, recuperar o arquivo localmente e executar minha modificação. No entanto, no futuro eu provavelmente precisarei mudar algumas coisas, e prefiro não ter que fazer isso na linha de comando, pois é mais rápido através de uma GUI. Ou seria se eu pudesse me conectar como quero.

    
por Codecraft 22.01.2012 / 19:27

6 respostas

3

EDIT: Para as instruções abaixo, se você estiver usando o Windows, há duas coisas a serem lembradas:

1) Altere localhost para 127.0.0.1 , pois o Windows não tem essa configuração automática em %SystemRoot%\system32\drivers\etc\hosts .

2) Você pode usar o comando pouco conhecido plink.exe ferramenta de linha do conjunto de ferramentas PuTTY ; ele usa a mesma sintaxe para opções como o comando ssh , então se você substituir ssh nos exemplos abaixo com plink.exe , tudo deve funcionar.

Você desejará usar um túnel SSH para encaminhar uma porta local em seu cliente para a porta mysql no servidor. Você pode fazer isso com:

% ssh -f -N -L3306:localhost:3306 username@remoteserver
% mysql -h remoteserver -u mysqluser -p

As opções para ssh significam:

-f Requests ssh to go to background just before command execution.
-N Do not execute a remote command.
-L [bind_address:]port:host:hostport
   Specifies that the given port on the local (client) host is to be 
   forwarded to the given host and port on the remote side.

Usar -f -N também significa que você terá bifurcado um processo ssh em segundo plano, em vez de permanecer conectado ao host remoto da maneira que normalmente faria quando conectado a um shell remoto. Se você quiser derrubar o túnel, você pode matar o processo ssh no seu cliente assim:

% pgrep -fl ssh
11145 ssh -f -N -L3306:localhost:3306 username@remoteserver
% kill -9 11145

É claro que, neste caso, 11145 é o PID do processo ssh, que será diferente toda vez que você iniciar um novo processo ssh para abrir um túnel.

Além disso, suponha que você não tenha o servidor mysql também em execução no seu cliente. Em caso afirmativo, você precisará alterar a porta local a qual você se liga assim:

% ssh -f -N -L3333:localhost:3306 username@remoteserver
% mysql -P 3333 -h remoteserver -u mysqluser -p

A porta 3333 é arbitrária; você pode escolher qualquer número de porta livre que seu cliente tenha.

    
por 23.01.2012 / 07:34
4

Usar -s 192.168.100.0/24 significa que você permite acesso somente à porta 3306 remotamente para faixas de IP correspondentes a 192.168.100.0/24, que é uma rede interna privada. Isso é realmente o que você pretende fazer? Caso contrário, esse é o problema porque conexões remotas de outros IPs não funcionam.

Você também não precisa da regra de saída.

Se isso não ajudar, forneça um pouco mais de informações sobre onde você está testando, IPs / interfaces da máquina, o que acontece e talvez uma saída completa de iptables -vnL para nós?

Editar 1 :
Com base em mais informações, mostra que o exemplo usado como modelo foi mal entendido, você tem que remover o intervalo de IP de origem (porque você quer permitir todos remotamente). Basta digitar isso, e apenas isso, e deve funcionar:

iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Se você deseja incluir seu IP externo, ele deve ser o IP de destino, como:

    iptables -A INPUT -i eth0 -p tcp -d xx.xx.xx.xx --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

-s , como na origem, é usado apenas se você quiser limitar o acesso de intervalos de IP específicos.

Editar 2 :
Não parece ser uma questão do iptables, mas mais de um mySQL. Para permitir que o mySQL ouça conexões remotas, certifique-se de configurá-lo para ouvir seu endereço externo. Edite /etc/mysql/my.cnf e verifique a instrução bind-address e altere-a para:

bind-address = xx.xxx.xx.xx

Você optou por substituir xx.xx.xx.xx pelo seu endereço IP externo ou pode configurá-lo para ouvir 0.0.0.0 , o que significa que ele ouvirá todas as interfaces.

Depois disso, a questão para você é como configurar o firewall inteiro para o seu servidor. Você bloqueia manualmente todas as portas específicas que ninguém mais deveria conseguir, ou precisa definir uma política padrão para rejeitar o tráfego e, em seguida, abrir manualmente a porta pela porta (como sua pergunta inicial indicou) para os serviços que você deseja permitir. Seja MUITO cuidado com isso, porém, se for uma máquina remota, é muito fácil bloquear a si mesmo se você colocar as coisas na ordem errada ou na maneira errada.

    
por 22.01.2012 / 19:34
1

A opção -A para iptables adiciona as novas regras ao final da cadeia. É provável que você tenha uma regra anterior que está negando o acesso e com o iptables a primeira partida vence. Tente usar a opção -I para inserir a regra no início da cadeia.

Se isso não funcionar, mostre a saída de iptables -L -v -n como edição para sua pergunta.

    
por 22.01.2012 / 19:35
1

Sua política padrão para INPUT e OUTPUT é ACCEPT. Você não definiu nenhuma regra para eliminar ou rejeitar pacotes. Isso significa que seu firewall não está bloqueando nenhuma conexão.

O problema é outro.

Use netstat -tan | grep LISTEN para ter certeza de que você está executando o MySQL e que ele está escutando.

Se isso funcionar, provavelmente há outro firewall em algum lugar que esteja bloqueando a conexão.

    
por 22.01.2012 / 20:14
1

Eu encontrei uma resposta para minha própria pergunta (eu deveria ter esclarecido que eu estava usando o Windows 7 localmente e o Linux remotamente).

De qualquer forma, a resposta foi encaminhar uma porta usando o PuTTy, conforme o outro respondente - mas isso é para usuários do Windows.

No PuTTy, configure uma conexão SSH normalmente, mas depois vá para configurações de túneis, em SSH, escolha uma porta arbitrária (usei 5555) localmente para encaminhar para 127.0.0.1:3306

Abra a sessão SSH e faça login normalmente.

Em seguida, no seu cliente MySQL, configure o endereço do host para 127.0.0.1 e a porta para o seu selecionado (5555).

Assim, o cliente MySQL está se conectando à sua máquina local, que por sua vez está sendo encaminhada através do SSH para 3306 na máquina remota e permitindo a conexão.

GRANDE NOTA: Na verdade, tivemos essa configuração usando o termo localhost (como você faz) em vez de 127.0.0.1, em algum lugar entre PuTTy e o cliente MySQL, isso não resolveu - então parece que você deve usar o endereço de loopback!

    
por 23.01.2012 / 12:36
0

Muito obrigado! Eu estava tentando todos os tipos de lixo para poder usar o MySQL Workbench remotamente para trabalhar nas tabelas na minha implementação do CentOS MySQL. Basicamente, a única solução era abrir a porta 3306 para todos (ruim para segurança).

Nós já usamos o Putty para acesso seguro à linha de comando ao nosso servidor e não tínhamos ideia de que poderíamos montar um túnel como este. Basicamente, podemos usar nossa conexão SSH segura existente para conectar o MySQL Workbench ao nosso servidor. Obrigado ! ! !

    
por 29.03.2013 / 03:59

Tags