はじめに
クラウドVPSのAlmaLinux9サーバにPostgreSQL14を構築したのですが、なぜか自宅PCのDataGripからSSHトンネルの接続に失敗してしまいます。
問題は解決できましたので、自分用の備忘録として残したいと思います。
事象について
事象としては以下のようにDataGripの「Test Connection」をクリックすると、「SSH tunnel creation failed: Connection refused.」となってしまい、DBへの接続に失敗します。
なお、あらかじめSSHトンネル用の設定(「SSH Configurations」画面での設定)は済んでいて、「Test Connection」も成功しています。
であるにも関わらず、なぜかこの画面ではSSHトンネルに失敗しています。
DataGrip側の設定について
DataGrip側の設定としては、「Data Sources and Drivers」画面の「SSH/SSL」タブの設定は以下になります。
あらかじめSSH configurationの設定は完了(「Test Connection」も成功)していますので、上図ではその設定を指定しているだけです。
また、下図の「SSH Configurations」の設定では、「Test Connection」が成功しています。
DataGripからのSSH接続が成功しているので、「SSH/SSL」タブの「Test Connection」も成功しそうですが、なぜか失敗している状況です。
AlmaLinuxサーバ側の設定について
FWの設定
FWの設定については、SSH接続するポート(xxxx22 port)は解放済み。
また、PostgreSQLの5432ポートは閉じていましたが、一時的に開けてみても接続に失敗しました。
今回は鍵認証でリモートサーバにログインするので、5432portは閉じていて問題ありません。
pg_hba.confの設定
pg_hba.confには、SSH接続するユーザ名を指定した「local」の行と、「hostssl」の行(「cert」指定)を記載しているので問題ないと思います。
リモートサーバに鍵認証でログインし、その後PostgreSQLにはローカル接続するのでpg_hba.confの記述は、当初以下の記述の箇所にマッチしていると思っていたのですが、
# 誤(この行にはマッチしていない)
local all all peer
正しくは、以下のようにTCP/IP接続なので「host」行にマッチしていました。
# 正(この行にマッチしている)
host all all 127.0.0.1/32 md5
今回のエラーについては、上記pg_hba.confの問題というより、DataGrip側でグローバルIPアドレスを指定していたのが原因ですね。
下の方にも記載していますが、グローバルIPアドレスではなく、「localhost」と記述してあげれば今回のエラーは解消されますが、pg_hba.confの記述が上記の「host」欄の記述であれば、md5認証でパスワードが要求されますので、あらかじめDataGrip側に登録しておきましょう。
原因について
Linuxサーバのログを確認しながらDataGrip側で色々試したところ、DataGripの「Host:」欄の記述がGlobal IPアドレスだったのが弾かれる理由でした(今回のエラーの場合)。
自宅からのリモート接続だからGlobal IPアドレス指定で大丈夫だと思っていたのですが、「localhost」でよかったようです。
自宅PCからVPCのサーバへはSSHで鍵認証(グローバルIP)を行い、鍵認証を通過した後はDBへはローカル接続(だけど、TCP/IP接続なのでpg_hba.confでは「host」行に当てはまる)なので「Host:」欄には「localhost」と記述する必要がありました。
単純にリモート接続だからTCP/IP接続というのはわかるんですが、DataGripの設定でこんがらがってしまいました。。
解決方法について
「Host:」欄はサーバのグローバルIPアドレスを指定していましたが、これを「localhost」に変更してあげると接続できました!
イメージとしては、自宅PC(DataGrip)からクラウドのサーバにSSH接続が成功した後は、サーバ側にログインできているわけだから、わざわざグローバルIPアドレスを指定するのではなく、localhostの5432portを指定し接続すれば良いだけ、ということだと思います。
サーバへのSSH接続完了後にグローバルIPアドレス指定で5432portに接続しようとすると、一回外(インターネット)に出てから5432portに繋ぎに行こうとして、弾かれているのかなと思います。
インターネット側にDBのポートは開けたくないですからね。
これで実際にDB接続ができ、SQLも問題なく実行できましたので安心安心。
まだまだ修行が足りない、ということですね。
まとめ
社内ネットワークだと、わざわざ鍵認証せずにローカルIPアドレス指定で接続することが多いかと思いますが、プライベート環境だと自宅PCから自分が契約したクラウド上のサーバにアクセスする際は、SSH接続で鍵認証を行うのがセキュリティとしてもちろん大事かと思います。
最初は環境設定が少し面倒ですが、これさえ終われば後は開発に集中できそうです。
ご参考になれば幸いです。
コメント