Postfix


Postfix は比較的新しい MTA (Message Transfer Agent。つまり SMTP サー バのこと)である。MTA といえば sendmail が有名だし、世界的に見ても圧倒的 なシェアを誇っている(と思う)。が、sendmail は肥大化しすぎたし、過去のし がらみを引きずりながら肥大化したためセキュリティホールがしょっちゅう見つ かるし、設定が難解なので、違う MTA に乗り換えたいと考えていた。

で、他の MTA といえば、qmail がメジャーであるが、こいつは仕組みが難解 である。どうにも概念が理解できない。一度試そうと思ってドキュメントを読み 始めて挫折した(^^;
そこで、別の MTA として Postfix を選んでみた。

これまでは、僕は自分のマシン(FreeBSD)上では MTA は動かしていなかった。 グループのマシン上で動作している sendmail に配送をお願いしている形になっ ていた。当然、このマシンは UX/4800 が載っている;-p。sendmail の評価もか ねているわけだ。が、こいつが MIPS の R4000 が載ってるんだけど、はっきり いって遅い。自分の PC が新しくなった(Pentium !!! 667MHz)ため、さらに、際 立って遅く感じる。NFS サーバにもなってるんだけど、もう NFS を使うのもや めようかと思うぐらい...。

そんなわけで、自分のマシン上で MTA を動作させてみようと思った次第であ る。

さて、Postfix の FreeBSD 4.0-RELEASE(4.1 にはできない事情があるの (;_;))へのインストールは極めて簡単である。これが UX/4800 へのインストー ルだとこう単純には行かないだろうなぁ、としみじみ思う。が、仕事上、 UX/4800 に載せる MTA は絶対 sendmail と決まっている(グループの担当物件の 評価を兼ねているんで...)。

で、インストール手順。今回は開発版である snapshot-20000531.tar.gz を インストールしてみた。いくら開発版とはいえ、アーカイブファイル名をもうちょっ と分かるやつにしてくれよ〜、と思ってしまった。ま、それはいいとして。

インストールに先だって、Postfix 用のユーザを作成しておく。ユーザ名は postfix 。id は何番だって構わない。/stand/sysinstall を使って作成。

次に、ソースを展開。そのディレクトリに移動。そしていきなり make を実行。

% zcat snapshot-20000531.tar.gz |tar -xvf -
% cd snapshot-20000531
% make

FreeBSD 4.x なら、これで make が通る(ラクチン)。が、make install がちょっ と面倒。といっても、対話的にインストールパスを入力していくだけなんだけど。 質問される項目は以下の通り。あらかじめこれらのパスを考えておきましょう。

  • install_root
    インストールする際のルートディレクトリ。この後設定するパスは、 install_root からの相対パスとして使用されるようである。この後設定するパ スを / から始まるように書いても、相対パスとして使用されるのでややこしい。 混乱をさけるために、install_root は / とした方が無難である。

  • tmpdir
    インストール時のテンポラリディレクトリ。デフォルトはカレントディレクトリ だけど、僕は /tmp を指定した。別にどこだっていいでしょう。これは。

  • config_directory
    設定ファイル群置き場。デフォルトで /etc/postfix になっている。/etc 直下 にややこしいので、デフォルトのまま。

  • daemon_directory
    デーモンの実体置き場。デフォルトは /usr/sbin なんだけど、FreeBSD では、 sendmail 関係は /usr/libexec/sendmail 配下なので、それにならって、 /usr/libexec/postfix とする。

  • queue_directory
    queue の場所。デフォルトに従って /var/spool/postfix 。

  • sendmail_path
    sendmail コマンド(postfix についてくるコマンドの方ね)のインストールパス。 デフォルトは /usr/sbin/sendmail だけど、もともとインストールされている sendmail 関係のコマンドと分けたい、postfix 関連コマンドの場所をまとめて おきたい、ので、/usr/libexec/postfix とする。デーモン類と同じ場所ね。

  • newaliases_path
    newaliases コマンドをインストールするパス。sendmail_path 同様 /usr/libexec/postfix にする。

  • mailq_path
    上と同じく mailq をインストールするパス。/usr/libexec/postfix にした。

  • mail_owner
    queue ファイルのオーナーを指定する。あらかじめ作成した postfix ユーザを 指定する(デフォルト)。

  • setgid
    デフォルトのまま no。

  • manpages
    マニュアルをインストールするパス。デフォルトのまま /usr/local/man。

パスを決めたら make install を実行。これは root 権限で。

% su
# make install
対話的に入力を求められるので、あらかじめ決めておいたパスを設定。設定した パスにインストールされる。

FreeBSD 4.x では /usr/sbin/sendmail やら /usr/sbin/newaliases 等の sendmail 関連のコマンドは /usr/sbin/mailwrapper へのシンボリックリンクに なっていて、 /etc/mail/mailer.conf を読んで実際に起動するコマンドを決め ている(らしい)。なので、Postfix が用意したコマンドを実行するように /etc/mail/mailer.conf を以下のように書き換えてやる。

# $FreeBSD: src/etc/mail/mailer.conf,v 1.2 1999/12/29 18:24:06 peter Exp $
#
# Execute the "real" sendmail program, named /usr/libexec/sendmail/sendmail
#
#sendmail	/usr/libexec/sendmail/sendmail
#send-mail	/usr/libexec/sendmail/sendmail
#mailq		/usr/libexec/sendmail/sendmail
#newaliases	/usr/libexec/sendmail/sendmail

#
# for postfix
#
sendmail	/usr/libexec/postfix/sendmail
send-mail	/usr/libexec/postfix/sendmail
mailq		/usr/libexec/postfix/mailq
newaliases	/usr/libexec/postfix/newaliases

次に OS のブート時に自動起動するように起動スクリプトを作成して、 /usr/local/etc/rc.d/postfix.sh としてセーブしておく。起動スクリプトの内 容はこんな感じ。

    #!/bin/sh
    
    POSTFIX="/usr/local/sbin/postfix"
    CONF="/etc/postfix/main.cf"
    
    case "$1" in
    start)
        if [ -r ${CONF} -a -x ${POSTFIX} ]; then
    	    echo -n ' Postfix'
            ${POSTFIX} $1 > /dev/null 2>&1
        fi
        ;;
    stop)
        if [ -x ${POSTFIX} ]; then
            echo -n ' Postfix'
            ${POSTFIX} $1 > /dev/null 2>&1
        fi
        ;;
    *)
        ;;
    esac
2002 年 6 月 12 日更新。最近の FreeBSD に合わせて start, stop 引数を取るようにしました。

ついでに、/usr/local/etc/rc.d/postfix.sh に実行権をつけておくのを忘れ ないよーに。

# chmod +x /usr/local/etc/rc.d/postfix.sh

さて、ここまでできたら、後は Postfix の設定である。デフォルトの設定ファ イルとして /etc/postfix/main.cf が用意されているので、これをちょっとだけ 編集する。
うちの環境の場合、メールゲートウェイになっているホストが一台あって、社内 の MTA は必ずそのホストにメールの配送を依頼する。つまり relay 。直接、配 送先ホストと SMTP でおしゃべりするわけではない。なので、relay の設定をし てやる。

relayhost = xxx.hogehoge.co.jp

と書いてやるだけ。これで、Postfix に対してメールの配送をお願いしたら、 xxx.hogehoge.co.jp がリレーしてくれる。

受信側に関しては、僕の場合は、受信サーバは従来通り UX/4800 にメールが 配送されるようにしておくため、自分のマシン上の Postfix についての設定は 特に行わない。つまり、メールの送信にしか Postfix を使わないつもり。なん でかってーと、メールサーバになっている UX/4800 にメールが配送された時点 で .forward から porcmail が起動して、自動処理しているため。メールが配送 されるホストを自分の FreeBSD に変更すると、この辺の環境を移行しなければ ならず、自分が不在時(つまり僕の FreeBSD マシンが落ちている状態)に、外部 から送られてきたメールの自動処理がされなくなる。これは仕事上困るので、し かたがない。

あとは、最近では当たり前となっている SPAM 防止のための relay 制限。と いっても社内のホストだし、外部から SPAM の踏み台にされることはあり得ない。 また、デフォルトの設定で、同一ネットワーク上のホストからの relay しか受 け付けないため、そのままでも問題ないんだけど、社内のセキュリティ監査とか もたまにあるので、一応 relay 制限をかけてみた。
僕以外使わないので、超厳しい制限だけど、自ホスト以外の relay は許可しな いようにした。これは mynetworks というパラメータで指定する。ここに許可す るネットワークアドレスを書いたり、IP アドレスを書いたりすれば良い。なの で、僕の場合、

mynetworks = 10.xx.xx.xx 127.0.0.1

としておいた。つまり、localhost と、自分の IP アドレス。

現時点では、自分の環境で必要な設定はこれだけ。設定できたので、とりあ えず起動してみる。起動方法は

# /usr/libexec/postfix/postfix start

なんだけど、さっき書いた起動スクリプトが動くかどうかを確認することを 兼ねて、

# /usr/local/etc/rc.d/postfix.sh

を実行。ちなみに停止方法は

# /usr/libexec/postfix/postfix stop

設定ファイルの再読み込みは

# /usr/libexec/postfix/postfix reload

である。

ps で確認して、こんな感じにプロセスが動いていればおっけー。

[sapphire]:tetsuo% ps aux | grep postfix
root     4801  0.0  0.3   932  640  ??  Is    6:06PM   0:00.02 /usr/libexec/postfix/master
postfix  4802  0.0  0.3   928  600  ??  I     6:06PM   0:00.01 pickup -l -t fifo
postfix  4803  0.0  0.3   956  652  ??  I     6:06PM   0:00.01 qmgr -l -t fifo -u

あとは、telnet locahost smtp して、コマンドラインで SMTP で会話してみ て動作確認。違うホストから SMTP で話しかけると蹴られるのを確認。ログは sendmail と同様 /var/log/maillog に取られる。あ、当然だけど、sendmail を 起動している場合は停止しておかなければならないし、OS ブート時に sendmail が立ち上がらないように /etc/rc.conf に

sendmail_enable="NO"

と書いておかないと行けない。僕の場合は、普段から自ホストで sendmail を立ち上げていなかったので、このように設定してあったけど。

というわけで、超簡単な Postfix のインストール & 設定の紹介でした。


[FreeBSD] | [TetsuoSTREAMS]