¿Cómo puedo conectarme a la base de datos PostgreSQL en un servidor a través de un túnel SSH usando R?

¿Cómo puedo conectarme a la base de datos PostgreSQL en un servidor a través de un túnel SSH usando R?

Estoy intentando conectar una sesión de RStudio a una base de datos PostgreSQL que está en un servidor (Digital Ocean) a través de un túnel SSH. Soy nuevo en las conexiones SSH, especialmente usando R.

Información de sistemas:

En mi computadora local, estoy usando Windows 10 x64. He instalado PostgreSQL 13, R 4.0.3, OpenSSH Server y OpenSSHD Client (para Open SSH estoy usando las versiones estándar de Windows).

En Digital Ocean Server tengo Ubuntu 20.04.1, postgresql 12+214ubuntu0.1, openssh-server 1:8.2p1-4ubuntu0.2

Contexto general:

En primer lugar, ya generé un par de claves .PEM (me referiré a la frase de contraseña de la clave privada como 'passp') y habilité la clave pública en Digital Ocean Server (DO Server de ahora en adelante). Además, el servidor DO ya está configurado para permitir conexiones SSH (ejemplo ip: 123.456.789.01 y puerto: 1234).

Con la configuración mencionada anteriormente, pude conectar PgAdmin a la base de datos Postgresql en el servidor DO. Inicié sesión en la base de datos usando los siguientes parámetros:

  • nombrebd = "db"
  • doserver_user = "raíz"
  • db_user = "nombre de usuario"
  • contraseña = "contraseña"

Logré conectarme al servidor DO desde mi PC usando la aplicación CMD. El comando que estoy usando es el siguiente:

ssh -i "C:/path/to/ssh/key" -L 5555:127.0.0.1:1234 [email protected]

Cuando esta conexión está abierta, por supuesto puedo acceder al servidor DO. Para verificar que el puerto local 5555 se estuviera ejecutando, ejecuté el comando netstat -ao | find "5555"y recibí lo siguiente:

 TCP    127.0.0.1:5555         hp-PC:0                LISTENING       14132

Antes de pasar a R, verifiqué dos veces el archivo sshd_config para asegurarme de que TCPForwarding estuviera permitido y que ListenAdress estuviera configurado para el host local (127.0.0.1). Hice esta verificación en mi PC y en el servidor DO.

Una vez hecho todo esto, fui a RStudio e intenté conectarme a la base de datos Postgresql en el servidor DO usando el siguiente código:

library(DBI)                                   #DBI version 1.1.1
library(RPostgres)                             #RPostgres version 1.3.2.9000
con <- DBI::dbConnect(drv = RPostgres::Postgres(), 
                  dbname= "db",
                  host = "127.0.0.1",
                  port = "5555",         
                  user= "root",
                  password= "pwd")

Estoy usando host: "127.0.0.1" y puerto "5555" porque, según tengo entendido, es el puerto que está escuchando y ya ha sido reenviado a la IP del servidor DO (123.456.789.01).

Los intentos y errores:

Error 1

Probé muchas opciones diferentes para el código en R y, por lo tanto, obtuve varios errores. Con el código inicial mencionado anteriormente me sale el siguiente error:

Error: SSL error: wrong version number
expected authentication request from server, but received S

También recibo el mismo error si cambio el host a "localhost" o el usuario a "nombre de usuario" (el usuario con el que accedo a la base de datos, no al servidor DO).

Error 2

Intenté llamar a un puerto diferente en el código R (por ejemplo, cambiar el puerto a "5433") para ver si sucedía algo y obtuve el error:

could not connect to server: Connection refused (0x0000274D/10061)
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5433?

Este error también ocurre si cierro la conexión desde la aplicación CMD o si cambio el valor de Host a otra IP (Por ejemplo host = 111.222.333.44).

Error 3

Como medida desesperada, intenté crear una conexión directamente desde RStudio. Para hacer esto, utilicé lo siguiente:

library(ssh)                                                              #ssh version 0.7.0
session <- ssh::ssh_connect(host= "[email protected]:22", keyfile = "C:/path/to/ssh/key")
ssh::ssh_tunnel(session, port = local_port, target = serv_host)

Y obtuve el resultado:

/ Waiting for connection on port 5555...

Como R tiene un solo subproceso, no pude ejecutar DBI::dbConnect desde la misma sesión (sesión A). Entonces comencé una nueva sesión (sesión B) y ejecuté DBI::dbConnect como se mencionó anteriormente. Los resultados fueron:

#Session A
- Waiting for connetion on port 1090... client connected!
Error: libssh failure at 'channel_open_forward': Socket error: No error

#Session B
#No result, just got stuck processing

La pregunta

Solo quiero poder conectar RStudio en mi PC a la base de datos Postgresql en el servidor DO. Realmente no me importa si esto se logra señalando algo que estoy haciendo mal con la configuración o el código, o si hay una forma completamente diferente de hacerlo.

Estaré muy agradecido por todos y cualquier sugerencia que puedan darme.

Respuesta1

Aparentemente esto tiene una solución fácil que fue cortesía deDaniel Verité.

Es importante llamar al puerto "5432" ya que es el puerto predeterminado donde Postgresql escucha el servidor.(en este caso Digital Ocean). Por lo tanto, mi código final en la aplicación CMD tiene el siguiente aspecto:

ssh "C:/path/to/sshkey" -L 5555:127.0.0.1:5432 [email protected]

Dónde:

  • 5555 es el puerto en la computadora local (el usuario puede asignarlo a cualquier número entre 1,024 y 32,767)Números de puerto para conexiones SSH y Telnet
  • 127.0.0.1 indica el host local
  • 5432, como se mencionó anteriormente, es el puerto predeterminado donde PostgreSQL escucha las conexiones entrantes.
  • 123.456.789.01 es una IP de ejemplo que corresponde a la IP del servidor
  • Como nota adicional, si configuró una frase de contraseña con su clave ssh, se solicitará inmediatamente después de ejecutar esta línea de código en la aplicación CMD.

Una vez que hice eso, R se conectó sin problemas usando el código mencionado anteriormente.

Respuesta2

psql es un programa de terminal interactivo proporcionado por PostgreSQL. Puede hacer muchas cosas con la herramienta psql, por ejemplo, ejecutar declaraciones SQL, administrar objetos de bases de datos, etc.

puedes comprobar esto:

ssh -i "C:/path/to/ssh/key" -L 5555:127.0.0.1:1234 [email protected]

puedes consultar más sobre el puerto SSHaquí

información relacionada