¿Cómo puedo usar el túnel de puerto para conectarme a una instancia de base de datos privada a través de un bastión de red?

12

Tengo un bastión de red al que se puede acceder públicamente example.compute-1.amazonaws.comy una instancia de base de datos privada de postgres enpostgres.example.us-east-1.rds.amazonaws.com:5432

Puedo entrar al bastión usando

$ ssh -i key.pem [email protected]

Luego, una vez que estoy en el bastión, creo un túnel ssh con:

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

Luego puedo verificar que el túnel funciona al conectarme a la base de datos desde el bastión usando localhost:

$ psql -p 5432 -h localhost -U postgres

Sin embargo, no puedo conectarme a la base de datos de forma remota (sin estar en el bastión).

$ 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?

He configurado el grupo de seguridad del bastión para aceptar el tráfico entrante en el puerto 5432.

¿Estoy usando ssh -Lcorrectamente? ¿Debo usarlo fuera del bastión? Cualquier consejo sería muy apreciado.

Snubber
fuente

Respuestas:

20

Cuando crea un túnel SSH, no expone el puerto abierto al mundo exterior. El puerto abierto, solo está disponible como localhost. Así que efectivamente lo que has hecho es crear un túnel desde tu bastión hasta tu bastión.

En cambio, lo que desea hacer es crear un túnel desde su computadora local a través de su bastión.

Entonces, crea su túnel como parte de su conexión desde su computadora local a su bastión . No necesita crear otra conexión SSH.

Entonces, localmente, ejecutarías:

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

Suponiendo que postgres.example.us-east-1.rds.amazonaws.com se resuelve en la dirección IP privada.

Luego, para conectarse a su servidor, aún localmente, conéctese como si el servidor fuera local:

$ psql -p 5432 -h localhost -U postgres

Al hacer esto, no hay necesidad de usar un indicador en su bastión.

Matt Houser
fuente
Esto funcionó para mí, gracias! Lo único que olvidé para cualquiera que tenga el comando psql simplemente se cuelga allí: asegúrese de que su grupo de seguridad db permita el acceso desde el bastión.
Goran
-1

Esto funcionó para mí. Asegúrese de tener el cliente psql instalado localmente.

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

Al crear su instancia de db en aws, asegúrese de definir lo siguiente:

  1. nombre de usuario
  2. contraseña
  3. nombre de la base de datos
  4. número de puerto

También tuve que crear un grupo de seguridad para la VPC en la que se encontraba la base de datos. Después de crearla, asegúrese de que su instancia de db la utilice para su grupo de seguridad. El grupo de seguridad tiene las siguientes reglas:

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
fuente
Sin embargo, eso no va por un bastión, ¿verdad? Solo se está conectando directamente a RDS
RhysC
Pasa por un vpc por el que se expone la instancia rds. Adjunta el vpc a la instancia de rds después de la creación.
timxor
Sí, creo que la pregunta original era con respecto a ir a través de un servidor de bastión en la VPC para que la instancia de RDS no esté expuesta públicamente (bueno, así es como lo leí)
RhysC
Esa no era la pregunta y su respuesta no ayuda a resolver el problema en absoluto.
Radko Dinev