0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[sendmail] MTA STS 対応とローカル配送における不思議な挙動と解決

Last updated at Posted at 2025-12-31

はじめに

sendmailがMTA-STSに対応したという話を聞いてだいぶ1経ちますが、ローカル配送(LMTP/Local Mail Transfer Protocol)までMTA-STSしようとして運用を止めていました。今回じっくり調査できる時間が取れたので調査しました。

一応この問題は 2024/01/31 リリースの 8.18.1 で一つの解決を得ているという話があります2。この問題に関連するコードを読んだのですが、リリース内容と合致しているのか不明で判断できませんでした。よって 8.18.1 以降で問題は解決していることを確認した、という内容となっています。

現在 2025/12/27 付でリリースされた 8.18.2 が出ていることもあり、8.17.1 での動作確認は行っていません。また 8.18.2 についても、その変更(実装し直したとの内容)の影響具合については未調査です。

なお本問題は極めて特定の構成下でしか発生しない、希なケースなのかもしれません。その条件で組んでる人だけが影響を受ける内容として今回とりまとめています。

動作確認環境

OS: FreeBSD 14.3-RELEASE-p7
MTA: sendmail 8.18.1
オプション: MTA_STS オプションの有効化が必要※
前提構成: 自ドメイン受けでもMTA-STSを有効化

※標準配布パッケージでは無効化されて出荷されている

調査内容

何が起きているのか?

自分の環境では、メールスプールに Cyrus IMAPを使用しています。MTA(sendmail)からの配送はMDA(procmail等)を通さずLMTPで直接「通信」しています。

LMTPとは言え、ほとんどESMTPなので、MTA-STSの対象になってしまった、というものです。そして自ドメイン宛のメール(サーバー)にMTA-STSを有効にするとLMTPすらSTARTTLSし始めようとして通信エラーになってしまう、というものです。

/var/log/maillog より一部抜粋
stat=Deferred: 403 4.7.0 other side does not support STARTTLS

結論

以下の設定を行った後、cd /etc/mail && make access.db を実行する(再起動不要)。実際に記述する際は access ファイルのフォーマットに則ってください(空白ではなくタブで区切る)。

/etc/mail/access
Clt_Features:localhost M

ドキュメントに記載されていること

  • コンパイルオプション(ports では対応済み)
  • 設定の有効化・無効化(access ファイルにて Clt_Features タグの指定)
  • 対応しているRFCや連携するソフトウェアの紹介

実際どう設定して運用するかは最低限書いてあるのと、実際に運用してみて、MTA-STSに対応しているメールサーバー向けの接続に手心(?)を加えるくらいの話なので「有効にするか」「無効にするか」のどちらかしかありません。これはパラメータ等の調整項目が無いことを意味します。

なお ports 的には mail/sendmailmail/py-postfix-mta-sts-resolver 側ともに、運用時に必要な設定はすりあわせ済みです。インストールしてさっさと始められる…という状況を作ってあります。

何故?Clt_Features タグの仕事

access ファイルにおける Clt_Features タグの振る舞いはMTA(sendmail)がメールクライアントとして振る舞う(つまり送信元)際の「振る舞い」について制御するものとなります。MDの指定が可能で、それぞれMTA-STSの無効化/DANEの無効化となります。

DANEの運用はしていませんが、DANE運用する人は M だけでなく DM とDAMEを無効にした方がいいでしょう。たぶん。

何故? localhost

このタグでは接続先サーバー名のホスト名3を指定します。今回LMTPで指定した接続先がUNIXドメインまたは localhost の時の指定となります。

特殊なのはUNIXドメインの取り扱いです。以下の処理により localhost ととして取り扱うようコードされています。

sendmail/deliver.c
#if NETUNIX
  if (strcmp(pv[0], "FILE") == 0)
  {
    curhost = CurHostName = "localhost";
    mux_path = pv[1];
  }
  else
#endif /* NETUNIX */

sendmail.cf に下記のような設定が行われている時の、メーラー定義(M)において、パス(Path)が [IPC] の時でかつ引数(Argv)が FILE の時、接続先ホスト名を localhost とする、という処理になります。

Mcyrusv2, P=[IPC], A=FILE /var/imap/socket/lmtp

この辺りを考慮しての設定となります。

よくある質問とその答え

Q.最初の実装でLMTPが考慮されてなかった理由は?

A.sendmail がMDA(mail.local)の利用を想定していて、LMTPを使うケースを考慮してなかったのかな、という気がしないでもないです。シランケド。
とは言えLMTPを例外としてない、別途設定が必要という意味では、相変わらず優しくはない sendmail らしい振る舞いです。

Q.ソース読まないと設定できないの?

A.残念ながら。今回調べてみて、こんな仕様だったの初めて知ったです。この手のバッドノウハウの蓄積が定石となって昇華される罠。

Q.こんな目にあって何故 sendmail 使ってるの?

A.噛めば噛むほど味が出るので捨てられないのが。そういう柔軟性がある。もちろんコンコルド効果については否定しないですが、他に移行したからといって、設定がそう楽になるわけもなく、むしろ柔軟性がなくなるロスの方が…。

Q.なんで今頃?

AI万歳。ソースコード解析が桁外れに楽になっています。漠然とソースコード解析させる意味は無いですが、こういうピンポイントの問題を解析させるのはすっごく効果的です。

参考文献

sendmail はそれなりにドキュメントあるけど、インターネットから参照できる最新のドキュメント(リンクしやすい物)が無いのが更にツライ。

  1. 2021/08/17 リリースの 8.17.1 以降(Experimental support)

  2. clt_features was not checked for connections via Unix domain sockets.

  3. FQDN、サブドメイン、親ドメイン、トップレベルドメインの他、指定無し=デフォルトが設定可能です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?