はじめに
クラウド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ポートは閉じていましたが、一時的に開けてみても接続に失敗しました。
pg_hba.confの設定
pg_hba.confには、SSH接続するユーザ名を指定した「local」の行と、「hostssl」の行(「cert」指定)を記載しているので問題ないと思います。
実際、今回の事象が解決したときは「hostssl」の行は不要で、「local」の行だけでOKでした。
原因について
Linuxサーバのログを確認しながらDataGrip側で色々試したところ、「Host:」欄の記載が間違っていたのが原因でした。
解決方法について
「Host:」欄はサーバのグローバルIPアドレスを指定していましたが、これを「localhost」に変更してあげると接続できました!
イメージとしては、自宅PC(DataGrip)からクラウドのサーバにSSH接続が成功した後は、サーバ側にログインできているのだから、わざわざグローバルIPアドレスを指定するのではなく、localhostの5432portを指定し接続すれば良いだけ、ということだと思います。
サーバへのSSH接続完了後にグローバルIPアドレス指定で5432portに接続しようとすると、一回外(インターネット)に出てから5432portに繋ぎに行こうとして、弾かれているのかなと思います。
インターネット側にDBのポートは開けたくないですからね。
これで実際にDB接続ができ、SQLも問題なく実行できましたので安心安心。
まだまだ修行が足りない、ということですね。
まとめ
社内ネットワークだと、わざわざ鍵認証せずにローカルIPアドレス指定で接続することがあるかと思いますが、プライベート環境だと自宅PCから自分が契約したクラウド上のサーバにアクセスする際は、SSH接続で鍵認証を行うのがセキュリティとして良いかと思います。
最初は環境設定が少し面倒ですが、これさえ終われば後は開発に集中できそうです。
コメント