Como posso usar o encapsulamento de porta para conectar-se a uma instância de banco de dados privada por meio de um bastião da rede?

12

Eu tenho um bastião de rede que é acessível publicamente em example.compute-1.amazonaws.come uma instância de banco de dados privada do postgres empostgres.example.us-east-1.rds.amazonaws.com:5432

Eu posso ssh no bastião usando

$ ssh -i key.pem [email protected]

Então, quando estou no bastião, crio um túnel ssh com:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 [email protected]

Posso então verificar se o túnel funciona conectando-se ao banco de dados a partir do bastião usando localhost:

$ psql -p 5432 -h localhost -U postgres

No entanto, não consigo me conectar ao banco de dados remotamente (sem estar no bastião).

$ psql -p 5432 -h example.compute-1.amazonaws.com -U postgres
psql: could not connect to server: Connection refused
Is the server running on host "example.compute-1.amazonaws.com" () and accepting
TCP/IP connections on port 5432?

Eu configurei o grupo de segurança do bastião para aceitar o tráfego de entrada na porta 5432.

Estou usando ssh -Lcorretamente? Devo usá-lo fora do bastião? Qualquer conselho seria muito apreciado.

Snubber
fonte

Respostas:

20

Quando você cria um túnel SSH, ele não expõe a porta aberta para o mundo externo. A porta aberta, está disponível apenas como localhost. Tão efetivamente o que você fez é criar um túnel do seu bastião para o seu bastião.

Em vez disso, o que você quer fazer é criar um túnel a partir do seu computador local através do seu bastião.

Então, você cria seu túnel como parte da sua conexão do computador local ao bastião . Você não precisa criar outra conexão SSH.

Então, localmente, você executaria:

$ ssh -i key.pem -L 5432:postgres.example.us-east-1.rds.amazonaws.com:5432 [email protected]

Supondo que postgres.example.us-east-1.rds.amazonaws.com seja resolvido para o endereço IP privado.

Em seguida, para conectar-se ao seu servidor, ainda localmente, conecte-se como se o servidor fosse local:

$ psql -p 5432 -h localhost -U postgres

Fazendo isso, não há necessidade de usar um prompt no seu bastião.

Matt Houser
fonte
Isso funcionou para mim, obrigado! A única coisa que esqueci para quem tem o comando psql está aí: Verifique se o seu grupo de segurança db permite acesso a partir do bastião.
Goran
-1

Isso funcionou para mim. Verifique se o cliente psql está instalado localmente.

psql --host=myAwsDbEndpointUrl.ciqykqusf0nv.us-west-1.rds.amazonaws.com --port=5432 --username=myUserName --password --dbname=myDbName

Ao criar sua instância do db no aws, defina o seguinte:

  1. nome do usuário
  2. senha
  3. nome do banco de dados
  4. número da porta

Também tive que criar um grupo de segurança para a VPC em que o banco de dados estava localizado. Depois de criá-lo, verifique se a instância do db usa isso para o seu grupo de segurança. O grupo de segurança possui as seguintes regras:

inbound--> type:PostgreSQL, protocol:TCP port range:5432, source:0.0.0.0/0

outbound--> type:All Traffic, protocol:All, port range:all, destination:0.0.0.0/0
timxor
fonte
Isso não está passando por um bastião, certo? Você está apenas se conectando diretamente ao RDS
RhysC
Ele passa por um vpc pelo qual a instância rds é exposta. Você anexa o vpc à instância rds na criação.
timxor
Sim, eu acho que a pergunta original era em relação a ir através de um servidor bastião na VPC de modo a instância RDS não é exposto publicamente (bem isso é como eu lê-lo)
RhysC
Essa não era a pergunta e sua resposta não ajuda a resolver o problema.
Radko Dinev 21/09