PostgreSQL #2 PostgreSQLに外部から接続する
PostgreSQLをLinuxサーバーにインストールして接続確認までできたので、外部から接続してみる。
前回までやったPostgreSQLのインストールの記事はこちら。
環境
- OS:Debian9
- PostgreSQL 10.6
外部接続を行う
1. postgresql.confの変更
【サーバー側で操作】
postgresql.confを開く。
# vi /etc/postgresql/10/main/postgresql.conf
60行目付近のlisten_addressesの記載を変更する。 この設定はサーバー側の”接続を受け付ける”IPアドレスの設定。
# - Connection Settings - #listen_addresses = 'localhost' # what IP address(es) to listen on;
から
listen_addresses = '*'
に変更。コメントアウトの「#」を外すのを忘れずに!
2. pg_hba.confの変更
【サーバー側で操作】
続いて、pg_hba.confを開く。
# vi /etc/postgresql/10/main/pg_hba.conf
認証を受け付けるIPの範囲を追記する。
# IPv4 local connections: host all all 192.168.11.7/32 md5
外部接続するIPアドレス(=今回は自分のMacのアドレス)を追加。変更ではなく追加です。既存の設定を間違って上書きしないように!(これでまたひとハマりした・・・)
※この後の説明を読んでもらうとわかりますが、結果からいうとここでやったIPの指定は間違ってました。が勉強のためにこのまま残しておきます。
編集が終わったらサービスをリスタート。
# /etc/init.d/postgresql restart
これで外部接続に必要な設定は完了。
3. 外部から接続する
【クライアント(=Mac)側で操作】
Macから接続するためのコマンドを実行する*1。rootユーザーで実行。
# psql -U pgadmin -d postgres -h ホスト名
はい、ここでエラー。
psql: FATAL: pg_hba.conf にホスト"153.126.147.235"、ユーザ"pgadmin"、データベース"postgres, SSL有効用のエントリがありません FATAL: pg_hba.conf にホスト"153.126.147.235"、ユーザ"pgadmin"、データベース"postgres, SSL無効用のエントリがありません
接続できないと言われているみたい。結果からいうと「1. 設定の変更」でやったpg_hba.confの記述が間違っていた。
今回の場合でいうと、
「192.168.11.7/32 」ではなく「192.168.11.7/0」にする必要があった。
ただし、このあたりはposgreSQLが入っているサーバーと外部接続する端末との関係によって変わってくるのと、サブネットマスクについて理解していないと正しい値として何を設定すればいいか判断できないと思うので、「おまけ:接続エラーの解決手順」に書いた考察や参考サイトをみながら理解する必要がある。
で、pg_hba.confのIPv4の設定を以下のように修正。
サービスをリスタートして、もう一度外部接続にチャレンジ。
host all all 192.168.11.7/0 md5
できたー!!
おまけ:接続エラーの解決手順
1. 当たりをつける
まず、エラーが出た段階での私の見解。
- 前回直接接続したところまではきちんとできていたので、外部接続がうまくいっていないだけ。
- 外部接続するために設定を変えたファイルは2つ。設定の意味を考えるとどうもIPv4の設定で指定したIPアドレスが間違っているのでは。
ここの記述をみるとIPv4の設定を「0.0.0.0/0 trust」にすればどのマシンからでも接続できることがわかったので一旦この通りに変更してみる。
全てのホストからの接続を許可する 全てのホストから、全てのデータベースへの接続を許可する場合、以下の記述を追加する。
host all all 0.0.0.0/0 trust
設定ファイルをこの通りに変更してみたら接続できた。ふむふむ。
この状態から、最初に記述していた「192.168.11.7/32 md5」に少しずつ近づけていって、どこでエラーになるか試してみる。
- trust→md5に変更 接続OK
- 0.0.0.0→192.168.11.7に変更 接続OK
- /0→/32に変更 接続NG
どうやら「/32」にすると接続できないということがわかった。
1. 「/0」や「/32」の意味を調べる
ここによると
ふむふむ。現状ではサブネットマスクの別な書き方くらいに覚えておけばいいかな。
この時点で、サブネットマスクが何なのかよくわかってないので以下のサイトを見て学習。ここがすごくわかりやすい!
で話は戻って、今回の接続しようとしているサーバーとクライアントのIPなんだけど、
host all all 192.168.11.7/32 md5
この最初の間違った記述だと、以下のような意味になる。
C/S | IPアドレス | サブネットマスク | ネットワーク範囲(サブネット) |
---|---|---|---|
サーバー | 153.126.147.199 | 255.255.255.0 | 153.126.147.*(*は0〜255) |
クライアント | 192.168.11.7 | 255.255.255.255 | 192.168.11.7 |
なのでネットワークの範囲を確認すると、サーバーとクライアントは別ネットワークにいることがわかる。接続するには、
C/S | IPアドレス | サブネットマスク | ネットワーク範囲(サブネット) |
---|---|---|---|
サーバー | 153.126.147.199 | 255.255.255.0 | 153.126.147.* |
クライアント | 192.168.11.7 | 0.0.0.0 | *.*.*.*; |
にすればよくて、このサブネットマスク「0.0.0.0」を「/0」という記法で、IPv4の設定に書いてやればよい。で、最終的にこの書き方が正しくて、解決することができた。
host all all 192.168.11.7/0 md5