昨日、仮想マシン上にインストールしたPostgreSQL 9.5 Alpha 2に、ホスト(Windows)のpsqlpgAdminから接続できるようにしました。一連の記事は今日で終わり。
Contents


関連・参考サイト(その4)
下記2つとも本ブログの過去記事で、CentOS6.67での同様の作業です。今回もほとんど同じ内容で新鮮味がないですが、一応記録として残します。後で意外な時に役立ったりするので。



VirtualBoxのポートフォワーディング設定
一昨日SSHで行ったのと同様、PostgreSQLについてホスト → ゲストのポート転送を有効化します。ネットワーク設定はNATのまま。ポータブル版VirtualBoxでホストからゲストにアクセスする手軽な方法です。他の方法もあるけど、ネットワークアダプタのインストールとかが絡んで面倒。

↓ 作業はホスト上のVirtualBoxGUIで。仮想マシン起動中に行うことができ、設定が即反映されて便利。設定画面からネットワークの項、下の方にあるポートフォワーディングのボタンでダイアログが開きます。


↓ 新規行を追加し、名前は適当に、ホスト側ポートは他のPostgreSQL等と被らないように。ゲスト側はデフォルトの5432で。IPアドレスはホスト・ゲストとも空欄で可(自動的にlocalhostになる)。


設定画面を閉じるとポート転送自体は有効になりますが、仮想マシン側の準備はこれから。ホスト側からはまだ接続できません。↓
psql -U postgres -p 5438
psql: サーバからデータを受信できませんでした: Software
caused connection abort (0x00002745/10053)


iptablesは設定不要だった!?
外部からのネットワーク接続の制御に、CentOS6まではiptables、7からはfirewalldがデフォルトに変わりました。今回使っているScientific Linux 7CUI版はどうか調べると ↓firewalldは入っておらず、CentOS6と同じiptablesのようです。
service firewalld status


iptablesの設定を見ると ↓CentOS
6のデフォルトと同様、SSH22番ポートだけ外から接続できる模様。それで今までは、22番と同様にPostgreSQL5432番を追加して接続許可してきましたが…
# cat /etc/sysconfig/iptables

...
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


今回、試しに22番の行をコメントアウトしてネットワーク再起動すると…
# vi cat /etc/sysconfig/iptables
...
# -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# service network restart


普通にポートフォワーディング経由でホストからSSH接続できました。↓ その状態でiptables -Lを打ってみたところ。Chain INPUT ... ACCEPTの行にSSHがありません。VirtualBoxのポートフォワーディングで仮想側のlocalhostに転送すると「外部からのアクセス」にならず、そのまま接続できるようです。
# iptables -L


今回はこのままiptablesを変えずに進め、次項のとおりPostgreSQLの設定ファイルだけ変えたらホスト側から問題なく接続できました。PostgreSQL自体はlocalhostでなく10.0.2.2(VirtualBoxのゲートウェイ=ホストのアドレス)と認識するので、今までどおりpg_hba.confの変更が必要でした。

よく分かりませんが、とりあえずVirtualBoxのポートフォワーディングで仮想側ローカルホストに転送するなら、「iptablesで(OS上で)外部からの接続を許可する」必要はないのかも。


PostgreSQLの設定
これはいつもの繰り返しですが、一応記録まで。まずpostgresql.confを開き、Connection Settingsの最初の部分をlisten_addresses = '*'に変えます。
vi /var/lib/pgsql/9.5/data/postgresql.conf

#-----------------------------------------
# CONNECTIONS AND AUTHENTICATION
#-----------------------------------------

# - Connection Settings -

listen_addresses = '*'
...


次にpg_hba.confを開き、10.0.2.2(VirtualBoxNAT設定でのゲートウェイ=ホストのアドレス)からの接続を設定します。ここではmd5(パスワード認証)に。
vi /var/lib/pgsql/9.5/data/pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD
...
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             10.0.2.2/32             md5
...


↓ そう言えばまだパスワードを設定していなかったので、ここで。
/usr/pgsql-9.5/bin/psql
psql (9.5alpha2)
Type "help" for help.

postgres=# ALTER ROLE postgres password '********';


PostgreSQLを再起動し、何もメッセージが出なければ特に問題ありません。これで今回の仮想マシン上の作業は終了。
# service postgresql-9.5 restart


なお設定ファイル修正でミスすると(変な所に改行を入れる、想定されないパラメータを入れる等)↓ こんな風に再起動が失敗するので、落ち着いて見直します。


ホスト側psqlpgAdminから接続確認
今回、ホスト側(Windows)のpsqlはバージョン9.4付属のもの。ポートフォワーディングで設定したポート番号を使い、接続先IPアドレスはローカルホストなので省略して接続すると ↓ 無事できました。サーバの方が新しいバージョンなので「注意」が出ます。
psql -U postgres -p 5438
ユーザ postgres のパスワード:
psql (9.4.1, サーバー 9.5alpha2)
注意: psql メジャーバージョン 9.4, サーバーバージョン 9.5.
         psql の機能の中で、動作しないものがあるかもしれません。
"help" でヘルプを表示します.


最後にpgAdminにサーバ追加。ファイルメニューからダイアログを開き、名前は適当に、ホストとポートはpsqlと同様に設定してOKを押すと自動的に接続を試みます。


サーバの方が新しいバージョンだというこんな警告 ↓ が出たら、すでに接続自体は成功している証拠。オブジェクトブラウザに今回のサーバが追加されているはずです。


なお
昨日のデータベース初期化のところで書きましたが、今回はデフォルトの文字コードがSQL_ASCIIになりました。新規データベース作成時にUTF-8などに変更できるからいいですが、最初からあるpostgresデータベースがSQL_ASCIIで、pgAdminで接続すると ↓ こんな注意が(データベースにASCIIしか入力できない旨)。クライアント側の文字コード(SJIS)を検出して、親切に表示するようです。


まとめ:CentOS7 + PostgreSQL 9.5 Alpha 1と違った点

上の3点を除けば、今までと同様の作業でした。初めてScientific Linuxを使ったにしては物足りない気もするけど、いつも安定して環境構築できるのはいいことです。