Não foi possível conectar-se à instância do RDS de fora da VPC (ERROR 2003 (HY000) Não é possível conectar-se ao MySQL Server)

12

Eu criei uma VPC e, dentro dela, uma instância do RDS. A instância do RDS é acessível ao público e suas configurações são as seguintes:

Configurações de RDS

O grupo de segurança conectado à instância do RDS aceita todo o tráfego:

Configurações do grupo de segurança

Todas as ACLs da minha rede aceitam todos os tráfegos. No entanto, não consigo acessar minha instância de uma máquina fora da minha VPC. Estou tendo o erro a seguir:

    root@vps151014:~# mysql -h mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com -P 3306 -u skullberry -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on 'mysql1.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com' (110)

Se eu executar o mesmo comando de um EC2 dentro da minha VPC, eu posso conectar. Eu tentei conectar a partir de várias máquinas, todas elas sem um firewall (porta 3306 aberta).

Obviamente, estou perdendo alguma coisa, mas tudo parece estar configurado corretamente. Qual poderia ser o problema?

dazedviper
fonte
1
A (110)mensagem na mensagem de erro significa "tempo limite da conexão esgotado", então esse é definitivamente um problema de conectividade IP. Sua instância do RDS mostra estar associada a duas sub-redes. No console da VPC, qual é a rota padrão dessas duas sub-redes? É um "igw-xxxxxxxx" ou é um "i-xxxxxxxx"?
Michael - sqlbot
Ambas as sub-redes estão implicitamente associadas à tabela de rotas principal da VPC.
Davidviper
1
A associação explícita de ambas as sub-redes a uma tabela de rotas personalizada que roteia todo o tráfego de saída para o gateway da Internet da VPC não faz nenhuma diferença.
Davidviper
1
Bem, isso é uma chatice. A rota padrão para o "igw" parecia a peça que faltava mais provável ... e, em qualquer caso, seria necessário para que isso funcionasse. Supondo que você tenha dado tempo suficiente à VPC para se reconfigurar em segundo plano depois de alterar as configurações de sub-rede adequadamente, estou sem ideias.
Michael - sqlbot
2
Ah, o bloco que você precisa para todos os endereços IP é 0.0.0.0/0. Vou postar a resposta.
Michael - sqlbot

Respostas:

20

Para que uma instância do RDS na VPC seja acessível "publicamente" (Internet), todas as sub-redes às quais está conectada devem ser sub-redes "públicas" - em oposição a "privadas" - da VPC.

Uma sub-rede pública é essencialmente definida como uma sub-rede que tem o objeto Gateway da Internet (igw-xxxxxxxx) como sua rota para "a Internet" ou pelo menos para qualquer destino da Internet que você precise acessar. Normalmente, este é um endereço de destino de 0.0.0.0/0. As sub-redes públicas devem ser usadas para instâncias (incluindo o RDS) que terão um endereço IP público associado e não devem ser usadas para instâncias que não terão endereços IP públicos, pois os endereços privados não funcionam na Internet sem tradução.

Uma sub-rede privada, por outro lado, tem sua tabela de roteamento configurada para alcançar destinos da Internet através de outra instância do EC2, normalmente uma instância do NAT. Isso é mostrado na tabela de rotas da VPC associada a essa sub-rede como i-xxxxxxxx, em vez de "igw". Essa máquina (que, por si só, estará em uma sub-rede diferente daquela para a qual atua como destino de rota) serve como tradutora, permitindo que as instâncias apenas com IP privado façam solicitações de Internet de forma transparente usando o público da máquina NAT IP para suas necessidades de Internet. Instâncias com um endereço IP público não podem interagir corretamente com a Internet se estiverem conectadas a uma sub-rede privada.

No caso específico, aqui, as sub-redes associadas à instância do RDS não eram realmente configuradas como algo que poderia ser simplesmente classificado como uma sub-rede pública ou privada, porque a sub-rede não tinha nenhuma rota padrão. Adicionar uma rota padrão através do objeto "igw" ou, como fez o OP, adicionar uma rota estática ao endereço IP da Internet onde a conectividade era necessária, na tabela de rotas da VPC para as sub-redes, corrige o problema de conectividade.

No entanto ... Se você tiver um problema semelhante, não poderá simplesmente alterar a tabela de rotas ou criar novas tabelas de rotas e associar as sub-redes a elas, a menos que você não tenha mais nada funcionando corretamente nas sub-redes, porque a alteração pode ser razoavelmente razoável. espera quebrar a conectividade existente. O curso correto, nesse caso, seria provisionar as instâncias em diferentes sub-redes com as entradas corretas da tabela de rotas.

Ao configurar uma VPC, é ideal definir claramente as funções de sub-rede e provisionar totalmente as rotas necessárias quando o VPC for comissionado pela primeira vez. Também é importante lembrar que toda a "LAN" da VPC é uma rede definida por software. Diferente de uma rede física, na qual o roteador pode se tornar um gargalo e, muitas vezes, é sensato colocar máquinas com tráfego intenso entre elas na mesma sub-rede ... as sub-redes de cruzamento de tráfego não têm desvantagem de desempenho na VPC. As máquinas devem ser colocadas em sub-redes apropriadas às necessidades de endereçamento IP da máquina - endereço público, sub-rede pública; nenhum endereço público, sub-rede privada.

Mais discussões sobre a logística de sub-redes públicas / privadas na VPC podem ser encontradas em Por que precisamos de sub-rede privada na VPC (no Stack Overflow).

Michael - sqlbot
fonte
2

Isso já tem uma ótima resposta, mas a AWS cria uma sub-rede pública para você quando você escolhe a opção "acessível ao público". Em vez disso, para mim, o problema era o grupo de segurança VPC padrão. Eu estava olhando para as regras da rede ACL - não para o grupo de segurança . (Escolher a opção "acessível ao público" no RDS adiciona o grupo de segurança, mas não adiciona automaticamente as regras de entrada.)

Clique em RDS e identifique e clique no grupo de segurança. Em "regras de entrada", adicione a porta 3306 e o ​​endereço IPV4 de conexão xxxx / 32 (ou 0.0.0.0/32 - se você quiser que toda a Internet se conecte - mas tenha cuidado com isso).

Charlie Dalsass
fonte
0

Verifique também se a rede à qual você está conectado não está bloqueando as conexões com outro servidor na porta 3306. Esse foi o meu caso quando conectado à minha rede corporativa.

gary69
fonte