Postfix 基本設定


はじめに

Postfix には main.cf ファイルを通して制御される、数百の設定パラメータが あります。幸いなことに、全てのパラメータは実用的なデフォルト値を持っています。 多くの場合、メールシステムを使い始められるようにするために、たった2つか3つの パラメータを設定する必要があります。ここでは文法を簡単に紹介します:

以下の文章は、(INSTALL ファイルに書かれている ように) 自分でソースコードをコンパイルするか、コンパイルされたバージョンを インストールするかのどちらかで、システムに Postfix がすでにインストール されていることを想定しています。

このドキュメントは基本的な Postfix 設定を対象としています。メールは部や ファイアウォール、ダイアルアップクライアントのような特定の応用に対して Postfix を設定するための情報は STANDARD_CONFIGURATION_README ファイルで見つかるでしょう。しかし、以下に書かれているものをまだ見ていないので あれば、そのファイルを見に行かないでください。

最初に注目すべきパラメータは、マシンの属性とネットワークでの役割を 指定します。

他の多くの設定パラメータのデフォルト値はこれらから派生します。

次に注目すべきパラメータは、ローカルの postmaster に送られるメールの量を 制御します:

プロキシやネットワークアドレス変換器の後ろにいる場合や、他のドメインの バックアップ MX ホストを動かしている場合は、以下を正確に設定するように 注意してください:

Postfix デーモンプロセスはバックグラウンドで動き、問題や正常処理を syslog デーモンでログに記録します。気を付ける必要がある点がいくつかあります:

マシンが異常なセキュリティを要求されている場合、Postfix デーモンプロセスを chroot 環境の中で動かしたいかもしれません。

Postfix がバーチャルネットワークインターフェース上で動いていたり、マシンが 他のメーラをバーチャルインターフェース上で動かしている場合、他にも以下に挙げる パラメータも見る必要があるでしょう:

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 設定言語は無精な評価方法を使っており、 実行時に必要となるまでパラメータの値を参照しません。

Postfix はアクセス制御やアドレス書き換え他のためにデータベースファイルを 使います。DATABASE_README ファイルには Postfix が Berkeley DB や LDAP、SQL、他の種類のデータベースを使って動かす方法の 紹介があります。ここには Postfix のデータベースの呼び出し方の共通の例を 挙げます:

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual

main.cf や master.cf ファイルを加えたら、動いているメールシステムを更新する ために、すぐに root で次のコマンドを実行してください:

# postfix reload

外行きのメールに使うドメイン名

myorigin パラメータにはローカルで 投函されたメールがどのドメインから来るように見えるかを指定します。 デフォルトではローカルマシン名、すなわちマシン名がデフォルトになっている $myhostname を使います。非常に小さな サイトを運営しているのでなければ、マシン名の親ドメインがデフォルトに なっている $mydomain に変更したく なるでしょう。

送信者と受信者アドレスの一貫性を保つため、 myorigin は修飾されていない受信者 アドレスに付けられるドメイン名も指定します。

例 (以下のいずれか1つだけを指定します):

/etc/postfix/main.cf:
    myorigin = $myhostname (デフォルト: "user@$myhostname" としてメールを送信)
    myorigin = $mydomain   (望ましいかもしれない: "user@$mydomain")

受け取るべきメールのドメイン

mydestination パラメータには、 このマシンが他のマシンに転送せずにローカルに配送するドメインを指定します。 デフォルトではマシン自身に対するメールを受け取ります。 ホスティングしているドメイン 用に Postfix を設定する方法は VIRTUAL_README ファイルを参照してください。

ゼロ個以上のドメイン名、"/file/name" パターンや (hash: や btree, nis:, ldap:, mysql: のような) "type:table" 検索テーブルを、空白やカンマで区切って指定することができます。"/file/name" パターンはその中身で置き換えられます; "type:table" はテーブル検索をおこない、 単に存在するかどうかをテストします: 検索結果は無視されます。

マシンがドメイン全体に対するメールサーバの場合、 $mydomain もリストアップしなければ いけません。

例 1: デフォルト設定。

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

例 2: ドメイン全体のメールサーバ。

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

例 3: 複数の DNS A レコードを持つホスト。

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

注意: メール配送ループを避けるため、 $myhostname や localhost.$mydomain を含む、このマシンの 全てのホスト名をリストアップしなければいけません。

メールの中継元となるクライアント

デフォルトでは、Postfix は認められたネットワークブロックのクライアントからは どの配送先へもメールを転送します。認められたネットワークは mynetworks 設定パラメータで定義 されます。デフォルトでは、ローカルマシンがつながっている IP サブネットワークに 属する全てのクライアントを許可します。

重要: マシンが広域ネットワークに接続されている場合、デフォルトの mynetworks 設定では友好的すぎるかも しれません。

例 (以下のいずれか1つだけを指定します):

/etc/postfix/main.cf:
    mynetworks_style = subnet  (デフォルト: サブネットワークを許可)
    mynetworks_style = host    (安全: ローカルマシンのみを許可)
    mynetworks = 127.0.0.0/8   (安全: ローカルマシンのみを許可)
    mynetworks = 127.0.0.0/8 168.100.189.2/32 (ローカルマシンを許可)

信頼するネットワークを main.cf ファイルで指定することも、Postfix に 指定させることもできます。デフォルトでは Postfix が指定します。結果は mynetworks_style パラメータの 値に依存します。

代わりに、mynetworks のリストを手で指定することもできますが、その場合には Postfix は mynetworks_style 設定を無視します。信頼するネットワークのリストを手で指定するには、 ネットワークブロックを CIDR (netrowk/mask) 記法で指定します。例:

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

main.cf ファイルにパターンをリストアップする代わりに、パターンファイルの 絶対パスを指定することもできます。

メールを中継して渡す配送先

デフォルトでは、Postfix はよそ者 (認められたネットワークの外のクライアント) からのメールを、認められたリモートの配送先のみに転送します。許可された リモートの配送先は relay_domains 設定パラメータで定義されます。デフォルトでは mydestination パラメータに リストアップされたドメインの全てのドメイン (およびサブドメイン) を 許可します。

例 (以下のいずれか1つだけを指定します):

/etc/postfix/main.cf:
    relay_domains = $mydestination (デフォルト)
    relay_domains =           (安全: よそ者からのメールを転送しません)
    relay_domains = $mydomain (自分のドメインとサブドメインにメールを転送します)

配送方法: 直接もしくは間接

デフォルトでは、Postfix はインターネットに直接メールを配送しようとします。 ローカルの条件によっては、こうすることができなかったり望まれていないかも しれません。例えば、システムがオフィスアワー以外は電源を切られていたり、 ファイアウォールの背後にあったり、インターネットに直接メールを送ることが 許されないプロバイダを通して接続しているかもしれません。こういった場合は、 Postfix がリレーホストを通して間接的にメールを配送するように設定する必要が あります。

例 (以下のいずれか1つだけを指定します):

/etc/postfix/main.cf:
    relayhost =                   (デフォルト: インターネットへの直接配送)
    relayhost = $mydomain         (ローカルのメールハブを通しての配送)
    relayhost = [mail.$mydomain]  (ローカルのメールハブを通しての配送)
    relayhost = [mail.isp.tld]    (プロバイダのメールハブを通しての配送)

[] で囲まれた形式は DNS MX 検索をおこないません。それが何を 意味するかわからなければ、気にする必要はありません。ただし、ISPが指定した メールハブのホスト名の前後には [] をつけるように気をつけてください。 そうしないとメールは間違って配送されるかもしれません。

STANDARD_CONFIGURATION_README ファイルには、ファイアウォールが置かれたネットワークやダイアルアップ ネットワークに対する多くのヒントや tips があります。

postmaster に報告するトラブルの種類

aliases(5) テーブルには人間にメールを向け直す postmaster エイリアスを設定すべきです。postmaster アドレスはメール配送問題を 報告するために存在することが要求されます。 aliases(5) テーブルを更新する際には、 スーパーユーザ宛のメールも人間に向けられているか確かめてください。

/etc/aliases:
    postmaster: you
    root: you

aliases ファイルを変更したら "newaliases" コマンドを実行します。 /etc/aliases の代わりに、他の場所にエイリアスファイルを置かれているかも しれません。それを見つけるには "postconfalias_maps" コマンドを 使います。

Postfix システムは問題を postmaster エイリアスに報告します。全ての種類の トラブルレポートには興味がないかもしれないので、このレポーティング メカニズムは設定可能になっています。デフォルトでは深刻な問題 (resource, software) のみを postmaster に報告します:

デフォルト設定:

/etc/postfix/main.cf:
    notify_classes = resource, software

クラスの意味を以下に示します:

bounce
postmaster に配送できないメールを通知します。 postmaster に配送できずに送信者に返されたメールのコピーを送るか、Postfix が メールを拒否した際の SMTP セッションの写しを送ります。プライバシー上の 理由から、配送できないメールのコピーは元のメッセージヘッダの後で切りつめ られます。これは "2bounce" (以下参照) を意味します。 luser_relay 機能も参照してください。 通知は bounce_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。
2bounce
Postfix が配送できないメールを送信者に返すことが できない場合、代わりに (元のヘッダの後でメールを切りつめずに) postmaster に 送ります。通知は 2bounce_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。
delay
遅延したメールを postmaster に通知します。この場合、 postmaster はメッセージヘッダのみを受け取ります。通知は delay_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。
policy
(UCE) ポリシー制限で拒否したクライアントの要求を postmaster に通知します。postmaster は SMTP セッションの写しを受け取ります。 通知は error_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。
protocol
プロトコルエラー (クライアントまたはサーバ側) や 実装されていないコマンドをクライアントが実行しようとしたことを postmaster に 通知します。postmaster は SMTP セッションの写しを受け取ります。通知は error_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。
resource
リソース問題 (例えば キューファイル書き込みエラー) で 配送できなかったメールを postmaster に通知します。通知は error_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。
software
ソフトウェア問題で配送できなかったメールを postmaster に通知します。通知は error_notice_recipient 設定パラメータで指定されたアドレスに送られます (デフォルト: postmaster)。

プロキシ/NAT 外部ネットワークアドレス

メールサーバにはネットワークアドレス変換器 (NAT) やプロキシを通して インターネットに接続しているものもあります。これはインターネット上のシステムは メールサーバのネットワークアドレスではなく、NAT またはプロキシのアドレスに 接続することを意味します。NAT またはプロキシは接続をメールサーバのネットワーク アドレスに転送しますが、Postfix はそのことを知りません。

Postfix サーバがプロキシや NAT の後ろで動くのであれば、 proxy_interfaces パラメータを 設定して Postfix がメールを受け取る全ての外部プロキシまたは NAT アドレスを 指定する必要があります。ネットワークアドレスの代わりにシンボル形式のホスト名を 指定することもできます。

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

例: NAT ボックスの背後にあるホストでバックアップ MX ホストを動かす。

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

Postfix ロギングについて知る必要があること

Postfix デーモンプロセスはバックグラウンドで動き、問題や通常の活動を syslog デーモンでログに記録します。syslogd プロセスはイベントをクラスや深刻度で 分類し、ログファイルに追加します。ロギングクラスやレベル、ログファイル名は 通常は /etc/syslog.conf で指定されます。最低限必要なのは次のようなものです:

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

syslog.conf ファイルを変更したら、"HUP" シグナルを syslogd プロセスに送って ください。

重要: 多くの syslogd の実装はファイルを作りません。syslogd を(再)起動する 前にファイルを作っておかなければいけません。

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

問題の数が少ないことが望ましいですが、syslog ファイルがローテーションされる 前に毎晩次のものを走らせておくのはよい考えです:

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

DEBUG_README ドキュメントには Postfix ロギングにおける "warning" などのラベルの意味が書かれています。

Postfix デーモンプロセスを chroot させて 動かす

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

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

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

デフォルトの /etc/postfix/master.cf ファイルではどの Postfix デーモンも chroot されていません。chroot 操作を有効にするには、/etc/postfix/master.cf を 編集し、ファイルの指示に従ってください。終わったら、変更を反映させるために "postfix reload" を実行してください。

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

さらに、おそらくほとんどの場合 syslogd が Postfix キューディレクトリ内の ソケットを listen するように設定する必要があります。特定のシステムで これを実現するための syslogd コマンドラインオプションの例:

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

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

自分自身のホスト名

myhostname には Postfix システムが動いているマシンの完全修飾ドメイン名を指定します。 $myhostname は他の Postfix 設定パラメータの多くでデフォルト値として現れます。

デフォルトでは、myhostname はローカルマシン名に設定されます。ローカルマシン名が完全修飾ドメイン形式では ない場合や Postfix をバーチャルインターフェース上で動かしている場合、 メールシステムが使うべき完全修飾ドメイン名を指定する必要があります。

代わりに、main.cf で mydomain を 指定すると、Postfix は myhostname パラメータの完全修飾されたデフォルト値を作り出すのにその値を使います。

例 (以下のいずれか1つだけを指定します):

/etc/postfix/main.cf:
    myhostname = host.local.domain (machine name is not FQDN)
    myhostname = host.virtual.domain (virtual interface)
    myhostname = virtual.domain (virtual interface)

自分自身のドメイン名

mydomain パラメータには $myhostname の親ドメインを指定します。 デフォルトでは、 (結果がトップレベルドメインでなければ) $myhostname から最初の部分を取り除いた ものから得ます。

逆に、main.cf で mydomain を 指定すると、Postfix はその値を myhostname パラメータの完全修飾された デフォルト値を作り出すのに使います。

例 (以下のいずれか1つだけを指定します):

/etc/postfix/main.cf:
    mydomain = local.domain
    mydomain = virtual.domain (virtual interface)

自分自身のネットワークアドレス

inet_interfaces パラメータには Postfix システムが listen すべきである全てのネットワーク アドレスを指定します; "user@[network address]" に向けられたメールは $mydestination でリストアップ されたドメインに向けられたのと同様に、ローカルに配送されます。

Postfix master.cf ファイルで IP アドレスをサーバ名の前に付けることによって、 inet_interfaces 設定を 上書きすることができます。

デフォルトは全てのアクティブなインターフェースで listen します。バーチャル インターフェースでメーラを動かすのであれば、listen すべきインターフェースを 指定する必要があるでしょう。

重要: バーチャルインターフェース上で MTA を動かすのであれば、そのマシンに 対するメールを受け取る MTA で inet_interfaces の値を明示的に 指定しなければいけません: この MTA はバーチャルインターフェースで listen しないか、バーチャル MTA がダウンしているとメーラループを起こします。

例: デフォルト設定。

/etc/postfix/main.cf:
    inet_interfaces = all

例: 1つ以上のバーチャルメーラを動かしているホスト。それぞれの Postfix に 対して以下のいずれか一つだけを指定してください。

/etc/postfix/main.cf:
    inet_interfaces = virtual.host.tld         (バーチャル Postfix)
    inet_interfaces = $myhostname localhost... (非バーチャル Postfix)

注意: このパラメータを変更したら、Postfix を止めてからスタートする必要が あります。