home(h) links(l) memo(m) profile(r)
memo(m) unix関係(u) Postfix関係

メモ〜Postfix関係

以下の記述は特に断りがなければCentOS 5.9環境でのものです。 sendmailについてはこちら

インストールと設定

Postfixとsendmailを同一システム上に共存させることはできるが、ここではsendmailをやめてPostfixに置き換えることを想定。 2009/9/8現在、安定版最新のバージョンは2.6のよう。yumで入れると少し前の2.3。

sendmailの停止

sendmailのキューが空であることを確認する。もし残っているなら削除するなどの措置を取る。場所は通常/var/spool/mqueue。詳しくはsendmail:メッセージキュー参照。

次にsendmailデーモンの停止。

shell> sudo /etc/rc.d/init.d/sendmail stop
sm-client を停止中:                                            [  OK  ]
sendmail を停止中:                                             [  OK  ]
    

次にsendmailデーモンを自動起動しないようにする→UNIX関係:自動起動の設定参照。

sendmailコンポーネントの削除

aliases(通常/etc/aliases)を除くsendmailの全コンポーネントとその所在ディレクトリを削除する。パッケージマネージャを持つシステムでは、それを使えばよい。依存性の問題が発生する場合、依存性を無視して削除して構わない(他のプログラムが依存するコンポーネントが全部Postfixに組み込まれているため)。

shell> sudo yum remove sendmail*
(中略)
Dependencies Resolved

================================================================================
 Package             Arch         Version               Repository         Size
================================================================================
Removing:
 sendmail            i386         8.13.8-2.el5          installed         1.3 M
 sendmail-cf         i386         8.13.8-2.el5          installed         924 k

Transaction Summary
================================================================================
Install      0 Package(s)         
Update       0 Package(s)         
Remove       2 Package(s)         

Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing        : sendmail                                          [1/2] 
警告: /var/log/mail/statistics は /var/log/mail/statistics.rpmsave として保存されした。
  Erasing        : sendmail-cf                                       [2/2] 

Removed: sendmail.i386 0:8.13.8-2.el5 sendmail-cf.i386 0:8.13.8-2.el5
Complete!
    

Postfixのインストール

RPMパッケージを用いてインストールする場合。

shell> yum list | grep postfix ←RPMリポジトリチェック
postfix.i386                               2:2.3.3-2.1.el5_2           base →baseにあって、まだインストールされていない
postfix-pflogsumm.i386                     2:2.3.3-2.1.el5_2           base
shell> sudo yum install postfix ←インストール(管理者権限必要、ないなら左記のようにsudoを付ける)
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
(中略)
Dependencies Resolved

================================================================================
 Package          Arch          Version                     Repository     Size
================================================================================
Installing:
 postfix          i386          2:2.3.3-2.1.el5_2           base          3.6 M

Transaction Summary
================================================================================
Install      1 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 3.6 M
Is this ok [y/N]: y
(中略)
Installed: postfix.i386 2:2.3.3-2.1.el5_2
Complete!
    

Postfixの設定ファイルの設置

Postfixデーモンが動作している場合、設定を変更したらpostfix reloadコマンド(/usr/sbin/postfix reload)を実行して設定を反映させる(管理者権限必要、必要に応じてsudoを前に付ける)。

エイリアスの設定は/etc/aliasesファイル。設定を変更したらnewaliasesコマンド(/usr/bin/newaliases)を実行して設定を反映させる(管理者権限必要)。

もし/etc/aliases.db/etc/aliasesより古かった場合、メールログ(/var/log/maillog)に以下のようなメッセージが出力される。この場合も同様にnewaliasesを実行する。

Apr 1 10:00:00 server sendmail[11111]: warning: database /etc/aliases.db is older than source file /etc/aliases
    

設定に関する詳細は設定の章参照。

Postfixの自動起動設定

Postfixがインストールされていれば既に /etc/rc.d/init.d/postfix というスクリプトは存在するよう。手動で起動するには「(sudo) /etc/rc.d/init.d/postfix start」。自動起動するには、chkconfigコマンド等で自動起動を有効にする(→自動起動の設定)。

SMTP認証の設定

1. cyrus-saslパッケージのインストール
入っていなければ入れる。
2. sasl認証用アカウントの作成
入っていなければ入れる。

SMTP over SSL/TLSの設定

設定ファイルの書式説明

Postfixの設定ファイルは/etc/postfix以下にある。メインの設定はmain.cf

宛先不明返信のテスト環境設定(soft bounce)

soft_bounce
テストのための限定された安全ネットワークを提供します。この機能を有効にすると、メールはキューに残ったままになります(返送されない限り)。これによってローカルで生成されたbounceを無効にし、SMTPサーバが常時メールを拒否します(5xxのreplyを4xxのreplyに変更します)。但し、これはアドレス書き換えやメールルーティングに関するエラーを修正しません。
【例】
soft_bounce = no

ローカルのパス情報(Local Pathname Information)

queue_directory
Postfixのメールキューが置かれるディレクトリを指定します。これはrootとして実行されるPostfixデーモンのルートディレクトリにもなります。異なるUNIXシステムにおいて Postfix chroot 環境を設定するには example/chroot-setup ファイルも参照下さい。
【例】
queue_directory = /var/spool/postfix
command_directory
post で始まるコマンド全ての位置を指定します。
【例】
command_directory = /usr/sbin
daemon_directory
全ての Postfix デーモンプログラム(master.cfファイルにプログラムの一覧が記載されています)の位置を指定します。このディレクトリの所有者はrootでなければなりません。
【例】
daemon_directory = /usr/libexec/postfix

キューとプロセスの所有者

mail_owner
Postfix のメールキューおよび大半の Postfix デーモンプロセスの所有者を指定します。ここで指定するユーザ名は他のアカウントとユーザIDやグループIDを共有せず、システム上で他のどのファイルやプロセスも所有しないものにして下さい。nobody、daemonなどは指定せず、この用途専用のユーザを作成の上指定して下さい。
【例】
mail_owner = postfix
default_privs
ローカルにあるメール配信エージェントが外部のファイルやコマンドにメールを配達するのに使われる既定の権利を指定します。この権利は受信者のユーザコンテキストがない場合に用いられます。特権ユーザやPostfix所有者を指定しないで下さい。
【例】
default_privs = nobody

インターネットホスト名、ドメイン名

myhostname
当メールシステムのインターネット上でのホスト名を指定します。既定値にはgethostname()で得られる完全修飾ドメイン名(Fully Qualified Domain Name)が用いられます。$myhostnameは他に多くの設定パラメータで既定値として用いられています。
【例】
myhostname = host.domain.tld
mydomain
ローカルのインターネットドメイン名を指定します。既定値には$myhostnameから最初の部分を取り除いた値が用いられます。$mydomainは他に多くの設定パラメータで既定値として用いられています。
【例】
mydomain = domain.tld

メールの送信

myorigin
ローカルで送信された(ドメイン名が付加されていない)メールがどこから送信されたものとするかを指定します。既定の動作は$myhostnameを後に付加するというものです。小さなサイトの場合はこれでいいでしょう。もし複数のマシンが動作しているドメイン内の場合、(1)$mydomainに変更する、(2)各ユーザをuser@that.users.mailhostに対応させるドメイン全体のエイリアスデータベースを構築する、のどちらかを行うのがいいでしょう。
既定値 $myhostname
【例】
myorigin = $myhostname →自身から送信されたものとする
myorigin = $mydomain →ドメインのDNSに問い合わせ、MXレコードに記載されたサーバから送信されたものとする

メールの受信

inet_interfaces
当メールシステムがメールを受け取るネットワークインタフェースを指定します。既定ではアクティブな全てのインタフェースでメールを受信します。このパラメータはuser@[IPアドレス]という書式でのメール配信も制御します。プロキシまたはネットワークアドレスのつけかえ(NAT)を通して転送されているネットワークアドレスに関してはproxy_interfacesパラメータも参照して下さい。
【例】
inet_interfaces = all
inet_interfaces = $myhostname
inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
proxy_interfaces
【例】
inet_interfaces = 1.2.3.4
mydestination
最終的な宛先が当マシン自身であると判断するドメインを指定します。
【例】
mydestination = $myhostname, localhost.$mydomain, localhost
local_transport
配信エージェントを指定します。既定では、/etc/passwd/etc/aliases、あるいはそれらの互換のものを参照するUNIX互換の配信エージェントとなります。

未知のローカルユーザのメール拒否

local_recipient_maps
$mydestination, $inet_interfaces, $proxy_interfacesに対してローカルな名前やアドレスの名前を検索するオプションテーブルを指定する。この値を指定するとSMTPサーバは不明なローカルユーザ宛てのメールを拒否する。この値は初期状態で設定された状態になっている。SMTPサーバにおけるローカル受信チェックをしないようにするには local_recipient_maps =を記述(空に設定)すればよい。既定の設定はローカル配信にPostfixのローカル配信エージェントを使っていると仮定しています。以下のような場合には、local_recipient_maps の設定を更新する必要があります。
  • $mydestination ドメイン受信者を/etc/passwd, /etc/aliases, $virtual_alias_mapの各ファイル以外で定義している場合(例:$virtual_mailbox_maps ファイルで指定)。
  • master.cfを編集し、ローカル配信エージェントの設定を変更した場合。
  • main.cfを編集し、local_transportの設定を変更した場合。
  • Postfix ローカル配信エージェントの設定に luser_relay, mailbox_transport, fallback_transport を使っている場合。
詳細については LOCAL_RECIPIENT_README ファイルに記述されています。
【例】
local_recipient_maps = unix:passwd.byname $alias_maps
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
local_recipient_maps =	
unknown_local_recipient_reject_code
受信ドメインが $mydestination, $inet_interfaces, $proxy_interfaces のいずれかに一致し、$local_recipient_maps が空ではなく、受信アドレスまたはアドレスのローカル部が見つからなかった場合にSMTPサーバが返すコードを指定します。既定値は550(メールを拒否する)ですが、local_recipient_mapsの設定が問題ないことが確認できるまで、最初は450(後ほど再度試して下さい)の設定にした方がより安全です。
【例】
unknown_local_recipient_reject_code = 550

信頼と転送の制御(Trust and Relay Control)

mynetworks
信頼するSMTPクライアントの一覧を指定します。ここで指定したSMTPクライアントにはPostfixによるメールの転送を許可します。man 5 postconfも参照して下さい。この指定があるとmynetwork_styleの設定は無視されます。
【例】
mynetworks = 168.100.189.0/28, 127.0.0.0/8
mynetworks = $config_directory/mynetworks
mynetworks = hash:/etc/postfix/network_table
mynetworks_style
この指定により、信頼するネットワークの指定を自身で行うことも、Postfixに任せることもできます。指定しない場合の既定の設定は自身のサブネット(subnet)です。classと指定すればIPアドレスクラスに応じた同一ネットワークを信頼します。hostと指定するとローカルのみを信頼します。mynetworkの設定があると、ここでの設定は無視されます。
【例】
mynetworks_style = class
mynetworks_style = subnet
mynetworks_style = host	
relay_domains
当システムがどの宛先にメール転送を許可するのかを制限します。詳しくはman 5 postconfを参照のこと。既定の動作は
  • 信頼されたクライアント($mynetworksにマッチするIPアドレス)からのメールはあらゆる宛先に対して許可
  • 信頼されていないクライアントからの転送はここで指定したドメイン配下にのみ許可(宛先指定ルーティングを除く)
で、既定値はmydestinationの値です。 これに加え、既定では以下の最終宛先へのメールは受け入れます。
  • $inet_interfaces(または$proxy_interfaces)にマッチする宛先
  • $mydestinationにマッチする宛先
  • $virtual_alias_domainsにマッチする宛先
  • $virtual_mailbox_domainsにマッチする宛先
これらの宛先は$relay_domainsに列挙しておく必要はありません。 ホストやドメインの指定は「/file/name」形式、「type:name検索テーブル」(コンマ区切りまたは空白区切り)で行います。長い行を続ける場合、次行を空白で開始します。ファイル名はその内容で置き換えられます。type:name テーブルは上位ドメインが検索キーであるときにマッチします。 注)Postfixは当システムを一次またはバックアップMXホストとしてリストアップするドメインへ自動でメールを転送することはしません。man 5 postconfにあるpermit_mx_backup制限に関する記述も参照のこと。
【例】
relay_domains = $mydestination

インターネット・イントラネット(Internet or Intranet)

relayhost
オプション転送テーブルにマッチするエントリーがなかった時メール送信先のデフォルトのホスト名を指定します。このパラメータを指定しないと、メールは直接宛先に送られます。 イントラネットでは組織のドメイン名を指定して下さい。内部DNSがMXレコードを使っていない場合、代わりにイントラネットゲートウェイのホスト名を指定して下さい。 SMTPの場合、「ドメイン名」「ホスト名」「ホスト:ポート番号」「[ホスト]:ポート番号」「[アドレス]」「[アドレス]:ポート」のいずれかを指定します。[ホスト名]の形式で記すとMXルックアップを参照しなくなります。 UUCP経由で接続を行っている場合、default_transport パラメータも参照して下さい。
【例】
relayhost = $mydomain

エイリアスデータベース(Alias Database)

alias_map
ローカルの配信エージェントが使うエイリアスデータベースの一覧を指定します。既定値はシステムに依存します。NISを使ったシステムの場合、既定の動作はまず先にローカルのエイリアスデータベースを探し、次にNISエイリアスデータベースを探します。書式の詳細については aliases(5) を参照して下さい。 エイリアスデータベースの値を変更したら、「postalias /etc/aliases」を(またはシステムがメールエイリアスファイルを収めているものは何でも)実行して下さい。または単に「newaliases」を実行して必要なDBMまたはDBのファイルを作成して下さい。 変更が反映されるまでしばらくかかるでしょう。「postfix reload」コマンドを実行して遅延状態を解消して下さい。
【例】
alias_maps = hash:/etc/aliases
alias_maps = hash:/etc/aliases, nis:mail.aliases
alias_database
alias_databasenewaliasessendmail -biで構築されたエイリアスデータベースを指定します。
【例】
alias_database = hash:/etc/aliases

参考文献・サイト

設定ユーティリティ(postconf)

postconfコマンドは現在設定されているパラメータの値を表示したり、変更したりする。

postconf オプション -c 設定ファイル パラメータ ...
-n
既定値から変更されている設定値(main.cfで指定している値)を表示する。

メールキューの管理(管理者用、postsuper)

原文:POSTSUPER(1)

postsuperコマンドはPostfixメールキューの管理を行うコマンド。このコマンドの実行は管理者(root)に限定されている。メールキュー一覧の表示やメールキューの一掃など権限のないキューの操作についてはpostqueueコマンドの説明も参照のこと。

このコマンドはデフォルトで-sと-pのコマンドラインオプションによって指定された操作を実行する。対象となるのはメールファイルがあるincoming、active、deferredの各ディレクトリと、ログファイルがあるbounce、defer、trace、flushの各ディレクトリである。

書式は以下の通り。

postsuper オプション ディレクトリ名 ディレクトリ名2...
-c 設定ファイルのあるディレクトリ
既定の設定ファイルディレクトリではなく、指定されたディレクトリにある設定ファイル「main.cf」を用いる。後述のMAIL_CONFIG環境設定も参照のこと。
-d メールキューのID 対象ステータス

指定されたキューIDを持つメッセージ1件をメールキューから削除する。対象ステータスを指定しなかった場合の既定対象はhold、incoming、active、deferred。

キューIDに「-」を指定した場合は、キューIDを標準入力から読み込む。例えば、以下のコマンドにより、user@example.com だけが宛先となっているメールを全て削除することができる。

span class="prompt"># mailq | tail +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } \
  # $7=sender, $8=recipient1, $9=recipient2 \
  { if ($8 == "user@example.com" && $9 == "") \
        print $1 }
  ' | tr -d '*!' | postsuper -d -

キューIDに「ALL」を指定すると全てのメッセージを削除する。例えば、「postsuper -d ALL deferred」は、ステータスがdeferredとなっているメールを全て削除する。なお安全のため、ALLは大文字で指定しないと働かないようになっている。

警告:PostfixのキューIDは再利用されるので、Postfix稼働中にpostsuperコマンドを実行すると誤ったメッセージを削除してしまう可能性があります。以下にどのような場合にこの問題が発生するのか説明します。

  1. Postfixキューマネージャは処理が完了した(送信が完了したか、あるいは送信者への差し戻しが完了した)メールを削除するようpostsuperに依頼する。
  2. 新たなメールが届いて、postsuperが削除しようとしているメッセージと同じキューIDが割り振られる。なお、削除されたメールのキューIDが再利用される確率は約215分の1。この値はシステムが1秒以内に識別可能なマイクロ秒値の種類数。
  3. postsuperは本来削除すべき古い方のメッセージではなく、新たに届いたメッセージの方を削除してしまう。
-h メールキューID 対象ステータス

指定したキューIDのメールが送信されないよう、メールを保留状態にする。つまり、指定したキューIDのメールをholdキューに移動する。キュー検索対象ステータスが指定されていない場合の既定値はincoming、active、deferred。

キューIDに「-」を指定した場合は、キューIDを標準入力から読み込む。

キューIDに「ALL」を指定すると全てのメッセージを保留状態にする。 例えば、「postsuper -h ALL deferred」は、ステータスがdeferred(遅延状態)となっているメールを全て保留状態する。なお安全のため、ALLは大文字で指定しないと働かないようになっている。

-H メールキューID 対象ステータス

指定したキューIDのメールをdeferred状態にする。

-r メールキューID 対象ステータス

指定したキューIDのメールを再びキューに入れる(requeueする)。

メールキューの管理(一般用、postqueue)

postqueue -v -c 設定ファイルのあるディレクトリ オプション 
-f
キューに残っている全てのメールの配信を試みる。このオプションは、Postfix qmgrデーモンに問い合わせることにより、以前から使われている「sendmail -q」に相当する動作を実装したものです。
-p

sendmail様式のキュー一覧を出力する。このオプションはsendmailのmailqコマンドに相当する動作を、Postfix showqデーモンに問い合わせることで実現したものです。

-s サイト

指定したサイトへのメールをすぐ送信するようスケジュール設定する。数値(IPアドレス)でサイトを指定する時は、RFC 2821に従った有効な値で指定し、値は[ ]で囲む必要があります。指定するサイトは「fast flush」サービスが利用可能なサイトである必要があります。「fast flush」サービスについて詳しくは flush(8) を参照して下さい。

このオプションは「sendmail -qRサイト」コマンドを、flushデーモンに問い合わせることで実現したものです。

-v

デバッグを行うため、より詳細なログ出力を行うようにする。複数の-vを指定することで、出力内容の詳細さが増す。Postfix 2.3 では管理者だけがこのオプションを指定することができます。

利用方法

Sendmail互換インタフェースがあり、Sendmailと同様に使える。パスが通っていない場所にあるならフルパスでコマンドを指定(例:/usr/sbin/sendmail)。詳細はsendmailコマンド参照。

telnetによる接続テスト

以下に例を示す[8]

メール送信先サーバjushin(192.168.0.1)の25番ポートにtelnetで接続する
[sento@soushin ~]$ telnet jushin.sample.org 25
Trying 192.168.0.1...
Connected to jushin.sample.org (192.168.0.1).
Escape character is '^]'.
220 jushin.sample.org ESMTP Postfix
↑応答ステータス220ならOK
メールサーバにご挨拶してみる
HELO jushin.sample.org
250 jushin.sample.org
送信元を指定
MAIL FROM:<sento@soushin.sample.org>
250 2.1.0 Ok
宛先を指定
MAIL FROM:<suitan@jushin.sample.org>
250 2.1.5 Ok
本文
DATA
Subject: Hello # 1行目は「Subject:」で始め、件名を入力
How are you? # ここからが本当の本文
. # ピリオドだけを入力して改行すると入力終了となる
250 2.0.0 Ok: queued as AFF1572D20
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

You have new mail in /var/spool/mail/suitan
[suitan@jushin ~]$ cat /var/spool/mail/suitan
...
From sento@soushin.sample.org  Fri Feb 15 15:40:41 2013
Return-Path: <sento@soushin.sample.org>
X-Original-To: suitan@jushin.sample.org
Delivered-To: suitan@jushin.sample.org
Received: from jushin.sample.org (soushin.sample.org [192.168.0.2])
        by jushin.sample.org (Postfix) with SMTP id AFF1572D20
        for <suitan@jushin.sample.org>; Fri, 15 Feb 2013 15:39:40 +0900 (JST)
Subject: Hello
Message-Id: <20130215063947.AFF1572D20@jushin.sample.org>
Date: Fri, 15 Feb 2013 15:39:40 +0900 (JST)
From: sento@soushin.sample.org
To: undisclosed-recipients:;

How are you?


トラブルシューティング

can't create user output file

現象
送信側のメールログでは送信完了となっているが、受信側でメールが受信できていない。受信側のメールログには「can't create user output file. Command output: procmail:Couldn't create "/var/mail/ユーザ名"」というエラーが残る。
原因
受信メールを書き込むためのファイルが存在せず、作成することもできない。
暫定対処方法
受信メール内容が書き込まれるファイルを作成しておく。touchコマンドで空ファイルを作っておけばよい。
根本的対処方法
(多分)メール配信を行うプログラムが受信メール内容が書き込まれるファイルを作成できるようディレクトリの権限修正を行う。

以下は暫定対処の事例。

[sento@soushin ~]$ mail sento@jusyin.yurukyara.org
Subject: Hello
Hello world.
Ctrl + D
Cc: 
[sento@soushin ~]$ sudo cat /var/log/maillog
Password: 
...
Feb  6 18:00:00 soushin postfix/smtp[23456]: 5A1801C878F: to=<sento@jusyin.yurukyara.org>, 
 relay=jusyin.yurukyara.org[1.2.3.4]:25, delay=0.04, delays=0.01/0.01/0.01/0.01, dsn=2.0.0, 
 status=sent (250 2.0.0 Ok: queued as 6094B6F80D)
Feb  6 18:00:00 soushin postfix/qmgr[31994]: 5A1801C878F: removed
...
↑送信には成功している
[root@jusyin ~]# cat /var/log/maillog
...
Feb  6 18:00:00 jusyin postfix/local[12345]: A24DF6F804: to=<sento@jusyin.yurukyara.org>, 
 relay=local, delay=0.31, delays=0.01/0/0/0.3, dsn=5.2.0, status=bounced 
 (can't create user output file. Command output: procmail: Couldn't create "/var/mail/sento" )
...
↑出力先ファイルが作れないとのエラー
[root@jusyin ~]# ls -l /var/spool/mail
-rw-rw---- 1 manto    mail     0  2月  6 18:09 manto
-rw-rw---- 1 namu     mail 30565  4月 13  2010 namu
-rw-rw---- 1 hikonyan mail     0  3月 16  2010 hikonyan
[root@jusyin ~]# touch /var/spool/mail/sento
[root@jusyin ~]# chown sento:mail /var/spool/mail/sento
-rw-rw---- 1 sento    mail     0 11月  4  2009 sento
-rw-rw---- 1 manto    mail     0  2月  6 18:09 manto
-rw-rw---- 1 namu     mail 30565  4月 13  2010 namu
-rw-rw---- 1 hikonyan mail     0  3月 16  2010 hikonyan

[sento@soushin ~]$ mail sento@jusyin.yurukyara.org
[root@jusyin ~]# cat /var/log/maillog
Feb  6 18:00:01 jusyin postfix/local[30621]: 6094B6F80D: to=<sento@jusyin.yurukyara.org>, 
 relay=local, delay=0.2, delays=0.01/0.01/0/0.19, dsn=2.0.0, status=sent 
 (delivered to command: /usr/bin/procmail -a "$EXTENSION")
↑今度は受信成功

delivery temporarily suspended: connect to 送信元サーバ: No route to host

現象
送信側のメールログでは送信完了となっているが、受信側でメールが受信できていない。受信側のメールログには「status=deferred (delivery temporarily suspended: connect to promode.pdbj.org[133.1.158.143]: No route to host)」という記録が残り、再送が繰り返される。
原因
受信側サーバから送信元サーバのSMTPポート(通常TCP 25番)への接続が許可されていないため。
補足
メールを受信するには受信側サーバのSMTPポート(通常TCP 25番)への接続が許可されている必要があるが、逆向き(受信側から送信元)の接続許可も必要らしい。
対処方法
送信元のファイアウォール設定を変更し、受信側サーバから送信元サーバのSMTPポートへの接続を許可するようにする。

修正前のメールログ

【送信側 192.168.0.2】soushin:/var/log/maillog
Feb 13 10:01:01 soushin sendmail[9682]: r1D11117009682: from=root, size=1006, class=0, nrcpts=1, 
 msgid=<201302130101.r1D11117009682@soushin.sample.org>, relay=root@localhost
Feb 13 10:01:01 soushin sendmail[9682]: r1D11117009682: to=root, ctladdr=root (0/0), delay=00:00:00,
 xdelay=00:00:00, mailer=relay, pri=31006, relay=[192.168.0.1] [192.168.0.1], dsn=2.0.0, 
 stat=Sent (Ok: queued as C429A71B8E)
 ↑送信には成功している

【受信側 192.168.0.1】jushin:/var/log/maillog
Feb 13 10:01:01 jushin postfix/smtpd[14520]: connect from soushin.sample.org[192.168.0.2]
Feb 13 10:01:01 jushin postfix/smtpd[14520]: C429A71B8E: client=soushin.sample.org[192.168.0.2]
Feb 13 10:01:01 jushin postfix/cleanup[14523]: C429A71B8E: 
 message-id=<201302130101.r1D11117009682@soushin.sample.org>
Feb 13 10:01:01 jushin postfix/qmgr[11384]: C429A71B8E: from=<root@soushin.sample.org>, 
 size=1488, nrcpt=1 (queue active)
Feb 13 10:01:01 jushin postfix/smtpd[14520]: disconnect from soushin.sample.org[192.168.0.2]
Feb 13 10:01:01 jushin postfix/qmgr[11384]: C429A71B8E: to=<root@soushin.sample.org>, relay=none, delay=0.05, 
 delays=0.05/0.01/0/0, dsn=4.4.1, 
 status=deferred (delivery temporarily suspended: connect to soushin.sample.org[192.168.0.2]: No route to host)
 ↑配信保留

iptables設定の修正

[root@soushin ~]# /etc/init.d/iptables status | less
...
Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
...
[root@soushin ~]# iptables -I RH-Firewall-1-INPUT 4 -p tcp -s 133.1.158.151 --dport 25 -j ACCEPT
[root@soushin ~]# /etc/init.d/iptables status | less
...
Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 
ACCEPT     tcp  --  192.168.0.1          0.0.0.0/0           tcp dpt:25 ←この項目を追加
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
...

修正後のメールログ

【送信側 192.168.0.2】soushin:/var/log/maillog
Feb 13 10:26:38 soushin sendmail[9931]: r1D1QccQ009931: from=root, size=97, class=0, nrcpts=1,
 msgid=<201302130126.r1D1QccQ009931@soushin.sample.org>, relay=root@localhost
Feb 13 10:26:38 soushin sendmail[9931]: r1D1QccQ009931: to=root@jushin.sample.org, ctladdr=root (0/0),
 delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30097, relay=[192.168.0.1] [192.168.0.1], dsn=2.0.0, 
 stat=Sent (Ok: queued as 3AED56F876)
 ↑今回も送信成功

【受信側 192.168.0.1】jushin:/var/log/maillog
Feb 13 10:26:38 jushin postfix/smtpd[16172]: connect from soushin.sample.org[192.168.0.2]
Feb 13 10:26:38 jushin postfix/smtpd[16172]: 3AED56F876: client=soushin.sample.org[192.168.0.2]
Feb 13 10:26:38 jushin postfix/cleanup[16175]: 3AED56F876: 
 message-id=<201302130126.r1D1QccQ009931@soushin.sample.org>
Feb 13 10:26:38 jushin postfix/qmgr[11384]: 3AED56F876: from=<root@soushin.sample.org>, 
 size=587, nrcpt=1 (queue active)
Feb 13 10:26:38 jushin postfix/smtpd[16172]: disconnect from soushin.sample.org[192.168.0.2]
Feb 13 10:26:38 jushin postfix/local[16176]: 3AED56F876: to=<root@jushin.sample.org>, relay=local, delay=0.05, 
 delays=0.05/0/0/0, dsn=2.0.0, 
 status=sent (delivered to command: /usr/bin/procmail -a "$EXTENSION")
 ↑今回は配信も成功

postfix mail for xxx loops back to myself

システムがローカルのrootユーザから自分自身にメールを送り、bounced状態で溜まってしまっていたため、メールログに表題のような記録が残っていた。Postfixの設定(/etc/postfix/main.cf)でmydestinationに$mydomainが抜けていたためと判明[9]。修正したら解消。

【修正前】
mydestination = $myhostname, localhost.$mydomain, localhost

【修正後】
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost

.forward: Permission denied

$HOME/.forward に転送先メールアドレスを記しても転送されず、メールログに「.forward: Permission denied」という記録があった場合、当該ユーザのホームディレクトリが当該ユーザにしか読めないアクセス権(700)に設定されていることが要因として考えられる(.forwardファイルに他人が読めるアクセス権を設定していたとしても)。この場合、他のユーザも読めるアクセス権(755など)を設定すれば回避できる[10]

refused to talk to me: 554 5.7.1 Delivery not authorized

原因
送信先メールサーバから受け取りを拒否されている。 拒否される要因として(1)よくないメールサーバとしてデータベースに登録されてしまっている(2)送信元IPがDNSで逆引きできない、が考えられる(この2点はMIT=マサチューセッツ工科大学宛てのメールに関して当てはまる事項らしい)11
対処

前者はSymantec社のデータベース12に送信元メールサーバのIPが登録されていないかを調べ、登録されていなかったら前者が原因ではないと切り分けられる。登録されていたら...改善すべきところは改善して、ごめんなさいって言ってデータベースを直してもらうのかな?

後者は送信元メールサーバのIPアドレスがDNS逆引きできる(IPアドレスをDNSサーバに問い合わせたらホスト名が返ってくる)ようにする。もしかしたら、そのホスト名がそのドメインのメールサーバ(MXレコード、SPFレコード)に載っていることも確認されているかもしれない。

mail1は正引きできるが逆引きできない
[root@mail1 ~]# dig mail1.foo.org
; <<>> DiG 9.8.3-P1 <<>> mail1.foo.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14785
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mail1.foo.org. 		IN	A

;; ANSWER SECTION:
;mail1.foo.org. 	21600	IN	A	1.2.3.4

;; Query time: 256 msec
;; SERVER: 172.29.0.11#53(172.29.0.11)
;; WHEN: Tue Sep 26 11:09:25 2017
;; MSG SIZE  rcvd: 53
[root@mail1 ~]# dig -x 1.2.3.4
; <<>> DiG 9.8.3-P1 <<>> -x 1.2.3.4
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 2546
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;4.3.2.1.in-addr.arpa.	IN	PTR

;; AUTHORITY SECTION:
3.2.1.in-addr.arpa.	10800	IN	SOA	ns1.foo.org. root.ns1.foo.org. 2017051701 3600 300 3600000 86400

;; Query time: 12 msec
;; SERVER: 172.29.0.11#53(172.29.0.11)
;; WHEN: Tue Sep 26 11:08:20 2017
;; MSG SIZE  rcvd: 111
メールキューを確認、1件未配信
[root@mail1 ~]# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
0123456789     1000 Sat Sep 23 02:30:00  admin@foo.org
(host dmz-mailsec-scanner-6.mit.edu[18.7.68.35] refused to talk to me: 554 5.7.1 Delivery not authorized)
                                         example@mit.edu

-- 1 Kbytes in 1 Request.
ディレクトリ確認
[root@mail1 ~]# find /var/spool/postfix -name 0123456789
/var/spool/postfix/defer/0/0123456789
/var/spool/postfix/deferred/0/0123456789

mail2は正引き逆引きともできる
[root@mail1 ~]# dig mail2.foo.org
; <<>> DiG 9.8.3-P1 <<>> mail2.foo.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14785
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mail2.foo.org. 		IN	A

;; ANSWER SECTION:
;mail2.foo.org. 	21600	IN	A	1.2.3.5

;; Query time: 256 msec
;; SERVER: 172.29.0.11#53(172.29.0.11)
;; WHEN: Tue Sep 26 11:09:25 2017
;; MSG SIZE  rcvd: 53
[root@mail1 ~]# dig -x 1.2.3.5
; <<>> DiG 9.8.3-P1 <<>> -x 1.2.3.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63328
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;5.3.2.1.in-addr.arpa.	IN	PTR

;; AUTHORITY SECTION:
5.3.2.1.in-addr.arpa.	7487	IN	PTR	mail2.foo.org.


;; Query time: 12 msec
;; SERVER: 172.29.0.11#53(172.29.0.11)
;; WHEN: Tue Sep 26 11:19:23 2017
;; MSG SIZE  rcvd: 87
メールキューをコピー
[root@mail2 ~]# rsync -az root@mail1:/var/spool/postfix/defer/0/0123456789 /var/spool/postfix/defer/0/
[root@mail2 ~]# rsync -az root@mail1:/var/spool/postfix/deferred/0/0123456789 /var/spool/postfix/deferred/0/
作成される上位ディレクトリの所有者はpostfix:postfix、アクセス権は700(所有者のみ読み書き実行可能)に設定
[root@mail2 ~]# chown postfix:postfix /var/spool/postfix/defer{,red}/0
[root@mail2 ~]# chmod 700 /var/spool/postfix/defer{,red}/0
メールキューに入れる
[root@mail2 ~]# postsuper -r 0123456789
postsuper: 0123456789: requeued
postsuper: Requeued: 1 message
メールキュー確認
[root@mail2 ~]# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
0123456789*    1000 Sat Sep 23 02:30:00  admin@foo.org
                                         example@mit.edu

-- 1 Kbytes in 1 Request.
[root@mail2 ~]# mailq
Mail queue is empty

参考文献・サイト

  1. Postfix本家サイト: トップページ, 説明文書(→個人的に作成した日本語訳
  2. Postfixのぺーじ…様々なドキュメントの和訳コンテンツがある。READMEはこちら(バージョン2.3.x)。標準的な設定例はPostfix 標準設定の例
  3. Æleen Frisch(アイリーン・フリッシュ)『UNIXシステム管理 第3版 VOLUME2』、飯塚 正樹、下田 みどり訳、オーラリー・ジャパン、2003年、ISBN4-87311-139-0
  4. Postfix manual - sendmail(1)
  5. メールサーバ( Postfix ) - Linux で自宅サーバ [ Home Server Technical. ]
  6. PostfixによるSMTPサーバの構築(CentOS標準版編)
  7. RCF 5322…Internet Message Format(電子メール)に関するIETFの技術仕様(RFC、Request for Comments)。
  8. Slicehost Articles: Postfix - using Telnet to test postfix(Telnetを使ってPostfixの動作をテストする)
  9. mail for *** loops back to myself への対処 - think-t の晴耕雨読
  10. unknown mailer error 2 メッセージについて - Linux Square - @IT
  11. 554 5.7.1 Delivery not authorized - IS&T Contributions - Hermes
  12. IP Reputation Investigation:Symantec社のデータベースに「よくないという評判のあるIP」として登録されているかどうかを検索できる