R을 사용하여 SSH 터널을 통해 서버의 PostgreSQL 데이터베이스에 어떻게 연결할 수 있습니까?

R을 사용하여 SSH 터널을 통해 서버의 PostgreSQL 데이터베이스에 어떻게 연결할 수 있습니까?

SSH 터널을 통해 서버(Digital Ocean)에 있는 PostgreSQL 데이터베이스에 RStudio 세션을 연결하려고 합니다. 저는 특히 R을 사용하여 SSH 연결을 처음 접했습니다.

시스템 정보:

내 로컬 컴퓨터에서는 Windows 10 x64를 사용하고 있습니다. PostgreSQL 13, R 4.0.3, OpenSSH 서버 및 OpenSSHD 클라이언트를 설치했습니다(Open SSH의 경우 표준 Windows 버전을 사용하고 있습니다).

Digital Ocean Server에는 Ubuntu 20.04.1, postgresql 12+214ubuntu0.1, openssh-server 1:8.2p1-4ubuntu0.2가 있습니다.

일반 상황:

우선, 이미 .PEM 키 쌍(개인 키의 암호를 'passp'라고 칭함) 개인 키를 생성하고 Digital Ocean Server(이제부터 DO 서버)에서 공개 키를 활성화했습니다. 또한 DO 서버는 이미 SSH 연결을 허용하도록 구성되어 있습니다(예: IP: 123.456.789.01 및 포트:1234).

위에서 언급한 구성을 통해 DO 서버의 Postgresql 데이터베이스에 PgAdmin을 연결할 수 있었습니다. 다음 매개변수를 사용하여 데이터베이스에 로그인했습니다.

  • DB이름 = "DB"
  • doserver_user = "루트"
  • db_user = "사용자 이름"
  • passqord = "비밀번호"

CMD 응용 프로그램을 사용하여 내 PC에서 DO 서버에 연결했습니다. 내가 사용하는 명령은 다음과 같습니다.

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

이 연결이 열려 있으면 당연히 DO 서버에 액세스할 수 있습니다. 로컬 포트 ​​5555가 실행 중인지 확인하기 위해 명령을 실행 netstat -ao | find "5555"하고 다음을 받았습니다.

 TCP    127.0.0.1:5555         hp-PC:0                LISTENING       14132

R로 이동하기 전에 sshd_config 파일을 다시 확인하여 TCPForwarding이 허용되었는지, ListenAdress가 로컬 호스트(127.0.0.1)에 대해 구성되었는지 확인했습니다. 나는 내 PC와 DO 서버에서 이 검사를 수행했습니다.

이 모든 작업이 완료되면 RStudio로 가서 다음 코드를 사용하여 DO 서버의 Postgresql 데이터베이스에 연결을 시도했습니다.

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")

나는 호스트: "127.0.0.1"과 포트 "5555"를 사용하고 있는데, 내가 이해하는 한 이 포트는 수신 대기 중이고 이미 DO 서버 IP(123.456.789.01)로 전달된 포트이기 때문입니다.

시도와 오류:

오류 1

R의 코드에 대해 다양한 옵션을 시도했기 때문에 몇 가지 오류가 발생했습니다. 위에서 언급한 초기 코드에서는 다음 오류가 발생합니다.

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

호스트를 "localhost"로 변경하거나 사용자를 "username"(DO 서버가 아닌 데이터베이스에 액세스하는 사용자)으로 변경하는 경우에도 동일한 오류가 발생합니다.

오류 2

어떤 일이 발생하는지 확인하기 위해 R 코드에서 다른 포트를 호출하려고 시도했는데(예: 포트를 "5433"으로 변경) 오류가 발생했습니다.

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?

이 오류는 CMD 응용 프로그램에서 연결을 닫거나 Host 값을 다른 IP(예: 호스트 = 111.222.333.44)로 변경하는 경우에도 발생합니다.

오류 3

필사적으로 RStudio에서 직접 연결을 만들어 보았습니다. 이를 위해 다음을 사용했습니다.

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)

결과는 다음과 같습니다.

/ Waiting for connection on port 5555...

R은 단일 스레드이므로 동일한 세션(세션 A)에서 DBI::dbConnect를 실행할 수 없습니다. 그래서 새 세션(세션 B)을 시작하고 위에서 언급한 대로 DBI::dbConnect를 실행했습니다. 결과는 다음과 같습니다.

#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

물어보세요

내 PC의 RStudio를 DO 서버의 Postgresql 데이터베이스에 연결할 수 있기를 원합니다. 구성이나 코드에서 내가 잘못하고 있는 것을 지적함으로써 이것이 수행되는지, 아니면 완전히 다른 방법이 있는지는 전혀 신경 쓰지 않습니다.

나는 당신이 나에게 줄 수 있는 모든 제안과 제안에 대해 매우 감사할 것입니다.

답변1

분명히 이것은 다음과 같은 쉬운 해결책을 가지고 있습니다.다니엘 베리테.

Postgresql이 서버를 수신하는 기본 포트이므로 포트 "5432"를 호출하는 것이 중요합니다.(이 경우 Digital Ocean). 따라서 CMD 애플리케이션의 최종 코드는 다음과 같습니다.

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

어디:

  • 5555는 로컬 컴퓨터의 포트입니다(사용자가 1,024에서 32,767 사이의 숫자로 할당할 수 있음).SSH 및 Telnet 연결을 위한 포트 번호
  • 127.0.0.1은 로컬 호스트를 나타냅니다.
  • 위에서 언급한 대로 5432는 PostgreSQL이 들어오는 연결을 수신하는 기본 포트입니다.
  • 123.456.789.01은 서버 IP에 해당하는 예시 IP입니다.
  • 추가 참고 사항으로 SSH 키를 사용하여 암호를 구성한 경우 CMD 애플리케이션에서 이 코드 줄을 실행한 후 즉시 암호가 요청됩니다.

그렇게 하고 나면 위에서 언급한 코드를 사용하여 R이 문제 없이 연결됩니다.

답변2

psql은 PostgreSQL에서 제공하는 대화형 터미널 프로그램입니다. psql 도구를 사용하면 SQL 문 실행, 데이터베이스 개체 관리 등 많은 작업을 수행할 수 있습니다.

당신은 이것을 확인할 수 있습니다 :

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

SSH 포트에 대해 자세히 확인할 수 있습니다.여기

관련 정보