
## この記事でわかること

- 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 を自前構築する手順](/blog/postfix-dmarc-setup) を、ARC の概念は [ARC とは｜転送メールの認証を救う仕組み](/blog/arc-what-is) を併読すると理解が早まります。

## 全体像：milter で署名とシールを束ねる

Postfix は milter（Mail Filter、メール処理を外部プログラムに委譲する仕組み）で OpenDKIM・OpenARC と連携します。送信時の流れはこうなります。

- メール送信 → Postfix → **OpenDKIM** が DKIM 署名を付与 → **OpenARC** が（転送時に）ARC シールを付与 → 外部へ送出

![Postfix と OpenDKIM・OpenARC の milter 連携の流れ](/blog/postfix-opendkim-arc-setup/milter-chain.svg)

ポイントは、milter は `smtpd_milters` に書いた順番で呼び出されることです。OpenDKIM を先、OpenARC を後に置きます。OpenARC は他の milter が付けた認証結果も参照するため、署名・検証系の milter の後段に置くのが基本です。順序を誤ると署名対象が変わり、署名そのものが無効になります。

## 構築手順：OpenDKIM から OpenARC まで

### ステップ 1: OpenDKIM で鍵を生成する

OpenDKIM はメール送信時に DKIM 署名を付与する milter です。まず署名鍵を生成します。`opendkim-genkey` コマンドを使います。

```bash
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 セレクタとは｜役割と命名の考え方](/blog/dkim-selector-explained) を参照してください。

生成されると、秘密鍵（`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 で受け取るメール（外部からの受信や、認証済みクライアントからの送信）に適用する milter
- `non_smtpd_milters`: `sendmail` コマンドなど SMTP を経由しない経路のメールに適用する milter
- `milter_default_action = accept`: milter が応答しないときの動作。`accept` にしておくと、OpenDKIM が落ちてもメール自体は止まりません

TCP ソケット（`inet:localhost:8891` など）を使う構成もあります。具体的なソケット名や権限は配布パッケージで異なるため、各ディストリビューションの設定ファイルに合わせてください。

ここで一度、自分宛てや確認用アドレスにテスト送信し、ヘッダに `DKIM-Signature` と `Authentication-Results: ... dkim=pass` が付くことを確認します。検証コマンドは [DKIM をコマンドで確認する方法](/blog/dkim-check-commands) が参考になります。

### ステップ 3: OpenARC で転送時の認証結果を保持する

ここからが本題の ARC です。ARC は RFC 8617 で定義された仕組みで、転送のように途中のサーバーがメールを処理して SPF/DKIM が無効になっても、**改変前の認証結果を引き継いで残す**ことを目的とします。

重要なのは、ARC は認証を自動的に「通す」ものではない点です。ARC は元の認証結果を封印して受信側に伝えるだけで、最終的にそれを信頼して受け入れるかどうかは**受信側の判断**です。

![転送で認証が壊れる問題と ARC の役割](/blog/postfix-opendkim-arc-setup/arc-forwarding.svg)

そのため、ARC シールを付ける主役は**転送する側のサーバー**（メーリングリストや中継サーバー）です。単純に外部へ送るだけの送信専用サーバーが、自分の出すメールに ARC を付ける必要は基本的にありません。自社が転送・中継の役割を担う場合に OpenARC を入れる、と整理してください。

OpenARC も milter として動きます。RFC 8617 では、転送ごとに次の 3 つのヘッダからなる「ARC セット」が 1 つ追加されます。

![ARC ヘッダセットの構成（AAR・AMS・AS）](/blog/postfix-opendkim-arc-setup/arc-header-set.svg)

- **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 の現状を [無料診断](/diagnose) で確認できます。設定状況がわからない方も、結果をもとにどこから着手すべきか専門家がわかりやすくサポートします。
