Postfix の主な設定ファイルは、/etc/postfix/main.cf である。 main.cf には次のような形式で各種パラメータを記述する。
パラメータ名 = 値
mail_spool_directory = /var/mail
値の形式はパラメータによって異なる。値が長くなるために複数行に分割したい場合は、行の先頭を空白で始めると、その行は前の行からの継続行とみなされる。
parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains, mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients, relay_domains,smtpd_access_maps
「$name」「${name}」「$(name)」という形式で、パラメータの値(の一部)に別のパラメータの値を使用することもできる。
mydestination = $myhostname, localhost.$mydomain, localhost
実は main.cf には、Postfix が知らないパラメータも設定できる。 このようなパラメータは設定しただけではあまり意味がないが、他のパラメータの値として使用することができるので、シェルスクリプトにおけるシェル変数のように使用することができる。
インストール直後の main.cf は、多くのコメントと設定例が記載されていて親切なのだが、実際に設定を行なおうとすると、これらは少々鬱陶しい。 実際にパラメータが設定されている行もあるが、それはたいていデフォルト値と同じなので無くても構わない。 そこで私はインストール後に、まず次のようにしてデフォルトと異なるもののみを含む main.cf を作成している。 もちろんこれを行なわずに、そのまま main.cf を編集しても構わない。お好みでどうぞ。
# cd /etc/postfix # postconf -n > main.cf.new # mv main.cf main.cf.orig # mv main.cf.new main.cf
main.cf を変更してもすぐには反映されない。 すぐに反映させるには「/usr/sbin/postfix reload」コマンドを実行する必要がある。 だけど、そのコマンドを実行しないと反映されないというわけではないので注意。 ここでは詳しくは説明しないが、すぐに反映するつもりがないのであれば、変更しちゃダメということである。
/usr/sbin/postconf コマンドは main.cf のパラメータを表示する。 引数なしで実行すると、現在のパラメータがアルファベット順ですべて表示される。
% postconf
2bounce_notice_recipient = postmaster
access_map_reject_code = 554
address_verify_default_transport = $default_transport
address_verify_local_transport = $local_transport
address_verify_map =
address_verify_negative_cache = yes
address_verify_negative_expire_time = 3d
address_verify_negative_refresh_time = 3h
address_verify_poll_count = 3
address_verify_poll_delay = 3s
address_verify_positive_expire_time = 31d
(以下略)
ここでいう「現在のパラメータ」というのは main.cf に記述されたパラメータという意味である。 つまり、main.cf を変更後、まだ「postfix reload」を実行していない時等、実際に Postfix が動作しているパラメータとは異なることがある。
引数にパラメータ名を指定すると、指定したパラメータだけが表示される。
% postconf mydomain alias_maps
mydomain = tmtm.org
alias_maps = hash:/etc/aliases
「-d」オプションをつけると、現在のパラメータ値の代わりに、デフォルト値が表示される。 「-n」オプションをつけると、デフォルト値と異なるパラメータだけが表示される。
postconf コマンドはパラメータの表示だけではなく、「-e」オプションを使用して設定の変更もできる。
% postconf -e myhostname=mx.tmtm.org
もっとも、通常は main.cf をテキストエディタで修正するだろうから、これはあまり使わない (自分だけかな…?)。
myhostname パラメータは自ホスト名を設定する。 myhostname の値は様々な個所で使用される。 SMTP サーバがクライアントに返す最初のメッセージ中にも現れるし、SMTP クライアントとして発行する EHLO コマンドの引数にもなっている。 また、mydomain パラメータのデフォルト値を生成する元にもなっている。 だから、ちゃんと FQDN 形式で、かつ DNS で索けるような値でないといけない。
mydomain パラメータは自ドメイン名を設定する。 append_dot_mydomain 有効時にドメイン名がついてないメールアドレスにつけられたり、 mydestination のデフォルト値で「localhost.$mydomain」として使用されている。 myhostname を適切に設定していれば、特にいじる必要はない。
mynetworks_style には、信頼できるSMTPクライアントを指定する。 つまりここで指定したクライアントからSMTP接続された場合、どこ宛のメールでも受け取って適切なサーバに中継する。 だから、自分の管理外のアドレスが含まれてしまうと、いわゆる第三者中継を許してしまうことになり、このサーバも他のサーバから信用されなくなってしまう恐れがある。 指定できる値は host, subnet, class のいずれかである。
host | 自ホストのアドレス。 |
subnet | 自ホストの所属しているサブネットト。 |
class | 自ホストのアドレスのネットワーククラス。 |
デフォルトは subnet だが、良くわからなかったら host を指定した方が無難。 「自分ちのネットワーク環境は複雑で、subnet や class だけでは指定できない」…という人は mynetworks で具体的に指定できる。 実際、mynetworks_style は mynetworks の値を動的に設定するために使用されているだけである。
パラメータの意味は mynetworks_style を参照。 指定できる値の形式はIPアドレス(「192.168.1.9」等)またはネットワークアドレス(「192.168.1.0/24」等)で、空白または「,」で区切っていくつでも記述できる。 本当は他にも指定できるのだが、普通はこれだけでも困らないだろう。 当たり前だが、mynetworks が指定されている場合は、mynetworks_style は無視される。
mydestination には自ホストが最終的な宛先になるようなドメイン名を指定する。空白または「,」で区切っていくつでも記述できる。 メールアドレスの「@」の右側が mydestination の指定に一致すると、そのメールは他のサーバには配送せず、自ホスト内で処理しようとする。 つまり、alias マップや OS に存在しないユーザ宛のメールはエラーになり、送信者にエラーメールが返される。
デフォルトでは次のようになっていて、「@」の右側が、自ホスト名 or localhost.自ドメイン名 or localhost のメールを自ホストが処理すべきメールとみなす。
mydestination = $myhostname, localhost.$mydomain, localhost
「@」の右側がドメイン名だけのメールを受けたければ、mydestination を次のように設定するのが良いだろう。
mydestination = $myhostname, $mydomain
alias_maps は alias を定義しているマップを指定する。「type:table」形式で空白または「,」で区切っていくつでも記述できる。
普通はデフォルトのままでも構わないが、NIS が使用できる環境で make すると、alias_maps が次のようになっている (Solaris の場合は「hash:/etc/aliases」の代わりに「dbm:/etc/mail/aliases」になっているかも知れない)。
alias_maps = hash:/etc/aliases, nis:mail.aliases
そのままでも実害はないのだが、NIS 環境がちゃんと設定されていないとログに次のような warning が出力されるので、少し鬱陶しい。
warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
今時 NIS を使用している人もいないだろうから(いたらゴメン)、これは次のように変更しておくのが良いだろう。
alias_maps = hash:/etc/aliases
alias_database は newaliases コマンドで更新されるマップを指定する。 空白または「,」で区切っていくつでも記述できる。 alias_database は newaliases コマンドで使用されるだけで、実際に別名テーブルとして参照されるのは alias_maps の方なので注意。