このページではLinux構築した自宅サーバーで使用するMTAであるPostfixメールの転送・受信・拒否の制御について初心者向けに解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
Postfixの設定

Postfixについて

Postfixのファイル構成

設定ファイルmain.cfについて

ホスト名とドメイン名の設定

受信するホスト名の設定

ホスト名毎のメールの振分け

メール転送設定の使い分け

受信/転送に関する設定

セキュリティ関連の設定

"main.cf"の書式チェック

Postfixのコントロール

連携するアプリケーション


Postfixの受信/転送に関する設定

以下は、 Postfix の主設定ファイル "/etc/postfix/main.cf" の設定項目で、主に受信と転送の制御に関する部分です。

ここは メールサーバー の制御で最も重要なところで、設定を誤ると スパムメール の蔓延に手を貸してしまうことになります。

これは自分が困るだけでなく、世の中のネット利用者に大きな迷惑をかけてしまうことになりますから注意が必要です。

以下の設定については特に慎重に、しっかりその意味を理解してからとりかかるように心がけてください。

"unknown_local_recipient_reject_code"〜ユーザー不明の場合のエラーコード

WBEL3 及び CentOS3 では 213,214行目 、WBEL4及びCentOS4では 211行目 、CentOS5では 212行目 あたりに記述があります。

Postfix "mydestination" 受信するホスト名の設定 の設定に従って、受信したメールのを自ホスト内に保存しようとします。

しかし例えば、相手がメールアドレス "tanaka@obenri.com" に送ったつもりが、間違って "tamaka@obenri.com" 宛てに送ってしまったような場合は保存すべきメールボックスが見当たりませんから、Postfixはメールの送り主に対して「宛先不明メール」の返信を試みます。

この ディレクティブ では、その「宛先不明メール」に表示するエラーコードを設定します。

WBEL3及びCentOS3の場合 デフォルト では、

#unknown_local_recipient_reject_code = 550
unknown_local_recipient_reject_code = 450

となっていて、エラーコード 450 が送信元に表示されることになります。

ところがこれには少し問題があります。

エラーコード 450 は、それを受け取った MUA または MTA 側では、

「今は事情があって受信できないので、後からもう一度送信しなおしてください。」

という意味に解釈されることがあり、ありもしないアカウント宛てに、一定時間毎に何度もメールの再送信を試みられてしまうことがあるからです。

これではメールを送る側にも送られる側にも迷惑な話ですから、

「該当するユーザーが見当たらないので、そのメールは受信できません。」

という意味のエラーコード 550 を返すように、

unknown_local_recipient_reject_code = 550
#unknown_local_recipient_reject_code = 450

と修正することをお勧めします。

ただしWBEL4、CentOS4、CentOS5の場合はデフォルトで、

unknown_local_recipient_reject_code = 550
このディレクティブに何も設定しなければ 550 を返しますので、両方のディレクティブをコメントアウトしてもOKです。
でも、WBEL3やCentOS3のPostfixはどうしてこんなデフォルト設定になっているのでしょうか?。

となっていますから修正する必要はありません。

"mynetworks_style"〜転送を許可するホストの範囲

WBEL3 及び CentOS3 では 242行目〜 、WBEL4及びCentOS4では 239行目〜 、CentOS5では 240行目〜 あたりに記述があります。

実際に転送の動作を決めているのはこの "mynetworks_style" ではなく、後述する "smtpd_recipient
_restrictions"
ディレクティブですので、こちら smtpd_recipient_restrictionsディレクティブについて の解説も合わせてご覧ください。

Postfix が受信したメールを他の ホスト へ転送可能にする、 送信元のホストの範囲を設定する ディレクティブ です。

デフォルト では、

#mynetworks_style = class
#mynetworks_style = subnet ※デフォルト値
#mynetworks_style = host

と、全ての設定パターンがコメントアウトされていますが、この場合は "mynetworks_style = subnet" が設定されているものと解釈されます。

この場合、 構築中のLinuxサーバー と同じ サブネット 、すなわち "192.168.100.0/24" と、 ループバックアドレス である "127.0.0.0/8" が設定対象となります。

これが "mynetworks_style" ディレクティブの推奨設定です。

つまり、

mynetworks_styleがsubnetまたは省略されたときのPostfixの動作
"mynetworks_style"が"subnet"または省略されたときのPostfixの動作

のように、"192.168.100.0/24"または"127.0.0.0/8"からPostfixに送信されたメールは、外部のMTAへと転送できますが、それ以外の IPアドレス のホストから送信されたメールは、外部のMTAへは転送されないということです。

ちなみに、 "mynetworks_style = class" を有効にすると、同じ ネットワーククラス に属するホストがすべて対象になり、設定上 セキュリティ の問題を抱えることになります。

また、 "mynetworks_style = host" を有効にすると、自ホストである 構築中のLinuxサーバー のみが対象となります。この設定は、Postfixを外部のホストの MUA から利用しない場合、つまり、 構築中のLinuxサーバー 内の アプリケーション を使ってのみメールを送信するような運用の場合に限られるでしょう。

Postfixの構築に
役に立った一冊です

ところでこの "mynetworks_style" は、次に説明する "mynetworks" と同じディレクティブパラメータ "$mynetworks" を与えるディレクティブで、 "mynetworks" に明示的な設定がなされていない場合にのみ有効となります。

さて、この "mynetworks_style" は、具体的にIPアドレスを指定することなく 構築中のLinuxサーバー のネットワーク設定から自動的にパラメータを取り込むディレクティブである点に注意してください。

例えば "mynetworks_style = subnet" と設定した場合、自宅の サブネット "192.168.100.0/24" から "192.168.1.0/24" に変更すると自動的に設定値も変わり、ディレクティブパラメータ "$mynetworks" も同じく変更になります。

一般的にいうとPostfixの転送許可範囲はデフォルトの "mynetworks_style = subnet" で問題はありませんから、その他のIPアドレスに対して転送許可を追加したり、逆に転送を許可する プライベートIPアドレス の範囲を制限したり、という特殊な設定をしない限り、結果的には、

#mynetworks_style = class
#mynetworks_style = subnet ※デフォルト値
#mynetworks_style = host

のまま 何も設定する必要はない ということになります。

"mynetworks"〜転送を許可するホストの範囲(個別設定)

WBEL3 及び CentOS3 では 257行目〜 、WBEL4及びCentOS4では 254行目〜 、CentOS5では 255行目〜 あたりに記述があります。

実際に転送の動作を決めているのはこの "mynetworks" ではなく、後述する "smtpd_recipient
_restrictions"
ディレクティブですので、こちら smtpd_recipient_restrictionsディレクティブについて の解説も合わせてご覧ください。

ディレクティブ の意味は上で説明した "mynetworks_style" ディレクティブと同じです。

ただしこのディレクティブは、転送を許可するホストの範囲を IPアドレス またはネットワーク表記で具体的に設定します。

デフォルト では全ての設定パターンがコメントアウトされていますが、このディレクティブを有効にすると、 "mynetworks_style" "mynetworks" の設定が追加されるのではなく、 "mynetworks_style" の設定そのものが無効になってしまう点に注意してください。

例えば、 "mynetworks_style = subnet" に該当する設定に加えて WAN 空間の特定のIPアドレスのホストから受信したメールの転送を追加で許可したいとき、これを "mynetworks" ディレクティブで記述する場合には、追加で許可するIPアドレスアドレスを記述するだけではなく、

mynetworks = 192.168.100.0/24, 127.0.0.0/8, 210.xxx.xxx.xxx
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table

のようにすべてのIPアドレス範囲を記述することになります。

ただ "mynetworks" ディレクティブで具体的にIPアドレスを設定してしまうと、例えば自宅の サブネット "192.168.100.0/24" から "192.168.1.0/24" に変更したようなときは、 "mynetworks" のパラメータも記述し直す必要がある点に注意してください。

MUA クライアント アプリケーション ですから、MTAからのメールの転送先ではありえません。

さて、Postfixが転送を試みる「他の ホスト 」とは、正確には 「他のホストからメールの受け入れが可能な MTA ということになります。

Postfix は、"mynetworks_style"や"mynetworks"ディレクティブで指定されたホスト(MTAまたはMUA)からのメールを受信すると、その宛先が "mydestination" ディレクティブで指定されたもの以外の場合、 DNSサーバー を利用してメールの宛先の 名前解決 を行い、自身以外のMTAへの転送を試みることになります。

実際のところ、ほとんどのインターネット利用者は ISP から提供されたメールアドレスを使用しているはずから、あなたが 構築中のLinuxサーバー 上のPostfixを使って友人などにメールを送りたい場合、あなたが使うMUAに対して"mynetworks_style"や"mynetworks"ディレクティブで「メール転送許可」を設定する必要があります。

ただし、自分の管理下にないMTAやMUAに対しては、 絶対にメール転送許可を設定してはいけません。

もしもそういう設定をしてしまうと、 構築中のLinuxサーバー スパムメールの発信基地 にされてしまうかもしれないからです。

スパマーは自分で設置したMTAから直接スパムメールを発信するわけにはいきませんから 自分所有するサーバーでスパムメールを発信できない理由 、「不用意に外部のMTAからの中継を許可しているメールサーバー」を常日頃から探し回っています。

そしてもし 構築中のLinuxサーバー がスパムメールの発信基地にされてしまったら、あなたのメールサーバーそのうちブラックリストに挙げられ、多くのMTAから受信拒否されてしまうことになるでしょう。

"alias_maps"〜受信メールの再転送先ファイルの指定

WBEL3 及び CentOS3 では 380行目〜 、WBEL4及びCentOS4では 375行目〜 、CentOS5では 376行目〜 あたりに記述があります。

Postfix は、自ホスト内に保存されるべきメールを、 データベース を参照して特定のアドレスへ再転送を行わせることができます。

その詳細については、 メールの転送設定について で詳しく説明しますが、この "alias_maps" ディレクティブ では、そのデータベースファイルの形式とファイルシステム上の位置を指定します。

WBEL3,CentOS3の場合 デフォルト では、

#alias_maps = dbm:/etc/aliases
alias_maps = hash:/etc/postfix/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases

と記述されていますから、 「hash形式で"/etc/postfix/aliases(正確にはaliases.db)を参照する。」 と設定されていることになります。

動作の面だけから考えれば、この設定はこのままで何の問題もないのですが、お勧めは、

#alias_maps = dbm:/etc/aliases
#alias_maps = hash:/etc/postfix/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
alias_maps = hash:/etc/aliases

です。

実はこの"aliases.db"の参照機能はPostfixがその互換対象としている Sendmail の仕組みをそのまま受け継いだものです。

しかし、デフォルトのSendmailは、hash形式の "/etc/aliases.db" を参照するようになっていますから、この設定のようにPostfixも同じデータベースを参照するようにしておくと、この二つの MTA を切り替えて使用したい場合、個々にデータベース化作業を行う必要がないというわけです。

一方のWBEL4、CentOS4、CentOS5のデフォルトの記述は、

#alias_maps = dbm:/etc/aliases
alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases

となっていますから修正する必要はありません。

"alias_database"〜newaliasesコマンドの実行対象の指定

WBEL3 及び CentOS3 では 390行目〜 、WBEL4及びCentOS4では 385行目〜 、CentOS5では 386行目〜 あたりに記述があります。

"aliases.db" を作成するための データベース コマンド である、 newaliases を実行する際に、その出力先のデータベースファイルを指定する ディレクティブ です。

WBEL3,CentOS3では デフォルト で、

#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
#alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases

と記述されていますので、上から3番目を有効にすれば良いのですが、 "alias_maps" ディレクティブと連動しておいたほうが面倒がないので、

#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
#alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
alias_database = $alias_maps

と設定しておくと良いでしょう。

また、理由はよくわかりませんがWBEL3,CentOS3の場合、この "alias_database" ディレクティブは、この"/etc/postfix/main.cf"の末尾に有効になっている記述がくっついています。

alias_database = hash:/etc/postfix/aliases

もちろんこの記述は不要ですから、

#alias_database = hash:/etc/postfix/aliases

のように無効にしてください。

おそらく バグ だと思われますが、WBEL4、CentOS4のPostfixの場合、
"alias_database = $alias_maps"
というように、 "$" を使った変数で設定するとエラーになってPostfixが起動しなくなりますので注意してください。

一方WBEL4、CentOS4、CentOS5の場合はデフォルトで、

#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases

と適切な設定になっていますからそのままでOKです。

関連セクションへ 関連セクション・ メールサーバーの構築


このサイトは リンクフリー です。趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。今のところ更新予定はありませんのでご了承ください。
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。