CentOS 5.6 をメールサーバーに (Postfix のインストール)

前回の記事で、MySQL をサポートするようにし (PostgreSQL のサポートを解除し) た Postfix の RPM パッケージを作成した。 今回はその RPM パッケージをインストールし、実際に使えるように設定する。

前回の記事で作成した RPM パッケージは、/usr/src/redhat/RPMS/i386/postfix-2.3.3-2.3.centos.mysql_pgsql.i386.rpm ファイルとして作成されている。
ここで作業しているのは 16bit 版の CentOS のため、ディレクトリ名とファイル名に「i386」が含まれている。
32bit 版ならここは「x86_64 (/usr/src/redhat/RPMS/x86_64/postfix-2.3.3-2.3.centos.mysql_pgsql.x86_64.rpm)」 になるはずだ。
また、ファイル名に「pgsql」が含まれているが、前回の記事で PGSQL シンボルを ‘0’ にしてコンパイルしているため、ファイル名の示唆に反して PostgreSQL のサポートはない。

なお、同じディレクトリにある postfix-pflogsumm-2.3.3-2.3.centos.mysql_pgsql.i386.rpm ファイルと postfix-debuginfo-2.3.3-2.3.centos.mysql_pgsql.i386.rpm ファイルは、今回は必要としない。

ところで、この Postfix をインストールする前に、Postfix が yum でのアップデートの対象にならないようにしておく。
これをしておかないと、yum を使ってパッケージのアップデート ( yum update コマンドの実行など) をするときに、ここでインストールした Postfix が CentOS のリポジトリに登録されている MySQL をサポートしていない Postfix に置き換わってしまう
Postfix を yum のアップデート対象から外すには、/etc/yum.conf ファイルに以下の一行を追加すればいい。

もしも「execlude=」の行が既にあるときは、 exclude=kernel*,postfix* のように既にある「exclude=…」にカンマで区切って「postfix*」を付け加える。 /etc/yum.conf ファイルを編集、修正して Postfix が yum でのアップデートの対象にならないようにしたら、MySQL をサポートするようにコンパイルした Postfix を以下のコマンドでインストールする。

Postfix をインストールしたところで、MySQL のサポートを確認するために、 postconf -m コマンドを実行する。 以下のように出力結果の中に mysql という文字列が含まれていれば大丈夫だ。

インストールした Postfix が MySQL をサポートしていることを確認できたので、続いて Postfix の設定をする。
まずは、メール アカウントを保存するデータベースに Postfix が接続するためのユーザーとそのパスワードを以下のコマンドを使って、MySQL サーバーに登録する。 ここで登録するユーザーの権限は、検索クエリー (SELECT 文) の実行だけで十分だ。

パスワードの要求には MySQL サーバーの root ユーザーのパスワードを入力する。 なお、MySQL サーバーの root ユーザーのパスワードが空のときは -p オプションを省略できる。
PostfixAdmin をインストールしたときに作成したデータベースが ‘postfix’ であるとし、これに接続するユーザーを ‘postfixuser’ に、そのパスワードを ‘postfixpass’ にしている。

次に、Postfix がデータベースから必要な情報を取得するための定義ファイルを作成する。
データベースにはこのサーバーが受信するべきメール ドメイン、メール ドメインに含まれるメール アカウント、メール アカウント毎の受信したメールを保存するディレクトリ、メール アカウント毎の転送先メール アドレスなど、多くの情報が保存されている。
これらの情報のそれぞれに対して取得方法が微妙に異なるため、以下の 6 ヶの定義ファイルを作成する

/etc/postfix/virtual_domains.cf
/etc/postfix/virtual_mailbox.cf
/etc/postfix/virtual_alias_domain_mailbox.cf
/etc/postfix/virtual_alias.cf
/etc/postfix/virtual_alias_domain.cf
/etc/postfix/virtual_alias_domain_catchall.cf

データベースからメール アカウントなどの情報を取得するための定義ファイルを作成したら、続いて /etc/postfix/main.cf ファイルを以下のように編集する
本当なら、パッケージに標準で添付されているファイルを編集するのは避けたいところだが、Postfix では 前々々回の Apache や PHP前々回の記事の PostfixAdmin のようにはできず、パッケージに添付されている /etc/postfix/main.cf ファイルを直接編集するしかない。

/etc/postfix/main.cf (編集前)
/etc/postfix/main.cf (編集後)

main.cf ファイル中の virtual_minimum_uid パラメーター (327 行目) と virtual_uid_maps パラメーター (328 行目)、および virtual_gid_maps パラメーター (334 行目) の値は、 awk -F ':' '$1 == "mail" { print "uid=" $3 " gid=" $4; }' /etc/passwd コマンドを実行した結果に基づく。
上のコマンドを実行した結果の ‘uid=’ の値を virtual_minimum_uid パラメーターと virtual_uid_maps パラメーターに、’gid=’ の値を virtual_gid_maps パラメーターに記述する。

筆者の環境では ‘uid=8 gid=12’ という結果であったため、該当箇所は以下のようになる。

ここで得た値 (筆者の環境では ‘uid=8 gid=12’) は、後ほどインストールする Dovecot の設定でも使用する。

これで Postfix の基本的な設定ができた。
後はサービスの登録をするだけだが、その前にローカル アドレスの転送先を調整しておこう。

PostfixAdmin でメール ドメインを登録するときに「デフォルト転送先の追加」というチェックボックスがある。
これをチェックすると、ドメインの登録と同時に、そのドメインにいくつかの転送メール アドレスが一緒に登録される。

Checked 'Add Default Aliases'

ここで登録される転送メール アドレスは、PostfixAdmin の設定ファイルの $CONF['default_aliases'] で指定されている。
以前の記事で PostfixAdmin をインストールしたときに $CONF['default_aliases'] を以下のように指定している。

/opt/postfixadmin/config.local.php (抜粋)

これは例えば、PostfixAdmin で「デフォルト転送先の追加」にチェックを入れて example.dom というメール ドメインを 登録すると、自動的に以下の転送アドレスが作成されるようになっている。

  • abse@example.dom (»転送先») abuse
  • hostmaster@example.dom (»転送先») hostmaster
  • postmaster@example.dom (»転送先») postmaster
  • webmaster@example.dom (»転送先») webmaster

つまり、$CONF['default_aliases'] で ‘=>’ の左辺が転送元のメール アドレスの @ の左側に (@ の右側は登録するメール ドメイン) になり、‘=>’ の右辺がそのまま転送先のメール アドレスになる。
以前の記事で PostfixAdmin をインストールしたときの設定ファイルの $CONF['default_aliases'] の指定では、転送先メール アドレスになる右辺にはドメインを付けておらず、転送先がローカルのメール アドレスになるようにしてある。
これらのローカルのメール アドレスの扱いをきちんとしておかないと、これらに宛てたメールがすべてエラーになってしまう。

そこで、これらのローカルのメール アドレス宛てのメールを更に転送させることにする。
具体的には、これら四つのローカル アドレスの転送先を root にし、加えて root の転送先を管理者のメール アドレス (ここでは admin@admindomain.example.dom) にしよう。

CentOS の場合、ローカル アドレスの転送先を指定するファイル (/etc/aliases) には、すでに多くのローカル アドレスが登録されている。
そのほとんどが、サービス動作するアプリケーションのためのアドレスだが、postmaster や webmaster といったアドレスも最初から登録されている。
そこで、以下のコマンドを実行して転送先ファイルを正しく作り直しておく。

/etc/aliases ファイルを編集、修正し、更に newaliases コマンドを実行してその修正内容を有効にしたら、 chkconfig postfix on コマンドを実行して Postfix をサービスとして登録するところだが、それをするのはちょっと早い。

なぜなら、CentOS では OS をインストールしたときに MTA として既に Sendmail が起動しているからだ。
このまま起動すると SMTP のポートがバッティングを起こして、後から起動した方 (この場合は多分 Postfix) がエラーになってしまう。
このため、先に Sendmail がサービスとして起動しないように設定し、なおかつ Sendmail を停止してから Postfix を起動するべきだ。
具体的には、以下のようなコマンドを実行することになるだろう。

更に加えて、デフォルトの MTA を Postfix に変更するために、 alternatives --config mta コマンドを実行する。

上のように、「/usr/sbin/sendmail.sendmail」と「/usr/sbin/sendmail.postfix」の二つの選択肢が表示されると思う (インストールされている MTA の数によっては他の選択肢が存在する可能性もある)。
デフォルトで使いたい MTA は Postfix なので「/usr/sbin/sendmail.postfix」の方、ここでは「2」を入力して、Enter を押せば、デフォルトの MTA が Postfix に変更される。

2011.11 月 14 日追記
CentOS 5.6 をメールサーバーに (Postfix のインストール [補足])」で Postfix のパッケージをコンパイルしない方法を解説した。

「CentOS 5.6 をメールサーバーに (Postfix のインストール)」への2件のフィードバック

  1. もし教えていただけたら幸いです
    このサイトを見てsentOS5.6でメールサーバを構築しています。
    このページのvirtual関係の記述をすると ローカル配信でSMTPが応答しなくなります
    何か考えられるミスとかありますでしょうか?

    1. どのような現象が起きているのでしょうか
      現象を確認した手順と結果、そのときのログが分からないと、原因を推測することすらできません
      Postfix がエラーで落ちているのだとは思いますが、この記事に書いた手順の何処をミスってもその可能性は十分にあり得ます
      もちろん、Potfix が間違った設定に基づいた動きをしている可能性もあります

コメントを残す