Postfix で OpenDKIM と ARC を自前構築
目次
この記事でわかること
- OpenDKIM で署名鍵を生成し、Postfix に milter 連携する手順
- 転送(メーリングリスト等)で認証が壊れる問題と、OpenARC が果たす役割
- ARC(RFC 8617)のヘッダ構成と、設定ミスが送信不可・認証失敗につながる注意点
「転送されたとたん、なりすまし扱いされる」問題
自社の Postfix から送ったメールが、取引先のメーリングリストを経由したとたん迷惑メール扱いされる——こうした相談は珍しくありません。
原因は、転送サーバーが件名や本文を書き換えたり、送信元 IP を自分のものに変えたりするためです。すると受信側での SPF(送信元 IP の正当性チェック)と DKIM(署名による改ざんチェック)が崩れ、DMARC の判定で「なりすまし」と見なされてしまいます。
この「転送で認証が壊れる」問題を緩和する仕組みが ARC(Authenticated Received Chain、認証結果の引き継ぎ連鎖)です。本記事では、Postfix に OpenDKIM で DKIM 署名を付け、OpenARC で ARC に対応するまでを、設定の順序と落とし穴に絞って解説します。
DMARC そのものの自前構築は Postfix で DMARC を自前構築する手順 を、ARC の概念は ARC とは|転送メールの認証を救う仕組み を併読すると理解が早まります。
全体像:milter で署名とシールを束ねる
Postfix は milter(Mail Filter、メール処理を外部プログラムに委譲する仕組み)で OpenDKIM・OpenARC と連携します。送信時の流れはこうなります。
- メール送信 → Postfix → OpenDKIM が DKIM 署名を付与 → OpenARC が(転送時に)ARC シールを付与 → 外部へ送出
ポイントは、milter は smtpd_milters に書いた順番で呼び出されることです。OpenDKIM を先、OpenARC を後に置きます。OpenARC は他の milter が付けた認証結果も参照するため、署名・検証系の milter の後段に置くのが基本です。順序を誤ると署名対象が変わり、署名そのものが無効になります。
構築手順:OpenDKIM から OpenARC まで
ステップ 1: OpenDKIM で鍵を生成する
OpenDKIM はメール送信時に DKIM 署名を付与する milter です。まず署名鍵を生成します。opendkim-genkey コマンドを使います。
opendkim-genkey -b 2048 -d example.com -s mail2026 -D /etc/opendkim/keys/example.com
-b 2048: 鍵長(2048 ビットを推奨)-d example.com: 署名対象ドメイン-s mail2026: セレクタ(同じドメインで複数の鍵を区別する名前)-D: 出力先ディレクトリ
セレクタは鍵を識別する任意の名前です。命名や使い分けの考え方は DKIM セレクタとは|役割と命名の考え方 を参照してください。
生成されると、秘密鍵(mail2026.private)と DNS 公開用の TXT レコード(mail2026.txt)ができます。公開鍵は mail2026._domainkey.example.com の TXT レコードとして DNS に登録します。
複数ドメイン・複数セレクタを扱う場合は、KeyTable(鍵の一覧)と SigningTable(どのドメインにどの鍵を使うかの対応表)で署名指示を定義します。1 ドメイン 1 鍵で足りる場合は、opendkim.conf の Domain / Selector / KeyFile を直接指定する形でも構いません。
ステップ 2: Postfix に OpenDKIM を milter 連携する
OpenDKIM の待受ソケットを決め、Postfix から呼び出します。opendkim.conf で待受ソケットを指定し、Postfix の main.cf に次を追記します。
# main.cf
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = local:/run/opendkim/opendkim.sock
milter_default_action = accept
milter_protocol = 6
smtpd_milters: SMTP で受け取るメール(外部からの受信や、認証済みクライアントからの送信)に適用する milternon_smtpd_milters:sendmailコマンドなど SMTP を経由しない経路のメールに適用する miltermilter_default_action = accept: milter が応答しないときの動作。acceptにしておくと、OpenDKIM が落ちてもメール自体は止まりません
TCP ソケット(inet:localhost:8891 など)を使う構成もあります。具体的なソケット名や権限は配布パッケージで異なるため、各ディストリビューションの設定ファイルに合わせてください。
ここで一度、自分宛てや確認用アドレスにテスト送信し、ヘッダに DKIM-Signature と Authentication-Results: ... dkim=pass が付くことを確認します。検証コマンドは DKIM をコマンドで確認する方法 が参考になります。
ステップ 3: OpenARC で転送時の認証結果を保持する
ここからが本題の ARC です。ARC は RFC 8617 で定義された仕組みで、転送のように途中のサーバーがメールを処理して SPF/DKIM が無効になっても、改変前の認証結果を引き継いで残すことを目的とします。
重要なのは、ARC は認証を自動的に「通す」ものではない点です。ARC は元の認証結果を封印して受信側に伝えるだけで、最終的にそれを信頼して受け入れるかどうかは受信側の判断です。
そのため、ARC シールを付ける主役は転送する側のサーバー(メーリングリストや中継サーバー)です。単純に外部へ送るだけの送信専用サーバーが、自分の出すメールに ARC を付ける必要は基本的にありません。自社が転送・中継の役割を担う場合に OpenARC を入れる、と整理してください。
OpenARC も milter として動きます。RFC 8617 では、転送ごとに次の 3 つのヘッダからなる「ARC セット」が 1 つ追加されます。
- ARC-Authentication-Results(AAR): その時点の SPF/DKIM/DMARC 認証結果を記録する
- ARC-Message-Signature(AMS): そのホップでのメッセージ内容に対する署名
- ARC-Seal(AS): AAR・AMS と直前までの連鎖全体を封印する署名
各セットは i=(セット番号。1 から始まり転送ごとに増える)で順序を示し、ARC-Seal の cv=(chain validation、連鎖の検証結果)で連鎖の状態を none / pass / fail のいずれかで表します。
OpenARC の設定(openarc.conf)では、主に次を指定します。
Mode: 動作モード。sを含めるとシール付与、vを含めると既存 ARC 連鎖の検証、svで両方を行うDomain/Selector/KeyFile: シール用の署名に使うドメイン・セレクタ・秘密鍵Socket: milter の待受ソケット
シール用の鍵は OpenDKIM と同様に生成できますが、各ディレクティブの正確な書式やデフォルト値はバージョンで差があるため、openarc.conf の公式ドキュメント(man ページ)を必ず確認してください。
Postfix への連携は OpenDKIM と同じく smtpd_milters に追記します。OpenDKIM の後ろに OpenARC のソケットを並べます。
# main.cf(OpenDKIM が先、OpenARC が後)
smtpd_milters = local:/run/opendkim/opendkim.sock, local:/run/openarc/openarc.sock
non_smtpd_milters = $smtpd_milters
設定ミスは「送信不可・認証失敗」に直結する
このあたりの設定は、ミスがそのままメールの実害になります。よくある失敗を挙げます。
- milter の順序ミス: OpenARC を OpenDKIM より前に置くと、署名前の状態を見てしまい連鎖が成立しません。順序は厳守します。
milter_default_actionの設定漏れ: 既定がtempfailのままだと、milter が一時的に応答しないだけでメールが滞留・遅延します。可用性要件に応じてacceptか否かを意図的に決めます。- DNS への公開鍵登録漏れ・反映待ち: 鍵を生成しても TXT レコードを登録し、反映されるまでは検証側で
dkim=failになります。 - 権限・ソケットの不一致: ソケットのパスや権限が Postfix から見えないと、milter に接続できず送信全体が止まることがあります。
これらは一度に有効化せず、OpenDKIM → 動作確認 → OpenARC → 動作確認と段階的に進めるのが安全です。本番ドメインでいきなり全部を切り替えるのは避けてください。
よくある質問
ARC を入れれば転送メールは必ず届くようになりますか
いいえ。ARC は元の認証結果を引き継いで受信側に伝える仕組みであり、受信側がそのシールを信頼して受け入れるかは受信側の判断です。ARC が「認証を自動で通す」ものではない点に注意してください。
送信専用サーバーにも OpenARC は必要ですか
基本的には不要です。ARC シールを付けるのは転送・中継を行うサーバーの役割です。自社が単に外部へ送るだけなら、まず OpenDKIM による DKIM 署名と DMARC 対応を優先します。
OpenDKIM と OpenARC の milter はどちらを先に書きますか
OpenDKIM を先、OpenARC を後にします。OpenARC は他の milter が付けた認証結果を参照するため、署名系 milter の後段に置きます。
まとめ
- OpenDKIM は
opendkim-genkeyで鍵を生成し、smtpd_milters/non_smtpd_miltersで Postfix に連携する - OpenARC は転送時に認証結果を引き継ぐための仕組みで、シールを付ける主役は転送・中継サーバー
- ARC(RFC 8617)は AAR・AMS・AS の 3 ヘッダで構成され、
cv=で連鎖の状態を示す - 設定ミスは送信不可・認証失敗に直結するため、段階的に有効化し、その都度ヘッダを確認する
まずは現状を把握しましょう
自前構築に進む前に、自社ドメインの SPF・DKIM・DMARC の現状を 無料診断 で確認できます。設定状況がわからない方も、結果をもとにどこから着手すべきか専門家がわかりやすくサポートします。