Postfix

基本的な設定 - Postfix解説文書

原文(英語)はこちら


はじめに

Postfixには何百種類もの設定パラメータがあり、main.cfで制御されています。幸いにしてすべてのパラメータは賢明な値を既定値としてあります。多くの場合、メールシステムを起動する前に設定を調整する必要があるのは2,3のパラメータだけでしょう。以下に簡単な書式を示します。

以下の文書は、ソースコードより自身で(INSTALLファイルに書かれている手順を見て)コンパイルしたか、またはコンパイル済みのパッケージを使って、Postfixを既にインストールしてあることを想定してます。

この文書では基本的なPostfixの設定について説明しています。mailhub、ファイアウォール、ダイヤルアップクライアントなど特定のアプリケーションに関するPostfixの設定方法については標準的設定に関する文書に記載されています。しかし、そちらを参照するのは以下に示す内容を理解してからにしてください。

ここで説明する最初のパラメータは、マシンを特定する情報やネットワークの役割について指定するものです。

その他多くの設定パラメータの既定値はこれらのパラメータから生成されているだけです。

次に説明するパラメータはローカルのメール管理者に送るメールの量を制御するものです。

プロキシまたはアドレス変換を介して外部とアクセスしている場合、以下の項目が正しく設定されているか、またある他のドメインに関するバックアップMXホストを運営しているかについて確認してください。

Postfixデーモンのプロセスはバックグラウンドで実行され、問題や通常の動作についてはsyslogデーモンに通知され記録されます。以下は、ログに関することで気にしておくべき事項です。

Postfixデーモンプロセスをchroot環境内で実行する通常とは異なるセキュリティ環境を使いたい場合、

Postfixを仮想ネットワークインタフェースで実行するか、または仮想ネットワークインタフェースで別のメールソフトを実行している場合、以下に記す別のパラメータも確認する必要があるでしょう。

Postfix設定ファイル

特に指定がない初期状態の場合、Postfixの設定ファイルは/etc/postfixにあります。最も重要なファイルは main.cfmaster.cf で、これらファイルの所有者は root である必要があります。main.cfmaster.cf(あるいはその親ディレクトリ)に対する書き込み権限を他人に与えれば、その人にroot権限を与えたことになります。

/etc/postfix/main.cf では、最小限のパラメータ設定が必要です。Postfix の設定パラメータはシェル変数に似ていますが、二つの重要な違いがあります: 一つ目は、UNIX シェルであれば使える引用符をPostfixは知らないということです。

設定パラメータは以下のようにして指定します。

/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.cfmaster.cf のファイルを変更したときは、実行中のメールシステムを更新するため、rootユーザの権限で以下のコマンドを実行してください。

# postfix reload

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

myoriginのパラメータには、このマシンから送信されるメールのドメイン名を指定します。指定がないときに適用される初期値は、ローカルマシン名の $myhostname に設定された値です。本当に小さなサイトを運営しているのでなければ、おそらくこれを $mydomain に変更したいと思うでしょう。この値の既定値は、マシン名の親ドメインです。

送信者アドレスと受信者アドレスの一貫性を保つため、myoriginは、ドメイン名部分が記されていない受信者アドレスに付加するドメイン名にも使われます。

例(以下のいずれか一つだけを指定):

/etc/postfix/main.cf:
	myorigin = $myhostname (既定値: メールは "user@$myhostname"として送る)
	myorigin = $mydomain (恐らくこちらの方が望ましい: "user@$mydomain")

どのドメインのメールを受信するのか?

mydestinationパラメータでは、このメールサーバがどのドメイン宛てのメールを他のマシンに転送せずローカルに配信するのかを指定します。初期設定ではこのメールサーバ自身宛てのメールを受信するようになっています。ホストされたドメイン用として Postfix を設定する方法については、 VIRTUAL_README ファイルを参照してください。

何も指定しないことも、ドメイン名、"/file/name" パターン、"type:table" 検索テーブル(hash:, btree:, nis:, ldap:, mysql: など) を空白またはカンマで区切って指定することもできます。"/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の設定パラメータで定義します。現在、ローカルマシンからのメールのみを許可するのが初期設定です。Postfix 3.0以前では、ローカルマシンが接続されているIPサブネットワークに属するすべてのクライアントを許可するのが初期設定でした。

Postfix はまた、承認済みネットワーク以外からメールを送信してくる 「モバイル」クライアントからのメールも中継するように設定することができます。これについては SASL_READMETLS_README に説明があります。

重要: あなたのマシンがWANネットワークに接続されているなら、"mynetworks_style = subnet" と設定するのは許可を緩め過ぎでしょう。

例(以下のいずれか一つを設定)

/etc/postfix/main.cf:
    mynetworks_style = subnet (WANの場合は安全ではありません)
    mynetworks_style = host    (ローカルマシンだけを承認)
    mynetworks = 127.0.0.0/8   (ローカルマシンだけを承認)
    mynetworks = 127.0.0.0/8 168.100.189.2/32 (ローカルマシンだけを承認)
    mynetworks = 127.0.0.0/8 168.100.189.2/28 (ローカルネットワークだけを承認)

信頼するネットワークを main.cf ファイルで指定することも、Postfix にその作業をさせることもできます。初期状態では、Postfix に任せる設定になっていて、結果は mynetworks_style パラメータの設定値に依存します。

また許可対象を列挙してmynetworksを指定することもできます。この指定を行った場合、mynetworks_styleの設定は無視されます。信頼するネットワークを列挙するには、CIDR(ネットワーク/マスク)形式でネットワークブロックを記してください。例えば、

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

また、main.cfファイルにパターンを列挙せず、パターンファイルの絶対パス名を指定することもできます。

どの宛先へのメールを中継するのか

Postfixは、見知らぬ人(承認済みネットワーク以外にいるクライアント)から自身を除く承認済みネットワーク内に宛てたメールだけを転送するのが初期状態の設定です。転送を許可する宛先はrelay_domainsで設定します。初期状態では、mydestinationで列挙したすべてのドメイン(サブドメインも含む)に宛てたメールを許可します。

例(以下のいずれか一つだけを指定):

/etc/postfix/main.cf:
    relay_domains = $mydestination (既定値)
    relay_domains =           (安全: 見知らぬ人からのメールは一切転送しない)
    relay_domains = $mydomain (自身のドメインおよびそのサブドメインへのメールは転送する)

どの配達方法を使うのか:直接 それとも 間接?

初期状態において、Postfixはメールをインターネットに直接配信しようとします。しかしローカル環境によっては、それができなかったり、望ましくなかったりします。例えば、営業時間外はシステムがオフになっていたり、ファイアウォールの背後にあったり、インターネットへ直接メール配信することを許可していないプロバイダを経由して接続されていたりする場合が挙げられます。このような場合は、Postfix がリレーホストを経由して間接的にメールを配送するように設定する必要があります。

例(以下のいずれか一つだけを指定):

/etc/postfix/main.cf:
    relayhost =  (既定値: インターネットへ直接配信)
    relayhost = $mydomain (ローカルのメールハブを経由して配信)
    relayhost = [mail.$mydomain] (ローカルのメールハブを経由して配信)
    relayhost = [mail.isp.tld] (プロバイダのメールハブを経由して配信)

[]で囲んで記すと、DNSのMXレコード検索を行う必要がなくなります。この意味が分からなくても心配する必要はありません。ただ、ISPから指示されたメールハブのホスト名を[]で囲むとメールが誤配されることがあるので注意してください。

STANDARD_CONFIGURATION_READMEファイルには、ファイヤーウォールがあるネットワークやダイヤルアップ接続しているネットワークに関するより詳しいヒントや情報が記されています。

postmasterに通知するトラブルの種類

aliases(5)テーブルにはpostmasterに対するエイリアスを設定し、メールをある人(管理者)に届くようにしておく必要があります。postmasterアドレスは、利用者がメールの配送に関する問題を報告できるようにするため、実在している必要があります。aliases(5)テーブルを更新するときは、スーパーユーザへのメールもその人に転送するようにしてください。

/etc/aliases:
    postmaster: you
    root: you

aliasesファイルを変更したら、「newaliases」コマンドを実行してください。なおaliasesファイルは /etc/aliases のではない別の場所にあるかもしれません。どこにあるのかは「postconf alias_maps」コマンドで確認してください。

Postfix システムは、問題を postmaster エイリアスに報告します。あなたはあらゆる種類のトラブル報告に興味があるわけではないでしょうから、この報告のしくみは調整することができるようになっています。初期状態の設定では、重大な問題(リソース、ソフトウェア)だけを postmaster に報告します。

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

各クラスの意味は以下の通りです。

bounce
未配達のメールがあることを postmaster に通知します。送信者に返送された配達不能メールのコピーを postmaster に送るか、またはPostfix がメールを拒否したときの SMTP セッションの記録を送ります。プライバシーのため、postmaster に送られる配信不能メールのコピーから、元のメッセージのヘッダより後の部分は切り捨てられます。これは「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(Network Address Translator)やプロキシを経由してインターネットに接続されているものがあります。これは、インターネット上のシステムが、メールサーバのネットワークアドレスに接続するのではなく、NATやプロキシのアドレスに接続することを意味します。NATやプロキシは接続をメールサーバのネットワークアドレスに転送しますが、Postfixはこのことを知りません。

PostfixサーバをプロキシやNATの後ろで動作させている場合、proxy_interfacesパラメータを設定し、Postfixがメールを受信する外部のプロキシやNATのアドレスをすべて指定する必要があります。ネットワークアドレスではなく、シンボリックホスト名を指定することもできます。

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

例: バックアップMXホストを実行しているNATボックスの背後にあるホスト

/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ファイルがrotateされる前に実行するとよいでしょう。

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

DEBUG_READMEの文書には、Postfixのログにある「warning」などのラベルの意味について記しています。

Postfix デーモンプロセスをchroot環境で実行する

Postfix デーモンプロセスは(master.cfファイルで設定することにより)chroot jail 内で実行するようにすることができます。このプロセスは、権限が低く固定され、アクセスがPostfix キューディレクトリ(/var/spool/postfix)内のファイルシステムに限定された状態で実行されます。これは、侵入に対する重要なバリアとなります。chroot はファイルシステムのアクセスのみを制限するものなので、このバリアは完全なものではありませんが、少しは役に立つでしょう。

ローカルにメールを配信したり、Postfix 以外のコマンドを実行したりする 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 ファイルを編集し、ファイル内の指示にしたがってください。編集後、「postfix reload」を実行すると、変更が有効になります。

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

さらに、Postfix のキューディレクトリ内のソケットを listen するように syslogd を設定する必要があることは、ほぼ間違いないでしょう。以下に、特定のシステムでこれを実現するための 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.cfmydomainを指定しているなら、Postfixはその値を使って完全修飾されたmyhostnameパラメータの既定値を生成します。

例(このうちのどれか一つだけを指定する)

/etc/postfix/main.cf:
    myhostname = host.local.domain(マシン名は完全修飾ドメイン名ではない)
    myhostname = host.virtual.domain(仮想インタフェース)
    myhostname = virtual.domain(仮想インタフェース)

自分自身のドメイン名

mydomainパラメータでは、$myhostnameの親ドメインを指定します。既定値は、$myhostnameから最初の部分を取り除いた値(それがトップレベルドメインにならない限り)です。

逆に、main.cfmydomainを指定した場合、Postfixはmyhostnameパラメータの既定値を完全修飾して生成した値を使います。

例(このうちのどれか一つだけを指定する)

/etc/postfix/main.cf:
    mydomain = local.domain
    mydomain = virtual.domain(仮想インタフェース)

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

inet_interfacesパラメータでは、Postfixシステムが listenすべきすべてのネットワークインターフェースアドレスを指定します。「user@[ネットワークアドレス]」宛のメールは、$mydestinationに列挙されているドメイン宛であるかのようにしてローカルに配信されます。

Postfix の master.cf ファイルに書かれた inet_interfaces の設定を上書きするには、サーバ名の前にIPアドレスを付ける必要があります。

Postfix の master.cf ファイルに書かれた inet_interfaces の設定を上書きするには、サーバ名の前にIPアドレスを付ける必要があります。

重要: 仮想インターフェイスでMTA(Mail Transfer Agent、メール転送エージェント、Postfixなど)を実行する場合、明示的にinet_interfaces値を指定し、マシン自身がメールを受け取るMTAを示す必要があります。この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を再起動する必要があります。


トップページに戻る