| SPF | = | 送信サーバのIPアドレスを確認し、「MAIL FROM」にあるドメインのSPFレコードをDNS検索して、そのIPアドレスが送信を許可されているかを照合する仕組みです。 |
| DKIM | = | メールヘッダーやメール本文の一部を使って電子署名を付与して送信します。受信サーバはDNSから公開鍵を取得し、メールを検証し、内容が改ざんされていないか確認します。内容が改ざんされていないか確認をして、正しいメール(改ざんされていない)であることを確認します。 |
| DMARC | = | SPFとDKIMの判定から総合的に正しいメールかどうかを判定します。 |
| 発信サーバ | -> | 受信A 兼 転送サーバ | -> | 受信Bサーバ |
| hasin.server | jusinA.server | jusinB.server |
[ 送信元 ] [ 転送元 ] [ 受信先 ]
taiyudenki ---------> Gmail ------------> @nifty
| | |
(DKIM署名) (ARC署名) (ARC検証)
| 「前の認証はOK」 「鎖がつながった!」
+------------------印------------------> 合格
もう少しわかりやすい図
★dnf で openarcをインストールする
# dnf info openarc
メタデータの期限切れの最終確認: 4:03:54 前の 2025年07月14日 10時31分57秒 に実施しました。
利用可能なパッケージ
名前 : openarc
バージョン : 1.0.0
リリース : 0.15.Beta3.el9
Arch : x86_64
サイズ : 59 k
ソース : openarc-1.0.0-0.15.Beta3.el9.src.rpm
リポジトリー : epel
概要 : An open source library and milter for providing ARC service
URL : https://github.com/trusteddomainproject/OpenARC
ライセンス : BSD and Sendmail
説明 : The Trusted Domain Project is a community effort to develop and maintain a
: C library for producing ARC-aware applications and an open source milter for
: providing ARC service through milter-enabled MTAs.
# dnf install openarc
メタデータの期限切れの最終確認: 4:07:14 前の 2025年07月14日 10時31分57秒 に実施しました。
依存関係が解決しました。
============================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
============================================================================================================================
インストール:
openarc x86_64 1.0.0-0.15.Beta3.el9 epel 59 k
依存関係のインストール:
libopenarc x86_64 1.0.0-0.15.Beta3.el9 epel 42 k
トランザクションの概要
============================================================================================================================
インストール 2 パッケージ
ダウンロードサイズの合計: 102 k
インストール後のサイズ: 187 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/2): libopenarc-1.0.0-0.15.Beta3.el9.x86_64.rpm 639 kB/s | 42 kB 00:00
(2/2): openarc-1.0.0-0.15.Beta3.el9.x86_64.rpm 785 kB/s | 59 kB 00:00
----------------------------------------------------------------------------------------------------------------------------
合計 252 kB/s | 102 kB 00:00
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
準備中 : 1/1
インストール中 : libopenarc-1.0.0-0.15.Beta3.el9.x86_64 1/2
scriptletの実行中: openarc-1.0.0-0.15.Beta3.el9.x86_64 2/2
インストール中 : openarc-1.0.0-0.15.Beta3.el9.x86_64 2/2
scriptletの実行中: openarc-1.0.0-0.15.Beta3.el9.x86_64 2/2
検証中 : libopenarc-1.0.0-0.15.Beta3.el9.x86_64 1/2
検証中 : openarc-1.0.0-0.15.Beta3.el9.x86_64 2/2
インストール済み:
libopenarc-1.0.0-0.15.Beta3.el9.x86_64 openarc-1.0.0-0.15.Beta3.el9.x86_64
完了しました!
★keyfileを作成する
# cd /etc/openarc
# ls -l
合計 4
-r--r-----. 1 openarc openarc 23 10月 3 2022 PeerList
# mkdir keys
# chown openarc:postfix /etc/openarc/keys
# chmod 700 /etc/openarc/keys
# ls -l
合計 8
-r--r-----. 1 openarc openarc 23 10月 3 2022 PeerList
drwx------. 2 openarc openarc 4096 7月 14 15:47 keys
※公式は以下の通りです
# opendkim-genkey -D (キーを保存するディレクトリ) -s (セレクタ名) -d (ドメイン) --restrict <-これは電子メール専用という意味
# opendkim-genkey -D /etc/openarc/keys -s usi.nu.arc.202601 -d usi.nu --restrict
# ls -l keys/
合計 16
-rw-------. 1 root root 916 7月 14 15:50 usi.nu.arc.202601.private (秘密鍵)
-rw-------. 1 root root 339 7月 14 15:50 usi.nu.arc.202601.txt (公開鍵、DNSレコード用)
所有者の修正
# chown -R openarc:postfix /etc/openarc/keys/usi.nu.arc.202601.*
# chmod 400 /etc/openarc/keys/usi.nu.arc.202601.private
# ls -l /etc/openarc/keys/
合計 8
-r--------. 1 openarc postfix 916 7月 14 15:50 usi.nu.arc.202601.private
-rw-------. 1 openarc postfix 339 7月 14 15:50 usi.nu.arc.202601.txt
★公開鍵を修正する(*.txt のファイルの中身を編集しておく)
# vi /etc/openarc/keys/usi.nu.arc.202601.txt
変更点
s=email; -> うまく動作しないときは消してください
v=DKIM1 -> v=ARC1
DKIM key -> ARC key コメント欄
※v=DKIM1 のままでも動作します。もし v=ARC1 に書き換える場合は、受信側での検証結果(Authentication-Results)にエラーが出ないか要確認※
usi.nu.arc.202601._domainkey IN TXT ( "v=DKIM1; k=rsa; s=email; "
"p=angoupasu.yamatoiebakawa" ) ; ----- DKIM key usi.nu.arc.202601 for usi.nu
dkimの書き方になっているので arc の書き方に変える
usi.nu.arc.202601._domainkey IN TXT ( "v=ARC1; k=rsa; "
"p=angoupasu.yamatoiebakawa" ) ; ----- ARC key usi.nu.arc.202601 for usi.nu
★openarc.serviceのoverride(上書き)
openarc は単体では動きますが、
Postfix からソケット(openarc.sock)経由で利用できないと ARC 署名が付きません。
そのため systemd の設定を上書きして、
・Postfix グループでソケットにアクセスできるようにする
・起動時に自動で /run/openarc を作らせる
という調整を行います。
-----
■ Group=postfix とは?
openarc は通常 openarc ユーザーで動きますが、
Postfix からは postfix グループの権限でソケットへ接続します。
そこで
Group=postfix
と指定し、Postfix が openarc.sock を使えるようにしています。
-----
# systemctl edit openarc
--- 以下の内容に変更する ----
[Service]
Group=postfix
UMask=0007
RuntimeDirectory=openarc
RuntimeDirectoryMode=0755
ctrl+O(オー) で上書き
ctrl+x(エックス)で終了
※ override設定により、起動時に /run/openarc は自動生成され権限も付与されるため、手動設定は初回確認用となります。
◆◆注意◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆ 保存したときに、以下のメッセージが出ていれば保存はされていません。 ◆
◆ ◆
◆ # systemctl edit openarc ◆
◆ Editing "/etc/systemd/system/openarc.service.d/override.conf" canceled: temporary file is empty. ◆
◆ ◆
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
このメッセージの意味は「ファイルの中身が空っぽだったので、編集をキャンセルしました(保存しませんでした)」です。
何らかの問題でうまく保存できないようです。その場合は直接書き込むことにします。
- ディレクトリを作成します。編集ファイルの保存場所です。
# mkdir -p /etc/systemd/system/openarc.service.d
- 設定を書いたファイルを作成します。
# vi /etc/systemd/system/openarc.service.d/override.conf
以下、内容です
[Service]
Group=postfix
UMask=0007
※ RuntimeDirectory の設定は openarc.conf 側と競合したり、バージョンによって挙動が変わることがあるため、まずは一番重要な「グループ権限」と「UMask」だけ設定してシンプルに解決を図ります。
※ UMask=0007 は、ソケットファイルを所有者とグループのみアクセス可能にするための設定です。
- 設定ファイルの変更をデーモンに認識させます。
# systemctl daemon-reload
- openarcを再起動します。
# systemctl restart openarc
再起動すると以下のメッセージが表示される場合があります。
Warning: The unit file, source configuration file or drop-ins of openarc.service changed on disk. Run 'systemctl daemon-reload' to reload units.
これは、「手動で設定ファイルを書き換えたからデーモンファイルを先に読み込んでください」という意味です。
もう一度、systemctl daemon-reload を実行してから、openarc を再起動をしてください。
- Postfixを再起動します。
# systemctl restart postfix
★socketのグループをpostfixに変更。権限も設定
# chgrp postfix /var/run/openarc
# chmod 755 /var/run/openarc
※※ socket 権限は systemd override により永続化するため、手動 chmod は初期確認用途とする
★openarc.confを編集(※ ARC では SignHeaders 指定は必須ではないが、明示指定として残す)
------
■ SignHeaders とは?
ARC 署名に含めるメールヘッダーを指定しています。
通常は自動で選ばれますが、
ここでは 重要なヘッダーだけを明示的に指定しています。
もし指定しなくても ARC 自体は動作しますが、
構成を分かりやすくするために記載しています。
-------
# vi /etc/openarc.conf
## See openarc.conf(5) or /usr/share/doc/openarc-1.0.0/openarc.conf.sample for more
#PidFile /run/openarc/openarc.pid
Syslog yes
#UserID openarc:openarc
UserID openarc:postfix
#Socket local:/run/openarc/openarc.sock
Socket local:/var/run/openarc/openarc.sock
#SignHeaders to,subject,message-id,date,from,mime-version,dkim-signature
SignHeaders to,subject,message-id,date,from,mime-version,dkim-signature,arc-seal,arc-message-signature,arc-authentication-results
PeerList /etc/openarc/PeerList
MilterDebug 6
EnableCoredumps yes
## After setting Mode to "sv", running
## opendkim-genkey -D /etc/openarc -s key -d
## and putting /etc/openarc
#Mode sv
#Canonicalization relaxed/simple
#Domain example.com # change to domain
#Selector key
#KeyFile /etc/openarc/key.private
#SignatureAlgorithm rsa-sha256
Mode sv
Canonicalization relaxed/relaxed
Domain usi.nu
Selector usi.nu.arc.202601
KeyFile /etc/openarc/keys/usi.nu.arc.202601.private
SignatureAlgorithm rsa-sha256
## debug mode
Syslog yes
★postfixのmain.cfを編集
milterを追加 (opendkim と opendmarc は追加済みと仮定)
------
■ milter_protocol = 6 とは?
Postfix と openarc(milter)が通信する際の
プロトコルの世代番号です。
最近の Postfix では「6」が推奨されており、DKIM / DMARC / ARC などの
milter を併用できるSMTP拡張に対応といった理由で指定しています。
-----
# openDKIM and openDMARC and openARC
smtpd_milters = unix:/var/run/opendkim/opendkim.sock, unix:/run/opendmarc/opendmarc.sock, unix:/var/run/openarc/openarc.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 6
★再起動
# systemctl restart openarc
/var/log/messages に以下のログがあればOK (エラーが無ければよい)
Jun 14 12:10:59 mon systemd[1]: Stopping Authenticated Receive Chain (ARC) Milter...
Jun 14 12:11:01 mon systemd[1]: openarc.service: Deactivated successfully.
Jun 14 12:11:01 mon systemd[1]: Stopped Authenticated Receive Chain (ARC) Milter.
Jun 14 12:11:01 mon systemd[1]: Starting Authenticated Receive Chain (ARC) Milter...
Jun 14 12:11:01 mon systemd[1]: Started Authenticated Receive Chain (ARC) Milter.
# systemctl restart postfix
/var/log/messages に以下のログがあればOK (エラーが無ければよい)
Jun 14 12:12:33 mon systemd[1]: Stopping Postfix Mail Transport Agent...
Jun 14 12:12:33 mon systemd[1]: postfix.service: Deactivated successfully.
Jun 14 12:12:33 mon systemd[1]: Stopped Postfix Mail Transport Agent.
Jun 14 12:12:33 mon systemd[1]: postfix.service: Consumed 13.527s CPU time.
Jun 14 12:12:33 mon systemd[1]: Starting Postfix Mail Transport Agent...
Jun 14 12:12:33 mon systemd[1]: Started Postfix Mail Transport Agent.
★チェック
# ls -l /var/run/openarc/
合計 0
srwxrwx---. 1 openarc postfix 0 7月 14 10:38 openarc.sock
★リブート時に自動起動するように設定する。
サーバを再起動や電源投入をすると自動的に openarc が起動するようにします。
# systemctl enable openarc
Created symlink /etc/systemd/system/multi-user.target.wants/openarc.service → /usr/lib/systemd/system/openarc.service.
確認をします。
# systemctl is-enabled openarc
enabled
★ゾーンファイルの編集
【ネームサーバの設定を変更します】
$ORIGINを使っている場合は、完全版としてドメインを書いてドットで締めて下さい。
【例】
usi.nu.arc.202601._domainkey の場合
--- [決定版:FQDN形式] 末尾のドメイン名とドットを忘れずに ---
usi.nu.arc.202601._domainkey.usi.nu. IN TXT ( "v=ARC1; k=rsa; "
"p=angoupasu.yamatoiebakawa" )
--- [決定版:相対名形式] $ORIGIN usi.nu. が定義されている場合 ---
usi.nu.arc.202601._domainkey IN TXT ( "v=ARC1; k=rsa; "
"p=angoupasu.yamatoiebakawa" )
ARCのキーファイルを追記
DKIM/DMARC/ARCの公開鍵でセレクタ名の末尾にドットを忘れないこと!
# cd /var/named
# vi zone.file
2025122358 ; serial <- カウントを上げる事
; openDKIM
usi.nu.202506._domainkey.usi.nu. IN TXT ( "v=ARC1; k=rsa; p=angoupasu.yamatoiebakawa");
; openDMARC
_dmarc.usi.nu. IN TXT "v=DMARC1; p=reject; sp=reject; rua=mailto:hoge@usi.nu; ruf=mailto:hoge@usi.nu; fo=1; adkim=r; aspf=r"
; openARC
usi.nu.arc.202601._domainkey.usi.nu. IN TXT ( "v=ARC1; k=rsa; p=angoupasu.yamatoiebakawa")
文法チェック
# named-checkzone usi.nu /var/named/usi.zone.signed
zone usi.nu/IN: loaded serial 2025122358 (DNSSEC signed)
OK
# named-checkconf
# <-問題が無ければ何も表示されません
★再起動
# systemctl restart named
★動作確認
[root@dns named]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: disabled)
Active: active (running) since Mon 2025-07-14 16:50:37 JST; 5s ago
Process: 223386 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin>
Process: 223388 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/S>
Main PID: 223389 (named)
Tasks: 8 (limit: 11075)
Memory: 24.3M
CPU: 55ms
CGroup: /system.slice/named.service
223389 /usr/sbin/named -u named -c /etc/named.conf
7月 14 16:50:37 dns.usi.nu named[223389]: zone usi.nu/IN: loaded serial 2026011401 (DNSSEC signed)
7月 14 16:50:37 dns.usi.nu named[223389]: zone usi.nu/IN: sending notifies (serial 2026011401)
7月 14 16:50:37 dns.usi.nu named[223389]: all zones loaded
7月 14 16:50:37 dns.usi.nu named[223389]: running
7月 14 16:50:37 dns.usi.nu systemd[1]: Started Berkeley Internet Name Domain (DNS).
7月 14 16:50:37 dns.usi.nu named[223389]: client @0x7f9a400263d8 133.18.195.89#48471 (usi.nu): transfer>
7月 14 16:50:37 dns.usi.nu named[223389]: client @0x7f9a400263d8 133.18.195.89#48471 (usi.nu): transfer>
7月 14 16:50:37 dns.usi.nu named[223389]: resolver priming query complete
7月 14 16:50:37 dns.usi.nu named[223389]: managed-keys-zone: Key 20326 for zone . is now trusted (accep>
7月 14 16:50:37 dns.usi.nu named[223389]: managed-keys-zone: Key 38696 for zone . is now trusted (accep>
-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-
メールが転送されると、送信元の証明(SPF)が途切れてしまうことがあります。その問題を解決するのがARC(Authenticated Received Chain)という仕組みです。
以下に、実際の転送過程で記録されたメールヘッダーのサンプルを掲載します。
配送ルート: usi.nu → Gmail → @nifty
注目点は、各サーバーが「認証結果を封印(Seal)」してバトンを渡しているところです。
ヘッダー内の「i=1, i=2, i=3」という数字が、何番目に通過したサーバーであるかを示しています。
Delivered-To: hoge@gmail.com
Received: by 2002:ac4:c8d5:0:b0:772:cbf4:a3bf with SMTP id e21csp212415pim;
Wed, 11 Feb 2026 06:37:06 -0800 (PST)
ARC-Seal: i=2; a=rsa-sha256; t=1770820626; cv=pass;
d=google.com; s=arc-20240605;
b=EwAdFyrQhg... (署名略)
ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com;
bh=IUas9qVYA... (ハッシュ略)
b=X0K+eXBZKy... (署名略)
ARC-Authentication-Results: i=2; mx.google.com;
dkim=pass header.i=@usi.nu;
arc=pass (i=1);
spf=pass;
dmarc=pass header.from=usi.nu
Return-Path: <hogeusi@usi.nu>
Authentication-Results: mz.usi.nu; arc=none
ARC-Seal: i=1; a=rsa-sha256; d=usi.nu; s=usi.nu.arc.202601; cv=none;
b=qloqux7xl... (署名略)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usi.nu; s=usi.nu.202509;
bh=IUas9qVYA... (ハッシュ略)
b=OKGm51nLBN... (署名略)
To: "Test Gmail" <hoge@gmail.com>
From: usi.nu <hogeusi@usi.nu>
Subject: test mail
this is a test mail.
Return-Path : <hoge+caf_=hogeusi=nifty.com@gmail.com>
Authentication-Results : nifty.com;
dmarc=pass header.from=usi.nu;
dkim=pass;
spf=pass smtp.mailfrom=gmail.com;
ARC-Seal : i=3; a=rsa-sha256; t=1770820628; cv=pass;
d=google.com; s=arc-20240605;
b=bt+634H8Iq... (署名略)
ARC-Seal : i=2; a=rsa-sha256; t=1770820626; cv=pass;
d=google.com; s=arc-20240605;
b=EwAdFyrQhg... (署名略)
ARC-Seal : i=1; a=rsa-sha256; d=usi.nu; s=usi.nu.arc.202601; cv=none;
b=qloqux7xl... (署名略)
ARC-Authentication-Results : i=3; mx.google.com;
dkim=pass header.i=@usi.nu;
arc=pass (i=1);
spf=pass;
dmarc=pass header.from=usi.nu
X-Forwarded-To : hogeusi@nifty.com
X-Forwarded-For : hoge@gmail.com hogeusi@nifty.com
Delivered-To : hoge@gmail.com
From : usi.nu <hogeusi@usi.nu>
Subject : test mail
this is a test mail.