外部サーバーのDBにアクセスする(postgresql)

まっちー

まっちー

今関わっている仕事でまさにタイトル通りの設定が必要な場面に出くわしまして……ファイアウォールの設定などの関係で残念ながら僕側だけでは完結できなかったんですけど、だいたいの場合はこれだけ設定しとけばできるぞってな感じのを、次にまた同じような状況に出くわしたときのために残しておこうと思います。

まあ、そもそも今までMySQLしか触ったことがなかったので、PostgreSQLを扱うことすら初めてだったんですが、ぶっちゃけ初めてとか全然関係なくサーバーの設定は分かりませんでした。

外部サーバーのDBにアクセスする際に必要な設定は、主に以下の3つです。DBっていうか、外部サーバーのPostgreSQLに接続する設定って言った方が正しいんですかね(ぶっちゃけそれすらもよく分かってないレベルww)

・postgresql.confの中身を変更する
・pg_hba.confの中身を変更する
・iptablesの設定を変更する

設定を変更するのは、全て受信側のファイルです。つまりアクセスしたいDBがある方ですね。

postgresql.confの中身を変更する

サーバーによってファイルの置き場所は違うかもしれないんですが、PostgreSQLを動かしているサーバーならpostgresql.confというファイルがサーバー上にあるはずです。/var/lib/pgsql/data/postgresql.confとか、そんな感じの場所に。

SSHでサーバーに接続して、viでpostgresql.confを開く。

すると、こんなような記述があると思います。

#listen_addresses='localhost'

#port=5432

いろいろと文献をあさってみると、listen_addressesってのは↓こんな感じの役目を果たす設定のようです。

listen_addressesは、postmasterがクライアントアプリケーションからの接続を監視するTCP/IPホスト名かアドレスを設定します。

postmasterとか何言ってんのかよく分かんないけど、ようは外部からの接続を受け付けたければここにそのIPアドレスを書いてやれよってことなんだと思います。

デフォルトはlocalhostのみ許可されているので、ここを書き換えます。

あ、#でコメントアウトされている場合はもちろんそれもはずします。

listen_addresses='localhost,IPアドレス'

localhostの後ろにカンマ区切りで、受信側の、つまりファイルを変更している自身のサーバーのIPアドレスを追記します。複数ある場合は複数をカンマ区切りで。

ちなみに、何でもかんでも受け付けるようにするには、以下のように書けばいいみたいです。

listen_addresses='*'

いわゆるワイルドカードですね。こうしとけば何でも受け付ける。来るもの拒まず。誰とでも寝てしまう人のようですね。

そういえば、アスタリスクって、見えなくもないね。うん、これ以上言うのはよそう。

あとPostgreSQLのポートはデフォルトが5432らしいんですが、もし他のポートにするならport=5432のコメントアウトをはずして違う数値を入れればいいみたいです。今回はその辺はやってないのでそこ変えるだけでポート変えられるのかはよく分からんです。

pg_hba.confの中身を変更する

たぶんpostgresql.confと同じディレクトリにpg_hba.confってファイルがあると思います。そしてそこにはこんなことが書いてあると思います。

# IPv4 local connections:
#host    all         all         127.0.0.1/32          ident
host    all         all         127.0.0.1/32       trust

説明はさておき、とりあえずこの下に以下のような一行を追加します。

host all all IPアドレス/32 trust

こっちに書くIPアドレスは送信側のIPアドレスです。アクセスしようとしている側ですね。trustってのは認証などが不要でこのIPアドレスからの通信は問答無用で許可しまっせってなことです。trustのところをmd5とかにすれば、通信にパスワードが必要になったりします。

iptablesの設定を変更する

iptablesってのはファイアウォールです。ファイアウォールってのはとりあえず何か外からの通信をいろいろとブロックしてくれる機能です。ウォールですからね。

iptablesはsysconfigみたいな名前のディレクトリの中にあると思います。sysconfigってのはサーバーによって置き場が違うんでしょうか…?

今回は外からTCP/IP通信によって接続をしたかったので、ポート5432番のTCPをあける必要があります。

それには、こんなような一文をiptablesの中に記述すればオッケー。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT

ただ、一つだけ注意しないといけないのは、この一文を記述する場所が微妙に影響するということです。

iptablesの中を見ると、こんなような一文もあると思います。

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

上記の2つの文はどっちもそうなんですが、-Aで始まってますよね。この-Aで始まるやつはファイルの上から順番にファイアウォールのルールが適用される的な感じになっているらしいのです。

そして-A~REJECT~っていう上の文は、そこの行に来るまでに許可した設定した以外の全ての通信を許可しないみたいな意味を持つ設定らしいです。

説明が下手であれなんですが、ようはこの~REJECT~より下の行にファイアウォールの設定を書いても、適用されないってことですね。それより前に書いておかないと、アクセスが許可されない。今回、僕もこれにやられました。

上記の3つの設定が済んだら、PostgreSQLやiptablesを再起動しましょう。

再起動のコマンドはこんな感じです。

# /etc/init.d postgresql restart

# /etc/init.d iptables restart

# services postgresql restart とかでもOKみたいですね。

おそらくはこれで動くようになる…はずです。

今回の僕は、iptablesとは別にクライアントさんが独自でファイアウォールの設定をしていたみたいで、その辺の兼ね合いでなかなかDBの接続が実現できませんでしたが、まあそういうケースはあまり多くない……んですかね? どうなんだろ。

とりあえず、自分で理解できている範囲で設定を書いてみました。

僕は一度自分で設定をしたからこれを見れば次も同じ設定ができるとは思いますけど、しかし全く分からない人が参考文献としてここを訪れたときに、果たしてこんな説明で通じるだろうか……?

ま、そのときは別の参考サイトさんのところに行くから、大丈夫だよね(←投げやり)

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

プログラマのまっちーです。酒が大好きです。ある一定量のお酒を飲むと壊れたレディオモードに入り、同じことを繰り返す癖があります。宜しくお願いいたします。

このメンバーの記事をもっと読む