仮想側OS昨日と同じCentOS 6.6です。昨日はホスト側から仮想側のSSHサーバに接続し、その際VirtualBoxNAT+ポートフォワーディングを使いました。今日も基本は同じですが、仮想側のiptablesPostgreSQL設定ファイル(postgresql.conf、pg_hba.conf)を変更します。ホスト側はWindows 7 32bit + Portable VirtualBox 4.3.6。
Contents

VirtualBoxでポートフォワーディングの設定
まず、昨日と同様に仮想マシンの設定画面を開き、NetworkNATに設定→Advancedをクリック → 一番下のボタンをクリック、でポートフォワーディング設定画面(下の二つ目の画像)を開きます。右端の+アイコンで新しい行を追加し、名前は任意、Host Portに適当に空いているポートを指定し、Guest Portに仮想側PostgreSQLのポートを入力します。localhostならHost IP、Guest IPも空でいいようです。


仮想側のiptablesPostgreSQL設定ファイルを編集
CentOS 6.6 minimalでは、最初からSSHサーバのポート22番を待ち受ける設定がiptablesにありました。その行と同様に、ポート番号だけPostgreSQL5432(等)に変えた行を追加します。具体的には下のように。
# vi /etc/sysconfig/iptables

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

(ESCでINSERTモードを抜け、:wqで保存終了)
(ネットワークサービスを再起動して反映させる)

service network restart


次にPostgreSQL設定ファイルの編集。具体的には下のとおり、postgresql.conflisten_addresses = '*'に変更し、pg_hba.conf
10.0.2.2というアドレスからの接続を有効化。このアドレスがVirtualBoxNATでのホストOS(=ゲートウェイ)になっています。詳細» 仮想化された日々: VirtualBoxのネットワークについて
vi /var/lib/pgsql/9.3/data/postgresql.conf

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

# - Connection Settings -

listen_addresses = '*'
...
vi /var/lib/pgsql/9.3/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
...


↓ 確認で仮想側からPINGしたところ。編集後にPostgreSQLのサービスを再起動し、準備終わりです。
service postgresql-9.3 restart


ホストOSから接続確認
最初のVirtualBoxポートフォワーディングで設定したポート番号を使い、psqlで接続します。特に問題なければ、パスワード要求を経てつながるはず。下の画像で出ている警告はホスト側コンソールの文字コード絡みで、今回の作業とは特に関係ありません。
psql -U postgres -p 5436


当初、ホスト側アドレスの10.0.2.2を知らなかったのでpg_hba.confを編集せず、psqlpgAdminで接続しようとして ↓ のエラーが出ました。ここで親切にもno pg_hba.conf entry for host "10.0.2.2"とあったのが幸い。そうでなければ、VirtualBoxのネットワーク設定がおかしいのかと勘違いしかねませんでした。


これでVirtualBox上のPostgreSQLに、ホスト側のpsqlpgAdminでアクセスできます。VirtualBoxNATは、VMwareと違ってネットワークアダプタをシステム上に追加しないのでポータブルな環境構築にぴったり。あと、複数の仮想マシンでPostgreSQLを使う場合、各マシンのPostgreSQLポートは5432のままポートフォワーディングのホスト側ポートを変えれば使い合けできそうで、機会があれば試します。