R を使用して SSH トンネル経由でサーバー上の PostgreSQL データベースに接続するにはどうすればよいですか?

R を使用して SSH トンネル経由でサーバー上の PostgreSQL データベースに接続するにはどうすればよいですか?

SSH トンネルを介して、サーバー (Digital Ocean) 上の PostgreSQL データベースに RStudio セッションを接続しようとしています。SSH 接続、特に R の使用は初めてです。

システム情報:

ローカル コンピューターでは、Windows 10 x64 を使用しています。PostgreSQL 13、R 4.0.3、OpenSSH サーバー、OpenSSH クライアントをインストールしました (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 Server) で公開キーを有効にしています。また、DO Server は SSH 接続を許可するようにすでに構成されています (例: IP: 123.456.789.01、ポート: 1234)。

上記の構成により、PgAdmin を DO サーバーの Postgresql データベースに接続できました。次のパラメータを使用してデータベースにログインしました。

  • db名 = "db"
  • doserver_user = "root"
  • db_user = "ユーザー名"
  • パスワード = "pwd"

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 アプリケーションからの接続を閉じた場合、またはホストの値を別の 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 Server の 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ポートの詳細については、ここ

関連情報