ソース コードからの Postfix インストール


1 - このドキュメントの目的

これはあなたが最小のステップで最初から Postfix を立ち上げて走らせる 手助けをするためのブートストラップドキュメントです。すでにコンパイルされた バージョンの Postfix を使っているのであれば、システムをより詳細に記述する ことを目的とした、一般的な Postfix ドキュメントを読んでいるべきです。 このブートストラップドキュメントは一般的な Postfix ドキュメントの一部とは 見なさない方がよいでしょう。

このドキュメントには Postfix システムの作成・インストール・設定の 仕方が書いてあります。これにより、次のうち一つが出来るようになります。

このドキュメントで触れる話題:

  1. このドキュメントの目的
  2. 表記方法
  3. ドキュメント
  4. サポートされたシステムでのビルド
  5. 未サポートシステムへの Postfix のポーティング
  6. コンパイルが成功した後のソフトウェアのインストール
  7. メール送信専用の Postfix の設定
  8. バーチャルインターフェースを通してメールを 送受信する Postfix の設定
  9. Sendmail の代わりに Postfix を走らせる
  10. 必要な設定ファイルの編集
  11. chroot すべきか chroot せざるべきか
  12. Postfix システムのメンテナンス

2 - 表記方法

以下の説明で

# command

と書かれたコマンドはスーパーユーザで実行します。

% command

のように書かれたコマンドは一般ユーザとして実行します。

3 - ドキュメント

ドキュメントは README ファイル (README_FILES/AAAREADME から始めてください) および HTML ウェブページ ("html/index.html" をブラウザで見てください)、 UNIX 形式のマニュアルページで得られます。

README ファイルには太字を表記するためにバックスペース文字を 使っているので、more(1) や less(1) のようなページャを使って参照してください。 バックスペース文字なしで README ファイルを印刷するには、col(1) コマンドを 使ってください。例:

% col -bx <file | lpr

Postfix をインストールする前にマニュアルページを参照するには、MANPATH 環境変数を "man" サブディレクトリに向けてください; 絶対パスを使うことを 忘れずに。

% export MANPATH; MANPATH="`pwd`/man:$MANPATH"
% setenv MANPATH "`pwd`/man:$MANPATH"

特に関心を持つべきなのは、300以上の設定パラメータ全てをリストアップした postconf(5) マニュアルページです。この テキストの HTML バージョンでは、簡単にナビゲートできるようになります。

全ての Postfix ソースファイルにはそれ自身のマニュアルページが 組み込まれています。これらの組み込まれたマニュアルページを抽出するツールは mantools ディレクトリにあります。

4 - サポートされたシステムでのビルド

ある時点で、Postfix のバージョンがサポートされているのは以下の通りです:

AIX 3.2.5, 4.1.x, 4.2.0, 4.3.x, 5.2
BSD/OS 2.x, 3.x, 4.x
Darwin 1.x
FreeBSD 2.x, 3.x, 4.x, 5.x
HP-UX 9.x, 10.x, 11.x
IRIX 5.x, 6.x
Linux Debian 1.3.1, 2.x, 3.x
Linux RedHat 3.x (January 2004) - 9.x
Linux Slackware 3.x, 4.x, 7.x
Linux SuSE 5.x, 6.x, 7.x
Mac OS X
NEXTSTEP 3.x
NetBSD 1.x
OPENSTEP 4.x
OSF1.V3 - OSF1.V5 (Digital UNIX)
Reliant UNIX 5.x
Rhapsody 5.x
SunOS 4.1.4 (January 2004)
SunOS 5.4 - 5.9 (Solaris 2.4..9)
Ultrix 4.x (well, that was long ago)

または非常に類似したもの。

4.1 - はじめに

Solaris では、"make" コマンドやその他のソフトウェア開発用ユーティリティは /usr/ccs/bin にあるので、コマンド検索パスに /usr/ccs/bin を「必ず」 含めなければいけません。

Postfix を複数のアーキテクチャ用にビルドする必要がある場合、"lndir" コマンドを使ってソースファイルにシンボリックリンクを張ったシャドウツリーを 作って下さい。"lndir" は X11R6 の一部です。

ビルド中に "make: don't know how to ..." というようなメッセージが 出る場合、Postfix の一番上のディレクトリに行き、次のコマンドを 実行することで回復できます:

% make -f Makefile.init makefiles

他のマシンでビルドした後の Postfix ソースコードををコピーしてきた場合、 まず一番上のディレクトリで次のコマンドを実行するのがよいでしょう。

% make tidy

これは他でコンパイルした時に残された、システムに依存する部分を 除去します。

4.2 - 利用するコンパイラ

GCC を用いてビルドする場合、およびネイティブのコンパイラの方がよいと 報告されているシステムについてはそのコンパイラを使ってビルドする場合、 Postfix ソースツリーの一番上のディレクトリに cd し、次のコマンドを 実行するだけです:

% make

デフォルトではないコンパイラを使用するには、コンパイラの名前を 以下のように指定する必要があります:

% make makefiles CC=/opt/SUNWspro/bin/cc        (Solaris)
% make

% make makefiles CC="/opt/ansic/bin/cc -Ae"     (HP-UX)
% make

% make makefiles CC="purify cc"
% make

最適化は自動的にオフになる場合があります。

4.3 - オプション機能をつけてビルドする

デフォルトでは、Postfix はオプション機能があまりないメールシステムとして ビルドします。サードパーティデータベースなどのサポートは Postfix がコンパイル されるときに設定されなければいけません。以下のドキュメントでは、拡張機能の サポートをつけて Postfix をビルドする方法を記述します:
Postfix 拡張機能 ドキュメント 利用可能
Berkeley DB database DB_README Postfix 1.0
LDAP database LDAP_README Postfix 1.0
MySQL database MYSQL_README Postfix 1.0
Perl compatible regular expression PCRE_README Postfix 1.0
PostgreSQL database PGSQL_README Postfix 2.0
SASL authentication SASL_README Postfix 1.0

注意: TLS (認証に基づく SMTP セッションの暗号化と証明) および IP バージョン 6 のサポートはまだ Postfix とは切り離されていますが、 まもなくマージされるでしょう。

4.4 - ビルトインパラメータのデフォルト設定を上書きする

全ての Postfix 設定パラメータは、一つを除いて Postfix 設定ファイルを 編集することで変更できます: 例外は Postfix 設定ファイルの場所を指定する パラメータです。/etc/postfix 以外の設定ディレクトリで Postfix をビルド するには、次のコマンドを使います:

% make makefiles CCARGS='-DDEF_CONFIG_DIR=\"/some/where\"'
% make

「重要」: 引用符を正しくつけてください。これらの記述がよく問題を 起こします。

この方法で指定可能なパラメータ:

マクロ名 デフォルト値 典型的なデフォルト
DEF_COMMAND_DIR command_directory /usr/sbin
DEF_CONFIG_DIR config_directory /etc/postfix
DEF_DAEMON_DIR daemon_directory /usr/libexec/postfix
DEF_MAILQ_PATH mailq_path /usr/bin/mailq
DEF_HTML_DIR html_directory no
DEF_MANPAGE_DIR manpage_directory /usr/local/man
DEF_NEWALIAS_PATH newaliases_path /usr/bin/newaliases
DEF_QUEUE_DIR queue_directory /var/spool/postfix
DEF_README_DIR readme_directory no
DEF_SENDMAIL_PATH sendmail_path /usr/sbin/sendmail

4.5 - 数千のプロセスをサポートする

1000 以上の配送プロセスを動かすような、非常に大きなアプリケーションの ために Postfix をビルドするには、FD_SETSIZE マクロの定義を select() が正しく動くように上書きする必要があるかもしれません:

% make makefiles CCARGS=-DFD_SETSIZE=2048

注意: 上記は Linux の一部のバージョンでは効果がありません。これらの システムでは FD_SETSIZE の値はドキュメントにないインターフェースを使う ことでのみ変更できるようです。現在のところ、それは<bits/types.h> を直接含み (これは許されません)、__FD_SETSIZE マクロを上書きすることを 意味します。ドキュメントにないインターフェースはいつ警告なしに変更されるか 分からないことに注意してください。

4.6 - 最後に、Postfix のコンパイル

コマンド

% make

が成功したら、Postfix のインストール (セクション6) に進んでください。

コンパイルエラーメッセージが出る場合、次はウェブを検索したり、 postfix-users@postfix.org メーリングリストに聞く番かもしれませんが、 初めにメーリングリストのアーカイブを検索することを忘れないでください。 メーリングリストアーカイブのいくつかは http://www.postfix.org/ から リンクされています。

5 - 未サポートシステムへのポーティング

それぞれのシステムタイプはユニークな名前で識別されます。例: SUNOS5, FREEBSD4 など。新しいシステムに Postfix をポーティングする場合、まず新しい システムの SYSTEMTYPE 名を選んで下さい。同じシステムの違うリリースが 混乱なくサポートできるように、名前にはオペレーティングシステムのメジャー バージョンを含むように (SUNOS4 や LINUX2 のように) しなければいけません。

ソースコードの一番上のディレクトリにある "makedefs" シェルスクリプトに 新しいシステムが確実に認識されるように条件文を付け加え、正しいシステム 依存の情報を出すようにしてください。コードはユーザの PATH 設定に依存 しないことを確認してください; もしシステムが様々な UNIX の環境 (例えば BSD と SYSV)を提供できるならば、エミュレートされたものではなく、 ネイティブな形式であることを確認して下さい。

util/sys_defs.h インクルードファイルの中に #ifdef SYSTEMTYPE セクションを付け加えます。新しいマクロを作る必要があるかもしれません。 マクロは HAS_DBM や FIONREAD_IN_SYS_FILIO_H のようなわかりやすい 名前にして下さい。

それぞれのソースファイルで #ifdef SYSTEMTYPE に依存性を書かないことを 強く推奨します。これは最も速い解決法に見えますが、時間が経つと保守が 難しくなっていきます。さらに、次のポーティングの際に全てのソースコードに 再び #ifdef を書く必要性が生じてしまいます。

6 - コンパイルが成功した後のソフトウェアの インストール

この文章はソースコードからの Postfix のインストール方法を記述して います。他のシステムに配布するためにパッケージをビルドするので あれば、PACKAGE_README ファイルを参照 してください。Mac OS X でソースから Postfix をインストールする場合の情報は auxiliary/MacOSX/README-INSTALL.OSX を参照してください。

6.1 - Sendmail のバイナリの保存

「重要」: もし現在インストールされている sendmail を Postfix で「置き換える」のであれば、古い sendmail をしばらくの間走らせて おいて、メールキューを消す必要があります。スーパーユーザで次のコマンドを 実行して下さい (sendmail, newaliases や mailq コマンドは別の場所にあるかも しれません)。

# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
# mv /usr/bin/mailq /usr/bin/mailq.OFF
# chmod 755 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF \
    /usr/bin/mailq.OFF

6.2 - アカウントとグループの作成

初めて Postfix をインストールする前には、アカウントとグループを作る 必要があります:

6.3 - Postfix のインストール

コンパイルされたソースコードから Postfix をインストール、もしくはアップ グレードするには、スーパーユーザで以下のいずれかのコマンドを実行します:

# make install       (インタラクティブバージョン、最初のインストール)

# make upgrade       (非インタラクティブバージョン、アップグレード用)

6.4 - Postfix の設定

Postfix を走らせたい方法によって、以下のセクションから選んで進んで 下さい:

7 - メール送信専用の Postfix の設定

Postfix をメールの送信のみに使用するのであれば、インストールされた sendmail の設定を変更する必要はありません。かわりに、mail user agent (MUA, メーラ)が直接 Postfix sendmail プログラムを呼び出すように設定 します。

section 10 の"必要な設定ファイルの編集"に従い、 section 11 の文章 "chroot すべきか chroot せざるべきか" を再検討してください。

本物の sendmail と衝突しないために、/etc/postfix/master.cf の `smtp inet' エントリはコメントアウトしなければなりません。smtpd サービスを定義している 行の前に "#" をつけてください:

/etc/postfix/master.cf:
    #smtp      inet  n       -       n       -       -       smtpd

Postfix を起動するには:

# postfix start

とするか、 Postfix の sendmail コマンドを:

# sendmail -bd -qwhatever

として、maillog ファイルでエラーメッセージがないか探してください。 パス名は /var/log/maillog, /var/log/mail, /var/log/syslog またはそれ以外 です。典型的にはパス名は /etc/syslog.conf ファイルで定義されます。

% egrep '(reject|warning|error|fatal|panic):' /some/log/file

注意: 最も重要なエラーメッセージが最初にログに記録されます。それ以降の メッセージはあまり役に立ちません。

メールキューを調べるには、次のコマンドのいずれかを使います:

% mailq

% sendmail -bp

% postqueue -p

section 12 の "メンテナンス" も参照してください。

8 - バーチャルインターフェースを通してメールを 送受信する Postfix の設定

それ以外に、バーチャルなインタフェースアドレスで Postfix を走らせる ことによって、sendmail の設定には手をつけずに Postfix システムをメールの送信 「および」受信に使うことができます。単に mail user agent が Postfix の sendmail プログラムを直接呼び出すように設定するだけです。

/etc/postfix/main.cf ファイルで、次のように指定します:

/etc/postfix/main.cf:
    myhostname = virtual.host.tld
    inet_interfaces = $myhostname
    mydestination = $myhostname

section 10 の"必要な設定ファイルの編集"に従い、 section 11 の文章 "chroot すべきか chroot せざるべきか" を再検討してください。

Postfix を起動するには:

# postfix start

とするか、 Postfix の sendmail コマンドを:

# sendmail -bd -qwhatever

として、maillog ファイルでエラーメッセージがないか探してください。 パス名は /var/log/maillog, /var/log/mail, /var/log/syslog またはそれ以外 です。典型的にはパス名は /etc/syslog.conf ファイルで定義されます。

% egrep '(reject|warning|error|fatal|panic):' /some/log/file

注意: 最も重要なエラーメッセージが最初にログに記録されます。それ以降の メッセージはあまり役に立ちません。

メールキューを調べるには、次のコマンドのいずれかを使います:

% mailq

% sendmail -bp

% postqueue -p

section 12 の "メンテナンス" も参照してください。

9 - Sendmail の代わりに Postfix を走らせる

Postfix のインストールに先立ち、現在動いている sendmail のプログラム ファイルを6章に記載したように保存します。未配送メールを 全て送るために、最低数日間は古い sendmail を動かし続けるよう気をつけて 下さい。そうするために、 sendmail を止めて、次のようにリスタートします:

# /usr/sbin/sendmail.OFF -q

注意: これは古い sendmail の文法です。新しいバージョンはメール送信や キューを走らせるために別のプロセスを使います。

下にある "必要な設定ファイルの編集" セクションを参照した後、次のように Postfix システムを起動します:

# postfix start

とするか、郷愁に浸りたければ、Postfix の sendmail コマンドを:

# sendmail -bd -qwhatever

として、maillog ファイルでエラーメッセージがないか探してください。 パス名は /var/log/maillog, /var/log/mail, /var/log/syslog またはそれ以外 です。典型的にはパス名は /etc/syslog.conf ファイルで定義されます。

% egrep '(reject|warning|error|fatal|panic):' /some/log/file

注意: 最も重要なエラーメッセージが最初にログに記録されます。それ以降の メッセージはあまり役に立ちません。

メールキューを調べるには、次のコマンドのいずれかを使います:

% mailq

% sendmail -bp

% postqueue -p

section 12 の "メンテナンス" も参照してください。

10 - 必要な設定ファイルの編集

注意: このセクションでカバーしている内容は、 BASIC_CONFIGURATION_README ドキュメントでより詳細に書かれています。以下に示された情報は経験豊富な システム管理者をターゲットにしています。

10.1 - Postfix 設定ファイル

デフォルトでは Postfix の設定ファイルは /etc/postfix にあります。最も 重要な2つのファイルが main.cf と master.cf です; これらのファイルは root が 所有する必要があります。誰か他の人に main.cf もしくは master.cf (および その親ディレクトリ) の書き込み権を与えることは、その人に root の特権を 与えることを意味します。

/etc/postfix/main.cf では、最低限の数の設定パラメータを設定する必要が あるでしょう。Postfix 設定パラメータはシェル変数に似ていますが、2つの重要な 違いがあります: 1つ目は Postfix は UNIX シェルが理解するような引用符を 理解しないということです。

設定パラメータは次のように指定します:

/etc/postfix/main.cf:
    parameter = value

そして、名前の前に "$" をつけることでそれを使います:

/etc/postfix/main.cf:
    other_parameter = $parameter

値が与えられる前に $parameter を使うこともできます (これが UNIX シェル変数との2つ目の主な違いです)。Postfix 設定言語は無精な評価方法を 使っており、実行時に必要となるまでパラメータの値を参照しません。

main.cf や master.cf ファイルを変更するたびに、実行中のメールシステムを 更新するために次のコマンドを実行してください:

# postfix reload

10.2 - 修飾されていないアドレスのデフォルトドメイン

まずはじめに、修飾されていないアドレス (すなわち @domain.tld がない アドレス) に付け加えるドメイン名を設定しなければいけません。 "myorigin" パラメータのデフォルトは ローカルのホスト名ですが、非常に小さなサイトではこれで十分でしょう。

いくつか例示します (1つだけ使ってください):

/etc/postfix/main.cf:
    myorigin = $myhostname    ("user@$myhostname" としてメールを送信)
    myorigin = $mydomain      ("user@$mydomain" としてメールを送信)

10.3 - ローカルで受信するドメイン

次に Postfix のシステムがローカルで配送すべきメールアドレスを設定する 必要があります。

いくつか例示します (1つだけ使ってください):

/etc/postfix/main.cf:
    mydestination = $myhostname, localhost.$mydomain, localhost
    mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    mydestination = $myhostname

最初の例はワークステーションに適しており、2番目はドメイン全体のメール サーバに適しています。3番目の例はバーチャルホストインターフェースで実行 している場合に使います。

10.4 - プロキシ/NAT インターフェースアドレス

proxy_interfaces パラメータには Postfix がプロキシやネットワークアドレス変換ユニットを 通してメールを受信する全てのネットワークアドレスを指定します。 ネットワークアドレスの代わりに、象徴的なホスト名を指定することもできます。

「重要」: あなたのシステムが他のドメインのバックアップ MX ホストで ある場合、プロキシ/NAT 外部アドレスを指定しなければいけません。そう しないと、プライマリ MX ホストがダウンしているときにメール配送ループが 生じてしまいます。

例: NAT ボックスの背後にあってバックアップ MX ホストを動かしている ホスト。

/etc/postfix/main.cf:
    proxy_interfaces = 1.2.3.4 (プロキシ/NAT 外部ネットワークアドレス)

10.5 - 中継を受けるべきローカルクライアント

マシンがオープンネットワークにある場合、そのマシンを通してインター ネットへメールをリレーすることを許可するクライアント IP アドレスを指定 しなければいけません。デフォルトの設定はマシンがつながっている サブネットワーク全てです。これでは多過ぎるクライアントにリレー許可を 与えることがあります。私自身の設定:

/etc/postfix/main.cf:
    mynetworks = 168.100.189.0/28, 127.0.0.0/8

10.6 - よそからのメールを中継すべき配送先

マシンがオープンネットワークにある場合、よそからのメールを転送するかどうかも 指定しなければいけません。デフォルトの設定では、 $mydestination にリストアップ された全てのドメイン (およびそのサブドメイン) へメールを転送します。 推奨設定 (1つだけ使ってください):

/etc/postfix/main.cf:
    relay_domains =            (よそからのメールを転送しない)
    relay_domains = $mydomain  (自分のドメインとそのサブドメイン)
    relay_domains = $mydomain, other.domain.tld, ...

10.7 - オプション: リモート配送用のスマートホストを設定する

システムがファイアウォール内にある場合は、 relayhost の設定をする必要が あります。できるなら Postfix が DNS 探索を使えるように、そしてプライマリの MX ホストがダウンしている時にセカンダリの MX ホストを利用できるように組織の ドメイン名を設定します。そうでなければ、単に決めうちされたホスト名を 設定します。

いくつか例示します (1つだけ使ってください):

/etc/postfix/main.cf:
    relayhost = $mydomain
    relayhost = [mail.$mydomain]

[] で囲まれた形式では、DNS の MX レコードは無視します。

デフォルトでは、SMTP のクライアントはリレーホストを設定した場合でも 送信及び受信アドレスを DNS 探索します。もし DNS サーバにアクセスできない のであれば、SMTP クライアントの DNS 探索を次のように止めます:

/etc/postfix/main.cf:
    disable_dns_lookups = yes

STANDARD_CONFIGURATION_README ファイルに、より多くのファイアウォール内やダイアルアップネットワーク用の ヒントや tips があります。

10.8 - aliases データベースを作成する

最後に、Postfix の前に sendmail を使っていないのであれば、以下のコマンドで エイリアスデータベースを作る必要があります。

# newaliases
# sendmail -bi

root や postmaster のエイリアスが実在の人にメールが転送されるように なっているか確かめて下さい。Postfix はローカルの状態に適応できるサンプル aliases ファイルを /etc/postfix/aliases に用意しています。

11 - chroot すべきか chroot せざるべきか

Postfix のデーモンは chroot 監獄で走るように (master.cf で) 設定する ことができます。プロセスは低い特権レベルに固定されて走り、Postfix キュー ディレクトリ (/var/spool/postfix) へのアクセスしかしません。これは攻撃に 対して重要な障壁になります。この障壁は通り抜けないものではありませんが、 多少は役に立つでしょう。

メールをローカルに配送したり、非 Postfix コマンドを実行するデーモンは 例外ですが、それ以外の全てのデーモンは chroot して走らせることが可能です。

高いセキュリティが要求されるサイトはネットワークに話しかける全ての デーモンを chroot することを考えるべきです: これには smtp(8) および smtpd(8) プロセス、また lmtp(8) クライアントを含むかも 知れません。作者自身の porcupine.org メールサーバは chroot できる全ての デーモンを chroot して走らせています。

デフォルトの /etc/postfix/master.cf ファイルではどの Postfix デーモンも chroot されていません。chroot 操作を有効にするには、/etc/postfix/master.cf を 編集して下さい。方法はファイルの中に書かれています。

chroot されたデーモンは全てのファイル名の解決は Postfix キューディレクトリ (/var/spool/postfix) からの相対値であることに注意して下さい。chroot jail を うまく使うには、ほとんどの UNIX システムでいくつかのファイルやデバイスノードを 持ち込む必要があります。examples/chroot-setup ディレクトリには、さまざまな オペレーティングシステムで Postfix システムを chroot 環境で動かすための 設定のスクリプト集があります。

さらに、おそらくほとんどの場合 syslogd が Postfix キューディレクトリ内の ソケットを listen するように設定する必要があります。あるシステムでの例:

FreeBSD: syslogd -l /var/spool/postfix/var/run/log

Linux, OpenBSD: syslogd -a /var/spool/postfix/dev/log

12 - Postfix システムのメンテナンス

Postfix デーモンプロセスはバックグラウンドで走り、問題や通常の活動を syslog デーモンに渡します。ログファイル名は /etc/syslog.conf で指定します。 最低限、次のようなものが必要です:

/etc/syslog.conf:
    mail.err                                    /dev/console
    mail.debug                                  /var/log/maillog

「重要」: syslogd はファイルを作りません。syslogd を(再)起動する前に これらを作らなければいけません。

「重要」: Linux ではパス名の前に "-" 文字を置く必要があります。すなわち、 -/var/log/maillog。そうしないと、syslogd は Postfix が使う以上にシステム リソースを使います。

願わくば問題の数が少ないことを。しかし次のコマンドを毎晩 syslog ファイルが rotate される前に実行するのはいいことです:

# postfix check
# egrep '(reject|warning|error|fatal|panic):' /some/log/file

DEBUG_README ドキュメントには、 Postfix ロギングの "warning" 等のラベルの意味が記述されています。