treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Postfixでメールが飛ばなくなったので対処

ある環境でPostfixでアラートメールが送信できなくなっていたのですが、重い腰を上げて対処したのでご報告。
ほぼ対処療法ですが、ひとまずこれで。

ある環境

ある環境のある機器の監視機能でポート25縛りの監視アラートメールを同じセグメント内のメールサーバでいったん受け取って587とかの別のポートでちゃんと送信する、という構成を動かしていました。
上位のフィルタが変わってしまったようで、ある日を境にメールが飛ばなくなった、というのが発端です。

エラー

Postfixで記録されていたエラー

May 1 00:00:00 mailserver postfix/smtp[00000]: xxxxxxxxxxxx: to=<hoge@hogehoge.net>, orig_to=<hoge@server>, relay=none, delay=282014, delays=282014/0.07/0/0, dsn=4.4.3, status=deferred (Host or domain name not found. Name service error for name=smtp.sendgrid.net type=A: Host not found, try again)

smtp.sendgrid.netにメールを送信してインターネット上のメールアドレスに配送しているのですが、「Host not found, try again」とか「status=deferred (Host or domain name not found. Name service error」とかでメールが送信できなくなっていた状況。

テスト的にmailコマンドでメールを送信しても

May 1 00:06:46 mailserver postfix/smtp[00000]: xxxxxxxxxxxx: to=<hoge@hogehoge.com>, relay=none, delay=0.13, delays=0.11/0.03/0/0, dsn=4.4.3, status=deferred (Host or domain name not found. Name service error for name=smtp.sendgrid.net type=A: Host not found, try again)

同じエラーでメールはmailserverにキューされたまま送信できなくなっているという状況にありました。

以前はできていたので、上位のゲートウェイ(ルータとかファイアウォールとかの)でのフィルタリングが何か影響していると考えられました。でも上位の機器には(権限がないから)アクセスできなくて、メールサーバの力だけで何とかしなきゃいけない状況にあります。

ちなみにDNSは、上位のゲートウェイのIPが参照されており、(おそらく)そのゲートウェイのIPの機器がプロバイダのDNSにフォワードしていると考えられる(推測)環境です。

考えたこと

コマンドnslookupによるDNSによる名前解決はできる状況なので、システム自体は正常動作していることは確認出来ていました。元々既存の設定状況でアラートメールの送信自体はできていたし。

ただ、上位のセキュリティ関連の機器のフィルタ設定が変わった(フィルタする機器自体が変わった)という話は耳に入っていたので、その変わった何かしらの理由でメール関係の通信だけ影響を受けているような感じがしていました。

対処

今まで使ったことがなかったのですが、Postfixの設定ファイルに別途/var/spool/postfix/etc/resolv.confが用意されています。

f:id:treedown:20200515150754p:plain

これを使ってみることにしました。
ファイルを「cat /var/spool/postfix/etc/resolv.conf」で確認してみると、

# Generated by resolvconf

と、表示され、今は何も入っていない状況。ここにGoogleパブリックDNSのIPアドレスを設定してみることにします。
設定内容は、
--------------------------------------------------------------
# Generated by resolvconf
nameserver 8.8.8.8
nameserver 8.8.4.4
--------------------------------------------------------------
こんな感じで(追記して)編集しPostfixをリスタート
[ ok ] Restarting postfix (via systemctl): postfix.service.
リスタートからの正常動作確認後、キューされたままの送信待ちメールをリフレッシュ。さてログを見てみると、
--------------------------------------------------------------
May 15 12:25:03 mailserver postfix/master[1007]: terminating on signal 15
May 15 12:25:03 mailserver postfix/master[31467]: daemon started -- version 2.11.3, configuration /etc/postfix
May 15 12:25:03 mailserver postfix/qmgr[31475]: xxxxxxxxxx: from=<>, size=4873, nrcpt=1 (queue active)
May 15 12:25:06 mailserver postfix/smtp[31487]: xxxxxxxxxx: to=<hoge@hogehoge.net>, orig_to=<hoge@mailserver>, relay=smtp.sendgrid.net:587, delay=286095, delays=286092/0.1/2.4/0.53, dsn=2.0.0, status=sent (250 Ok: queued as lNDaiBFvSsC0cb8JAFWR7w)
May 15 12:25:07 mailserver postfix/qmgr[31475]: xxxxxxxxxx: removed
--------------------------------------------------------------
「status=sent」となり、正常に送信ができるようになりました。

ちょっと仮説

上位のゲートウェイが見られないため推測しかできないのですが、OSがDNSの名前解決をしたときは正常に動作するけど、PostfixがMXレコードを引こうとしたら「status=deferred (Host or domain name not found. Name service error」が発生したように思えます。nslookupではちゃんとIPを返してきていたので。

さらに正常に動作していたPostfix環境が(なにも変更していないのに)エラーになったというのもなんだかフィルタっぽい感じがします。

通常インストール中にpostfixは/etc/resolv.confのコピーを取り、それを独自のディレクトリ(たぶん「/var/spool/postfix/etc/resolv.conf」ここ)に配置します。
通常はどう動いているのかがあまりよく分っていないのですが、今回の動作を見ると、/var/spool/postfix/etc/resolv.confを参照する方が優先順位が高そうな気がします。さらにPostfixの処理限定で/var/spool/postfix/etc/resolv.confを参照しているような気がします。

時間があったら(もしくは必要があったら)このあたりの/var/spool/postfix/etc/配下のconfigファイルをちょっと調べて見ようかなと思いました。他にもhostsとかhostnameとかもあって、Postfixの挙動に影響しそうなファイルが見て取れますので。