仮想側OSは昨日と同じCentOS 6.6です。昨日はホスト側から仮想側のSSHサーバに接続し、その際VirtualBoxのNAT+ポートフォワーディングを使いました。今日も基本は同じですが、仮想側のiptablesとPostgreSQL設定ファイル(postgresql.conf、pg_hba.conf)を変更します。ホスト側はWindows 7 32bit + Portable VirtualBox 4.3.6。
VirtualBoxでポートフォワーディングの設定
まず、昨日と同様に仮想マシンの設定画面を開き、NetworkをNATに設定→Advancedをクリック → 一番下のボタンをクリック、でポートフォワーディング設定画面(下の二つ目の画像)を開きます。右端の+アイコンで新しい行を追加し、名前は任意、Host Portに適当に空いているポートを指定し、Guest Portに仮想側PostgreSQLのポートを入力します。localhostならHost IP、Guest IPも空でいいようです。
仮想側のiptablesとPostgreSQL設定ファイルを編集
CentOS 6.6 minimalでは、最初からSSHサーバのポート22番を待ち受ける設定がiptablesにありました。その行と同様に、ポート番号だけPostgreSQLの5432(等)に変えた行を追加します。具体的には下のように。
# 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.confはlisten_addresses = '*'に変更し、pg_hba.confは10.0.2.2というアドレスからの接続を有効化。このアドレスがVirtualBoxのNATでのホスト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を編集せず、psqlやpgAdminで接続しようとして ↓ のエラーが出ました。ここで親切にもno pg_hba.conf entry for host "10.0.2.2"とあったのが幸い。そうでなければ、VirtualBoxのネットワーク設定がおかしいのかと勘違いしかねませんでした。
これでVirtualBox上のPostgreSQLに、ホスト側のpsqlやpgAdminでアクセスできます。VirtualBoxのNATは、VMwareと違ってネットワークアダプタをシステム上に追加しないのでポータブルな環境構築にぴったり。あと、複数の仮想マシンでPostgreSQLを使う場合、各マシンのPostgreSQLポートは5432のままポートフォワーディングのホスト側ポートを変えれば使い合けできそうで、機会があれば試します。