
前回の記事で、VPSリレー(リバースプロキシ、以下串)とお名前.comのDNSトラップを乗り越え、ついに自分だけの自作メールサーバー(mail@test-site.online)を開通させることができました。スマホやPCのメールアプリから安全に接続できたときの感動はひとしおだったはずです。
しかし、現代のメール運用において、サーバーが開通しただけではまだ「半分」しか終わっていません。
いざ意気揚々と自分のサーバーからGmailやYahoo!メールなどの大手サービスへメールを送信してみると、「メールが届かない(受信拒否される)」、あるいは「謎の警告とともに迷惑メールフォルダに叩き落とされる」という、冷酷な現実の壁にぶつかることになります。
現代のメールサーバーに課された「最終試練」
なぜ、完璧に設定したはずのメールが弾かれてしまうのでしょうか?その理由は、世界中で横行するフィッシング詐欺やなりすましメールに対抗するため、Googleをはじめとする大手メールサービスが「送信ドメイン認証」を2024年以降、完全義務化・厳格化したからです。
現代のインターネットの世界では、「私は test-site.online というドメインの持ち主です」と口頭で名乗るだけでは誰も信用してくれません。客観的かつ技術的な「本物の証拠」をメールに添付しなければ、スパム業者と同等に扱われてしまうのです。
そこで本記事では、自作メールサーバーの最終仕上げとして、以下の3つの送信ドメイン認証技術を網羅した「完全攻略ガイド」をお届けします。
- SPF:お名前.comに1行書くだけで、「このVPSのIPアドレスから送るよ」と宣言する足がかり
- DKIM:メールに偽造不可能な電子署名(ハンコ)を施し、改ざんを防ぐ今回のメイン山場
- DMARC:もし認証に失敗した偽物が届いた場合の「処分方針」を宣言する最後の仕上げ
コピペ記事では絶対に詰まる「VPSリレー環境」の罠
ネットに転がっている多くの解説記事は、「1台のVPSで完結する環境」を前提に書かれています。しかし、私たちの環境は「自宅サーバーでメールを作り、外部のVPS(串)を経由して世界へ送り出す」という特殊な2階建て構造です。
「電子署名のハンコは自宅サーバーとVPS、どちらで押すべきなのか?」 「DNSに登録するIPアドレスはどちらを指定すればいいのか?」
こうした、コピペ記事をなぞっただけでは100%迷宮入りするリレー環境ならではの構造的な罠を完全に紐解きながら、一歩ずつ確実にプロ仕様の最強メールインフラへと進化させていきましょう。
- 1.なぜ届かない?Gmailが自作メールを拒否する理由と送信ドメイン認証の基本
- 2.まずは5分で完了!お名前.comでのSPFレコード設定
- 3.今回の山場!VPS側でのOpenDKIMインストールと鍵の生成
- 4.お名前.comへのDKIM公開鍵登録と、VPS側でのOpenDKIM設定
- 5.仕上げ!VPS側のPostfixとOpenDKIMの連動設定
- 6.まとめ:自前の「2階建てリレー」がもたらす極上の安心感
1.なぜ届かない?Gmailが自作メールを拒否する理由と送信ドメイン認証の基本
無事にサーバーを開通させたはずの自作メールが、なぜGmailなどの大手サービスに届かないのか。その理由は、Postfixの設定ミスやUbuntuのバグではありません。
原因は、Googleをはじめとするメールプラットフォーム側が、セキュリティの「関所」をかつてないほど強固に閉ざしてしまったからです。
1章では、現代のメール運用において自作サーバーが必ず叩き落とされる技術的な背景と、それを堂々と突破するための身分証明書である「送信ドメイン認証」の具体的なメカニズムを紐解いていきます。
1-1. Googleが仕掛ける罠:なりすまし判定の裏側
メールというプロトコル(SMTP)は、実は1980年代の設計思想から根本が変わっておらず、「差出人(From)の名前を誰にでも自由に偽装できてしまう」という致命的な弱点を持っています。
例えば、管理人が自分のサーバーから「差出人:support@google.com」と嘘を書いてメールを送っても、基本機能だけでは受信側のサーバーはそれが嘘かどうかを見抜けません。これが、世界中でフィッシング詐欺メールが無くならない根本原因です。
これに対し、Googleの受信サーバーは、2024年のガイドライン厳格化以降、届いたメールの「From」を一切信用しなくなりました。代わりに、メールが届いた瞬間に「そのドメインの裏に隠されたDNS(ネームサーバー)の情報」や「暗号鍵の署名」を自動で裏取りしに行く仕様へと変わったのです。
この裏取り(チェック)に1つでも失敗するか、あるいは情報自体が登録されていない場合、Googleは「詐欺メールの可能性がある」と判断し、容赦なく 550エラー で接続を拒否します。
1-2. 認証のメカニズム:3つの技術はどう連携しているのか?
冒頭でお話ししたSPF、DKIM(ディーキム)、DMARC(ディーマーク)の3つは、単体で動いているのではなく、受信側のサーバーで「3段階のコンボ(連携)」として処理されています。具体的な処理の流れを見てみましょう。
- 第1関門SPFチェック
受信サーバー「送ってきた奴のIPアドレスを、ドメインのDNSに聞きに行こう。……ヨシ、許可リストにあるVPSのIPと一致したな!」
- 第2関門DKIMチェック
受信サーバー「メールに添付されている電子署名を、DNSにある公開鍵で解凍してみよう。……ヨシ、途中で本文が改ざんされてないな!
- 第3関門DMARC判定(最終ジャッジ)
受信サーバー「SPFもDKIMもクリアしたから、このメールは『本物』だ。ヨシ、トレイに届けよう!」(※もしどちらかが失敗していたら、ドメイン元の指示に従って迷惑メールへ放り込むか、受信拒否する)
このように、SPFで「ルート(経路)」を保証し、DKIMで「中身(改ざんの有無)」を証明し、DMARCで「最終的なポリシー」を適用する、という連携プレイによって、初めてGoogleから「安全なメール」としての合格通知をもらうことができるのです。
1-3. 【重要】今回の「VPSリレー環境」における最大の罠
ここで、私たちの「自宅サーバー(Ubuntu)でメールを生成し、フロントのVPS(串)を経由して世界へ送信する」という特殊な2階建て構造ならではの注意点を確認しておきます。
一般的な「1台のVPSで完結する環境」のコピペ記事をなぞると、100%大混乱に陥るポイントが2つあります。
罠①:SPF(DNS)に登録すべきIPアドレスはどっち?
「送信サーバーのIPアドレスを許可リストに登録する」と言われたとき、自宅のグローバルIP(HGWのIP)を登録すべきでしょうか?それともVPSのIPでしょうか?
正解は「VPSのIPアドレス」です。 Gmailの受信サーバーから見れば、メールを直接持って接続しにきた相手は、最後に中継したフロントのVPSだからです。ここに自宅のIPを書いてしまうと、チェック時にミスマッチが起きて確実に弾かれます。
罠②:DKIMの電子署名(ハンコ)はどこで押す?
メールの本文にデジタルなハンコ(署名)を施すツール(OpenDKIM)は、自宅サーバーとVPSのどちらで動かすべきでしょうか?
これは「外の世界へメールを解き放つフロント(VPS)側」で実装するのが最もスマートです。 自宅サーバー側で署名をしてからVPSに送ることも技術的には可能ですが、リレー(転送)の過程でPostfixがメールヘッダーを書き換えてしまうと、せっかくの署名が壊れて「改ざんあり」と判定されるリスクが高まります。外と直接やり取りするVPS側で、旅立つ直前のメールにガチャンとハンコを押すのが一番安全です。
さあ、最終試練を始めよう
仕組みと、私たちの環境における「正解のルート」は見えました。 「なんだか難しそう……」と感じる必要はありません。今回は、一番簡単で5分で終わる「SPFの設定」から順番にステップアップしていきます。
お名前.comのDNSレコードを操作し、VPSの中にOpenDKIMという強力な署名マシンを組み込んでいく過程は、インフラエンジニアとしての知的好奇心をこれ以上ないほど刺激してくれるはずです。
準備はいいですか?さっそく最初のステップへ進みましょう!
2.まずは5分で完了!お名前.comでのSPFレコード設定
送信ドメイン認証の三本の矢、その最初のステップは「SPFレコード」の設定です。
SPFは「私のドメインのメールは、このIPアドレスのサーバーからしか送信しません!」という許可リストを世界に向けて公開する仕組みです。この項目はファイルを編集するような黒い画面(ターミナル)の操作は一切ありません。ドメインを管理している「お名前.com」のコントロールパネルに、指定されたテキストを1行追記するだけで、ノータイムで完了します。
さっそく、インフラの土台となる最初の身分証明書を設定していきましょう。
2-1. 【最重要】登録すべき「正しいIPアドレス」の確認
作業に入る前に、1章でお話しした「今回の環境ならではの罠」をもう一度だけ思い出してください。
私たちがDNSに登録すべきなのは、自宅サーバーのIPアドレスではなく、「フロントでメールを中継しているVPSのグローバルIPアドレス」です。
お名前.comにログインする前に、お手元のメモ書きや前回の設定ログを確認し、フロントVPSのパブリックIPアドレス(例:118.27.203.45 などの数字の羅列)をいつでもコピーできるように手元に用意しておいてください。
2-2. お名前.comでのDNSレコード追加手順
準備ができたら、ブラウザでお名前.comの「Navi(管理画面)」を開き、以下の手順で設定を進めます。
- DNS設定画面を開く
お名前.com Naviにログイン後、サイドバーメニューの「DNS」から「DNSドメイン設定」に進み、今回使用しているドメイン(test-site.online)を選択して「次へ」をクリックします。 - DNSレコード設定画面へ進む
ページ中ほどにある「DNSレコード設定を利用する」の横にある「設定する」ボタンをクリックします。 - 入力エリアにSPFの値を書き込む
「ホスト名 / Type / TTL / Value」が並ぶ入力欄を見つけたら、以下の通りにカチッと入力してください。
| 項目 | 入力内容 | 解説 |
|---|---|---|
| ホスト名 | (空欄のままでOK) | ドメイン全体(test-site.online)に適用するため、何も入力しません。 |
| Type | TXT | SPFはテキスト形式で記述するルールのObject(オブジェクト)なので、必ず TXT を選択します。 |
| TTL | 3600 | 標準値のままで構いません。 |
| Value | v=spf1 ip4:【VPSのIPアドレス】 ~all | ★今回の核心部分です。 後述の書き方を参考に正確に入力します。 |
💡 Value欄の具体的な入力例:
あなたのVPSのグローバルIPアドレスが 118.27.203.45 だった場合、Value欄には以下のように入力します。
【Value欄の入力内容】
v=spf1 ip4:118.27.203.45 ip6:2001:db8::1 ip4:153.156.79.69 ~all
(※ 2001:db8::1 は、インターネット規格(RFC 3849)で定められた解説用のサンプルIPv6アドレスです。
実際に登録する際は、ご自身のフロントVPSに割り当てられている本物のIPv6アドレスに書き換えて入力してください)
[Vaue field]
v=spf1 ip4:118.27.203.45 ip6:2001:db8::1 ip4:153.156.79.69 ~all
(Note: 2001:db8::1 is a documentation-only example IPv6 address
defined by RFC 3849.
When configuring the actual SPF record, replace it with the real IPv6
address assigned to your front-end VPS.)
(※ v=spf1 の後ろ、および ip4:... の後ろには、それぞれ半角スペースが1つずつ入ります。ここが詰まっていると構文エラーになるので注意してください)
入力が終わったら、画面下部にある「追加」ボタンを押し、最後に「確認画面へ進む」から「設定する」をクリックしてDNSに反映させます。
2-3. SPFレコードの文字列が持つ技術的な意味
お名前.comに入力した v=spf1 ip4:118.27.203.45 ~all という謎の呪文。これが一体どういう意味を持って機能しているのか、受信側(Gmail)の視点で分解してみましょう。
v=spf1「今からSPFのバージョン1のルールを書きますよ」という宣言です。ip4:118.27.203.45(VPSのip4アドレス)ip6:2001:db8::1(VPSのip6アドレス)ip4:153.156.79.69(自宅のip4アドレス)「このIPアドレスから送られたメールだけが、正真正銘の本物です」という許可証です。Gmailはメールを受け取ったとき、このIPと送信元IPが一致するかを答え合わせします。~all(SoftFail / ソフトフェイル) 「もし上記以外のIPから届いたら、それは偽物の可能性が高い(SoftFail)から、注意するか迷惑メールフォルダに処理してね」という、受信側への推奨アクションです。最初は安全のために、完全に拒否(-all(マイナス))するのではなく、この緩めの設定(~all(チルダ))にしておくのがインフラ運用のセオリーです。
お疲れ様でした!これでお名前.com側の最初の設定は完璧です。世界中のサーバーが、あなたのドメインの正しい送信元として「VPSのIP」を認識できるようになりました。
3.今回の山場!VPS側でのOpenDKIMインストールと鍵の生成
SPFで「送信元のルート」を保証したら、次はいよいよ今回のメインディッシュである「DKIM」の構築に挑みます。
DKIMは、送信するメールのヘッダーに暗号技術を用いた「電子署名(ハンコ)」を付与し、受信側(Gmailなど)がそれを検証することで、「本当にあなたのドメインから送られたこと」「途中で本文が改ざんされていないこと」を100%証明する仕組みです。
1章の設計思想通り、この署名処理は外の世界と直接通信を行う「フロントのVPS側」に実装します。暗号鍵の生成から設定まで、一歩ずつ確実に進めていきましょう。
3-1. リレー環境における「IPアドレスの役割」を整理する
混乱を防ぐために、今回使用する具体的なIPアドレスの役割をここで一度整理しておきましょう。
- 自宅サーバーのIP:
153.156.79.69 - フロントVPSのIP:
118.27.203.45
メールの作成自体は自宅(153.156.79.69)で行われますが、それがVPS(118.27.203.45)へと転送(リレー)され、最終的にVPSが世界へメールを解き放ちます。そのため、これから行うDKIMの署名ツールは、自宅サーバーではなく「VPS(118.27.203.45)」側へログインして作業を行うことになります。間違えて自宅サーバー側で作業しないよう注意してください。
3-2. OpenDKIMのインストール
まずは、VPS側で電子署名を生成・管理するためのオープンソースソフト OpenDKIM と、その関連ツールをインストールします。
VPSにSSHログインし、ターミナルで以下のコマンドを実行してください。
sudo apt update
sudo apt install opendkim opendkim-tools -yインストールが完了すると、自動的にシステムへ opendkim という専用のユーザーとグループが作成され、署名処理を行うバックグラウンドの準備が整います。
3-3. 署名の「鍵」を生成する
DKIMでは、暗号化に使う「秘密鍵」と、お名前.comのDNSに登録して世界に公開する「公開鍵」のペアをサーバー内で生成します。
安全に鍵を保管するため、専用のディレクトリを作ってその中で生成処理を行います。
1. 鍵保存用ディレクトリの作成
ドメインごと(test-site.online)にディレクトリを分けて管理します。
sudo mkdir -p /etc/opendkim/keys/test-site.online
cd /etc/opendkim/keys/test-site.online2. ツールを使った鍵の生成
以下のコマンドを実行し、2048ビットの強力な暗号鍵のペアを生成します。
sudo opendkim-genkey -b 2048 -d test-site.online -s 202607 -v💡 コマンドの引数の意味:
-b 2048:鍵の長さ(強度)を2048ビットに指定します。現代のセキュリティ基準を満たす長さです。-d test-site.online:あなたのメール用ドメインを指定します。-s 202607:「セレクタ」と呼ばれる、鍵の識別名です。今回は「2026年7月」に作った鍵であることが一目でわかるよう202607と指定しています。-v:生成の進捗を画面に詳しく表示(バーボスモード)します。
3. 生成されたファイルの確認
コマンドが成功すると、ディレクトリ内に2つのファイルが生成されます。ls コマンドで確認してみましょう。
ls -l出力結果に、以下の2つがあれば成功です。
202607.private:外部に絶対に漏らしてはならない「秘密鍵」です。VPSがメールにハンコを押すために使います。202607.txt:お名前.comのDNSに登録するための「公開鍵」の情報が記載されたテキストファイルです。
4. アクセス権限(パーミッション)の変更
最高機密である秘密鍵(.private)を他のユーザーに覗き見られないよう、かつOpenDKIMシステムだけは正常に読み込めるように、所有権と権限を厳しく制限しておきます。
sudo chown -R opendkim:opendkim /etc/opendkim/keys/test-site.online
sudo chmod 600 202607.privateこれで、VPSの内部に「電子署名マシンの心臓部」が安全な状態でセットアップされました。
4.お名前.comへのDKIM公開鍵登録と、VPS側でのOpenDKIM設定
鍵のペアが無事に生成できたら、次は「公開鍵をお名前.comのDNSに登録して世界に公開する作業」と、「VPS内のOpenDKIMがその鍵を正しく扱えるようにする紐付け作業」の2つを同時に進めていきます。
特にDNSへの登録は、生成されたファイルの文字をそのまま貼り付けるとエラーになる「特有の罠」があります。コツを掴んで綺麗にクリアしていきましょう。
4-1. お名前.comへの公開鍵(DKIMレコード)登録
まずは、先ほどVPS内で生成した 202607.txt(公開鍵ファイル)の中身を確認します。
cat /etc/opendkim/keys/test-site.online/202607.txt実行すると、以下のような内容が出力されます。
202607._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvX1zAbC2dEFG...[中略]...xYZ789abc"
"defGHIJKLMnOpQrStUvWxYz0123456789ABCDEFGbcdEfGhIjKlMnOpQrS...[中略]...QIDAQAB" ) ; ----- DKIM key 202607 for test-site.online
202607._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvX1zAbC2dEFG...[omitted]...xYZ789abc"
"defGHIJKLMnOpQrStUvWxYz0123456789ABCDEFGbcdEfGhIjKlMnOpQrS...[omitted]...QIDAQAB" ) ; ----- DKIM key 202607 for test-site.onlineこの文字列をお名前.comのDNSレコードに追加するのですが、最大の罠は「そのままコピペしてはいけない」という点です。以下のルールに従って、余計な記号を排除した「純粋な値」に成形して入力する必要があります。
お名前.comの「DNSレコード設定」画面を開き、以下のように入力してください。
| 項目 | 入力内容 | 解説 |
|---|---|---|
| ホスト名 | 202607._domainkey | セレクタ名(202607)と ._domainkey を繋いだものを入力します。 |
| Type | TXT | 公開鍵もテキスト形式なので TXT を選択します。 |
| TTL | 3600 | 標準値のままで構いません。 |
| Value | 後述の「合体させた1行の文字列」 | ★最重要: カッコ ( ) や改行、ダブルクォーテーション " をすべて取り除き、1行の長い文字列に繋ぎ直して入力します。 |
⚠️ Value欄に入力する文字列の成形例:
OpenDKIMで生成されたテキストは、お名前.comのようなDNSサービスに登録しやすいよう、以下の3つのパーツに分かれて出力されています。
- パーツ①:
"v=DKIM1; h=sha256; k=rsa; " - パーツ②:
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvX1z...xYZ789abc" - パーツ③:
"defGHIJKLMnOpQrStUvWxYz0123456789ABCDEFGbcdEfGhI...QIDAQAB"
お名前.comのValue欄に登録する際は、これらを囲んでいるダブルクォーテーション( " )と、パーツ間の改行やスペースをすべて取り除き、1本の長いひも状の文字列に合体させる必要があります。
⭕ OK(正しい例):v=DKIM1; h=sha256; k=rsa; p=MIIBIj...xYZ789abcdefGHI...QIDAQAB
二重引用符をすべて消し去り、パーツ①・②・③の境界線を完全にピタッとくっつけて1行に繋げたもの。(パーツ②の末尾 abc と、パーツ③の先頭 def の間もスペースなしでドッキングします)
❌ NG(登録エラーになる例):"v=DKIM1; h=sha256; k=rsa; " "p=MIIBIj..." "defGHI..." (二重引用符が残ったままで、パーツの間にスペースが入ってしまっている)
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvX1z...[中略]...QIDAQAB
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvX1z...[omitted]...QIDAQABお使いの環境で作成された実際の鍵を合体させる時は、途中に余計な「半角スペース」や改行、二重引用符 " が混ざっていないことをしっかり確認して貼り付けてください。
なお、出力の最後にある ) ; ----- DKIM key... 以降のコメント部分はお名前.comには一切不要ですので、入力に含めないでください。
4-2. お名前.comへのDMARCレコード登録
SPF、DKIMに続く「送信ドメイン認証の三本の矢」、その最後を担うのが「DMARC」の設定です。
1章のメカニズムで解説した通り、DMARCはSPFとDKIMの認証結果を統合し、「もし認証に失敗した『なりすましメール』が届いた場合、そのメールをどう処分するか」を受信側(Gmailなど)のサーバーに対して指示するためのポリシー設定です。
お名前.comの「DNSレコード設定」画面の入力エリアに、以下の通り正確に入力してください。
| 項目 | 入力内容 | 解説 |
|---|---|---|
| ホスト名 | _dmarc | DMARC専用のサブドメインとなるため、必ず先頭にアンダーバーを付けた_dmarc を入力します。 |
| Type | TXT | DMARCもテキスト形式のレコードなので TXT を選択します。 |
| TTL | 3600 | 標準値のままで構いません。 |
| Value | v=DMARC1; p=none; | 認証失敗時のポリシーとして、まずは最も安全な「監視モード(none)」を宣言します。 |
💡 Value欄(ポリシー)の運用のセオリーp=none は「認証に失敗したメールも、受信拒否せずそのまま通して(ただし裏でチェックしてログに残してね)」という設定です。いきなり p=reject(完全に拒否する)に設定してしまうと、万が一設定漏れや切り替え時のタイムラグがあった場合に、本物のメールまで世界中から消滅してしまうリスクがあります。まずはこの none で安全にスタートし、運用が安定した後に制限を強めていくのがインフラ構築のセオリーです。
4-3.世界に届いているか?DNSレコードの浸透確認
お名前.comでのレコード登録が完了したら、Postfixの設定に移る前に、設定した内容がインターネット上に正しく反映(浸透)されているかを必ず確認しましょう。
お使いのPC(WindowsのコマンドプロンプトやMacのターミナル)、またはVPSのターミナルから nslookup コマンドを実行することで、現在の公開状況を瞬時に裏取りできます。
① SPFレコードの確認コマンド
以下のコマンドを実行し、ドメインのTXTレコードを取得します。
nslookup -type=TXT test-site.online【正しい出力結果のイメージ】
Non-authoritative answer:
test-site.online text = "v=spf1 ip4:118.27.203.45 ~all"このように、先ほどお名前.comで整理したSPFレコードがピシッと1行だけ返ってくれば成功です。
② DKIM公開鍵レコードの確認コマンド
続いて、設定したセレクタ名(202607)を指定して、DKIMの公開鍵が正しく引けるかを確認します。ホスト名には [セレクタ名]._domainkey.test-site.online を指定します。
nslookup -type=TXT 202607._domainkey.test-site.online【正しい出力結果のイメージ】
Non-authoritative answer:
202607._domainkey.test-site.online text = "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoLqH...[中略]...QIDAQAB"先ほど3つのパーツから苦労して1行に合体させた、あの長い文字列がそのまま綺麗に出力されれば大成功です!画面上では text = "..." とダブルクォーテーションで囲まれて表示されますが、これは nslookup コマンドが自動で付与しているものなので、この形になっていれば正しく登録できている証拠です。
💡 レコードが反映されない場合:
DNSレコードの変更が世界中のDNSサーバーに行き渡るまで、数分〜最大で数時間かかる場合があります。コマンドを打っても何も返ってこない、あるいは古い情報が出る場合は、10分ほどコーヒーでも飲んで一息ついてから再度試してみてください。
③ DMARCレコードの確認コマンド
最後に、設定したDMARCレコードが正しく引けるかを確認します。ホスト名には _dmarc.test-site.online を指定します。
nslookup -type=TXT _dmarc.test-site.online【正しい出力結果のイメージ】
Non-authoritative answer:
_dmarc.test-site.online text = "v=DMARC1; p=none;"4-4. VPS側OpenDKIMの信頼ネットワークとマッピング設定
DNSの公開鍵がセットできたら、今度はフロントVPSの内部設定を調整します。
OpenDKIMはセキュリティ上、デフォルトでは「VPS内部(ローカルホスト)」で生成されたメールにしか署名のハンコを押しません。今回は「自宅サーバー(外部のIP)からリレーされてきたメール」に署名させる必要があるため、OpenDKIMのメイン設定と、信頼するネットワークの許可リスト(TrustedHosts)、そして鍵のマッピング設定を行います。
① OpenDKIMメイン設定ファイルの編集
まずはOpenDKIMに対して、「信頼するIPリスト」と「ドメインと鍵の紐付け情報」は別ファイルで指定するよ、という設定を追記します。
sudo nano /etc/opendkim.confファイルの最下部に移動し、以下の内容を追記して保存します。
# 信頼するネットワークとホストの指定
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
# ドメインと鍵のマッピング指定
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable# Specify trusted networks and hosts
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
# Specify domain-to-key mappings
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable② 信頼するIPリスト(TrustedHosts)の新規作成
続いて、OpenDKIMに信頼させる対象(自宅サーバーのグローバルIPや自ドメイン)を書き込むファイルを新規作成します。
sudo nano /etc/opendkim/TrustedHostsファイルを開いたら、以下の内容を記述します。
127.0.0.1
localhost
::1
# ★ここに自宅サーバーのグローバルIPアドレスを記述します
153.156.79.69
# ★念のため、使用しているメール用ドメインも指定しておきます
*.test-site.online127.0.0.1
localhost
::1
# ★ Add your home server's public IP address here
153.156.79.69
# ★ For additional security, also specify the mail domain you are using
*.test-site.online書き換えたらファイルを保存してエディタを閉じます(Ctrl+O ➔ Enter で保存、Ctrl+X で終了)。
③ 鍵テーブル(KeyTable)の新規作成
どのセレクタとどの秘密鍵のファイルを使うかを定義するテーブルを作成します。
sudo nano /etc/opendkim/KeyTableファイルを開いたら、スペースを挟まず以下の形式で1行で記述します。
202607._domainkey.test-site.online test-site-online:202607:/etc/opendkim/keys/test-site.online/202607.private④ 署名テーブル(SigningTable)の新規作成
どのメールアドレスから送信されたときに、どの鍵テーブルを呼び出すかを指定します。
sudo nano /etc/opendkim/SigningTableファイルを開いたら、以下の形式で記述します。
*@test-site.online 202607._domainkey.test-site.online⑤ 設定の反映
OpenDKIMに新しい設定ファイルを読み込ませるため、サービスを再起動します。
sudo systemctl restart opendkim⑥ 仕上げ:お名前.comから「古いBrevoのDNSレコード」を全抹消する
自宅サーバー側のリレー設定が完了したら、最後にお名前.comのDNSレコード設定画面を開き、過去にBrevo連携のために登録した古いレコードをすべて削除(大掃除)します。
これを残したままだと、DMARCが重複してエラーを起こしたり、不要な認証情報が公開され続けたりしてしまいます。お名前.comのリストから、以下のレコードを見つけてすべて削除してください。
| ホスト名 | Type | 削除する理由 |
|---|---|---|
| _dmarc (※Valueに brevo.com が含まれる古い方) | TXT | 新しく登録した v=DMARC1; p=none; と重複して構文エラーを引き起こすため、古い方は必ず抹消します。 |
| mail._domainkey や brevo2._domainkey など | TXT | Brevo専用の公開鍵(DKIM)です。もう不要になります。 |
| (その他、Valueに brevo-code 等が含まれる行) | TXT | 過去にBrevoのドメイン所有権認証に使った文字列です。こちらも不要です。 |
4-5.【前回の続きの方へ】Brevoリレーの解除(直出しへの切り替え)
前回の記事を参考に、メールの送信元を「Brevo(旧Sendinblue)」経由で構築している方は、ここでVPSから直接メールを送信する「直出しルート」へと切り替えます。
この解除を行わないと、どれだけOpenDKIMを設定してもメールがBrevoを経由してしまい、今回作った自前の署名(202607)ではなく、Brevoの署名(brevo2)が使われ続けてしまいます。
作業はVPS側のPostfix設定ファイル(main.cf)を2箇所修正するだけなので、一瞬で終わります。
1. main.cf の編集
① 自宅サーバーの main.cf を開く
自宅サーバーにログインし、Postfixの設定ファイルを開きます。
sudo nano /etc/postfix/main.cf② リレー先をBrevoから「VPS」に変更し、不要な設定を眠らせる
ファイル内から Brevo 関連の設定記述を探します(おそらくファイルの最下部付近にあります)。 リレー先をフロントVPSのIPアドレスへと書き換え、不要になった認証まわりの設定の先頭に # を付けてコメントアウト(無効化)します。
# ❌ 修正前(Brevo経由の設定が生きている状態)
# ❌ Before the change (Brevo relay configuration is still active)
# SMTP Relay Settings (Brevo)
relayhost = [smtp-relay.brevo.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_sasl_tls_security_options = noanonymous↓↓↓ 以下のように書き換えます ↓↓↓
# ⭕ 修正後(リレー先を自分のフロントVPSに変更!)
# SMTP Relay Settings (Brevo) ➔ 自前VPSルートへ変更のためコメントアウト
#relayhost = [smtp-relay.brevo.com]:587
#smtp_sasl_auth_enable = yes
#smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
#smtp_sasl_security_options = noanonymous
#smtp_tls_security_level = encrypt
#smtp_sasl_tls_security_options = noanonymous
# ★ここにフロントVPSへの転送設定を追記!
relayhost = [118.27.203.45]:587
# 修正後(最下部の2行がこの状態になればOKです)
sender_canonical_maps = regexp:/etc/postfix/sender_canonical_regexp
local_header_rewrite_clients = static:all# ⭕ After the change (Change the relay destination to your own front-end VPS!)
# Comment out the SMTP Relay Settings (Brevo) because the relay is being changed to your own VPS
#relayhost = [smtp-relay.brevo.com]:587
#smtp_sasl_auth_enable = yes
#smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
#smtp_sasl_security_options = noanonymous
#smtp_tls_security_level = encrypt
#smtp_sasl_tls_security_options = noanonymous
# ★ Add the forwarding configuration to the front-end VPS here!
relayhost = [118.27.203.45]:587
# After the change (The following two lines should appear at the bottom)
sender_canonical_maps = regexp:/etc/postfix/sender_canonical_regexp
local_header_rewrite_clients = static:all③ フロントVPSへログインするための認証ファイル(sasl_passwd)の作成
自宅サーバーがVPSの587番ポートを叩く際、正規のユーザーとしてログインを認めてもらうためのパスワードファイルを作成します。
sudo nano /etc/postfix/sasl_passwdファイル内に、スペースを一切挟まず半角コロン : で区切った形式で以下のように記述します(ユーザー名はドメインなしの mail 単体です)。
[118.27.203.45]:587 mail:[フロントVPSのmailユーザーのパスワード]
[118.27.203.45]:587 mail:[Password for the mail user on the front-end VPS]保存して閉じたら(Ctrl+O ➔ Enter で保存、Ctrl+X で終了)、セキュリティ権限を設定し、Postfix用のデータベースファイルに変換します。
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo postmap /etc/postfix/sasl_passwd④ main.cf へのSASL認証・Cyrusフィルターの追記
再び自宅サーバーの /etc/postfix/main.cf を開き、最下部に以下の設定を追加します。
(Cyrus SASLが自動でドメイン名を削って認証を壊すのを防ぐための必須フィルターオプションです)
# SASL認証の有効化とマップ指定
# Enable SASL authentication and specify the authentication map
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
# Cyrus SASLのドメイン削除挙動を防止するフィルター
# Filter to prevent Cyrus SASL from stripping the domain
smtp_sasl_auth_soft_bounce = no
smtp_sasl_mechanism_filter = plain, login⑤ 設定の完全反映(3点セット)
古いキャッシュをクリアし、設定を確実に強制認識させるため、以下のコマンドを順に実行してからPostfixを再起動します。
# 1. パスワード設定ファイルを確実にデータベース化する
# 1. Ensure that the password file is properly converted into a database
sudo postmap /etc/postfix/sasl_passwd
# 2. システム側のサービス設定をリロードする
# 2. Reload the system service configuration
sudo systemctl daemon-reload
# 3. Postfixを再起動してすべての設定を有効化する
# 3. Restart Postfix to apply all configuration changes
sudo systemctl restart postfix4-6.VPS側のファイアウォール(UFW)で587番ポートを解放する
ConoHaのコントロールパネル側でポートを開放したら、仕上げにVPS(Ubuntu/Debianなど)の内部で動いているファイアウォール UFW にも、自宅サーバーからの587番ポートの通信を許可するルールを追加します。 VPSにSSHログインした状態で、以下のコマンドを実行してください。
① 587番ポート(Submission)の通信を許可する
sudo ufw allow 587/tcp② 設定を反映(リロード)する
sudo ufw reload③ 解放状態の確認
正しくルールが追加されたか、UFWのステータスを確認します。
sudo ufw status verbose【出力結果のイメージ】
To Action From
-- ------ ----
587/tcp ALLOW IN Anywhereリストの中に 587/tcp が ALLOW IN(どこからでも接続許可)として追加されていれば設定完了です! これでConoHa側のセキュリティグループ、そしてVPS内部のUFWという2つの関所が完全に開き、自宅サーバーから送信されたメールが587番ポートを通って、VPSのPostfixへ障害物なしで100%届く状態になりました。
5.仕上げ!VPS側のPostfixとOpenDKIMの連動設定
これまでに「DNSへの公開鍵登録」「自宅サーバーのリレー先変更」「UFWの解放」まで全ての外堀を埋めました。
最後のステップは、フロントVPSのメールエンジン(Postfix)に対して、「自宅から587番ポートで届いたメールを受け付け、送出する直前にOpenDKIMにバトンタッチして電子署名(ハンコ)をガチャンと押させる」という総仕上げの設定を行います。
5-1. Postfixのメイン設定(main.cf)の編集
まずはVPSにSSHログインし、Postfixの全体共通設定ファイルを開きます。
sudo nano /etc/postfix/main.cfファイルの最下部に移動し、OpenDKIMと通信(連動)するための以下の設定(Milter設定)を追記してください。
# -----------------------------------------------------------------
# OpenDKIM (Milter) 連動設定
# -----------------------------------------------------------------
# メールの送受信時に適用するフィルター(Milter)の有効化
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
# フィルター接続時のデフォルトのアクション(エラー時は一時保留せず送信)
milter_default_action = accept# -----------------------------------------------------------------
# OpenDKIM (Milter) Integration Settings
# -----------------------------------------------------------------
# Enable the Milter filter for incoming and outgoing mail
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
# Default action when connecting to the Milter
# (Accept and send the message even if the Milter encounters an error)
milter_default_action = accept💡 設定項目の技術的な意味:
smtpd_milters:外部からSMTPでメールを受け取ったとき(今回の場合は自宅サーバーからリレーされてきたとき)に適用するフィルターです。4-2章でOpenDKIM側に設定したポート8891を指定しています。non_smtpd_milters:サーバー内部で生成されたシステムメールなどが送信される際にも、漏れなく署名を行うための設定です。milter_default_action = accept:万が一OpenDKIMのサービスが落ちていた場合でも、メールの送信自体を完全にストップさせず、そのまま(署名なしで)通すための安全弁です。
書き換えたらファイルを保存してエディタを閉じます(Nanoの場合は Ctrl+O ➔ Enter で保存、Ctrl+X で終了)。
5-2. 【フロントVPS側】587番ポート(submission)の有効化と連動設定
自宅サーバーから587番ポート経由で届いたメールをVPS側で待ち受け、OpenDKIMの署名フィルターを強制適用するために、フロントVPS側の master.cf を書き換えます。
① master.cf を開く
sudo nano /etc/postfix/master.cf② 似ている2つのブロックから「s」がない方を探す
ファイルの中ほどをスクロールすると、非常に酷似した2つのブロックが上下に並んでいます。今回修正するのは、上の段の末尾に「s」がつかない submission エリアです。
【見分けるポイント】
⭕ 上の段(こっちを直す!): #submission inet n ...(末尾に s がない)
❌ 下の段(今回は触らない): #submissions inet n ...(末尾に s がある)
【How to tell them apart】
⭕ Top section (Modify this one!): #submission inet n ... (no "s" at the end)
❌ Bottom section (Do not modify this time): #submissions inet n ... (with an "s" at the end)③ 上の段のコメントアウト(#)を解除して追記する
「s」がない方のブロックを見つけたら、該当する行の先頭にある # を取り除いて有効化し、さらに最下部にOpenDKIMを適用するオプションを追記します。
# ❌ 修正前:すべて「#」で眠っている状態
# ❌ Before the change: Everything is commented out with "#"
#submission inet n - y - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_tls_auth_only=yes
# -o local_header_rewrite_clients=static:all
# -o smtpd_reject_unlisted_recipient=no
# Instead of specifying complex smtpd_<xxx>_restrictions here,
# specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"
# here, and specify mua_<xxx>_restrictions in main.cf (where
# "<xxx>" is "client", "helo", "sender", "relay", or "recipient").
# -o smtpd_client_restrictions=
# -o smtpd_helo_restrictions=
# -o smtpd_sender_restrictions=
# -o smtpd_relay_restrictions=
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING↓↓↓ 先頭の # を全て削り、末尾に1行足して以下のように書き換えます ↓↓↓
# ⭕ 修正後:587番ポートを完全に起こし、最後にOpenDKIMの連動を組み込む
# ⭕ After the change: Fully enable port 587 and integrate OpenDKIM at the end
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o local_header_rewrite_clients=static:all
-o smtpd_reject_unlisted_recipient=no
Instead of specifying complex smtpd_<xxx>_restrictions here,
specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"
here, and specify mua_<xxx>_restrictions in main.cf (where
"<xxx>" is "client", "helo", "sender", "relay", or "recipient").
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_relay_restrictions=
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
# ★ここに追記:main.cfで定義したOpenDKIMフィルターを587番にも強制適用する
# ★ Add here: Force the OpenDKIM filter defined in main.cf to be applied to port 587 as well
-o smtpd_milters=inet:127.0.0.1:8891⚠️ 超重要:コピー時の注意点submission inet n ... 以外の、下部に続く -o で始まる行(および英語のコメント行)は、必ず先頭に「半角スペース」を維持した状態にしてください。行頭のスペースを消してしまうと、Postfixが設定ファイルを正しく読み込めずエラーになります。
書き換えたらファイルを保存してエディタを閉じます(Ctrl+O ➔ Enter で保存、Ctrl+X で終了)。
5-3. サービスの再起動と最終チェック
1. VPS側でPostfixを再起動する
VPSのターミナルで以下のコマンドを実行し、これまでに変更したすべての設定をシステムに完全に反映させます。
sudo systemctl restart postfix⚠️ 注意
もしここでエラーが出て再起動に失敗した場合は、先ほどの master.cf の書き換えで「行頭の半角スペース」が漏れている可能性が高いです。その場合は sudo journalctl -xeu postfix でエラー内容を確認し、設定を見直してみてください。無事にコマンドが通れば次へ進みます。
2. Thunderbirdから運命のテストメールを送信
VPS側のPostfixが無事に再起動できたら、いよいよすべての仕掛けが動く「答え合わせ」の瞬間です。
いつも自宅サーバー経由での送信に使用しているメールソフト(Thunderbirdなど)を開き、ご自身のGmailアドレス宛てにテストメールを1通送信してみましょう。
送信ボタンを押した瞬間、メールは以下のルートを駆け抜けます。
- thunderbird
- 自宅サーバー
- フロントVPS
587番ポートで受け取り、OpenDKIMで電子署名を適用
- Gmail射出
3. Gmail側で「PASS」を確認する
メールが届いたら、Gmailを開いて以下の手順で確認します。
- 届いたテストメールを開く。
- 右上の「その他(縦の3本の点)」メニューをクリック。
- 「メッセージのソースを表示」をクリック。
画面上部の表に、以下のように表示されていれば大成功です!
SPF: PASS(IP: 118.27.203.45)。詳細
DKIM: 'PASS'(ドメイン: test-site.online)詳細
DMARC: 'PASS' 詳細
SPF: PASS (IP: 118.27.203.45)
DKIM: PASS (Domain: test-site.online)
DMARC: PASSSPF: PASS(VPSのIPアドレスが許可されている証明)DKIM: PASS(OpenDKIMによって正しく電子署名がされた証明)DMARC: PASS(SPF/DKIMがドメインと一致している証明)
🎉 おめでとうございます!✧*。٩(ˊωˋ*)و✧*。
このように全てが’PASS’と表示されれば完全勝利です!
自宅サーバーからフロントVPSの587番ポートへ安全にリレーし、そこから世界へメールを送り出す強固なルートがこれで完成しました。 現代の厳しいメールセキュリティを突破するための「SPF・DKIM・DMARC」がすべて自動で適用される、最強のプライベートメール送信環境の構築完了です!
6.まとめ:自前の「2階建てリレー」がもたらす極上の安心感
長旅、本当にお疲れ様でした! もともと外部の配信スタンド(Brevo)経由で構築していた送信メールシステムですが、そこから一歩踏み出し、フロントVPSを自前の信託中継局にする「完全自前の2階建てリレー」へと見事にシフトチェンジを果たしました。
これにより、現代のメールセキュリティの最高峰である「SPF」「DKIM」「DMARC」の三種の神器を、誰の手も借りずに自社・自前ドメインのインフラだけで完璧に揃えることに成功したわけです。
最後に、今回構築した環境がもたらすメリットと、今後の運用に向けた大切なポイントを振り返ってこの記事を締めくくります。
今回の構築で得られたもの
- 強力な到達率と信頼性:
GmailやiCloudなど、セキュリティの厳しい巨大メールサービスに対しても「なりすましではない、正規のサーバーから送られた本物のメール」として堂々と受け入れられるようになりました。 - 配信スタンドからの完全な独立:
外部の配信スタンド(Brevo等)の無料枠や仕様変更、規約に怯えることなく、自分自身の管理下にあるVPSとドメインで、何通でも自由にメールをコントロールできる完全な自由を手に入れました。 - インフラエンジニアとしての深い知見:
Postfixの高度なリレー設定、OpenDKIMによる電子署名の仕組み、そしてDNSレコードの緻密な成形とトラブルシューティングまで、現代のメールインフラに必要な技術を網羅して習得できました。
🚀 運用スタートに向けた次の一手
環境は完璧に整いましたが、自前メールサーバーの運用は「構築して終わり」ではありません。これからさらに快適かつ安全に運用するためのヒントです。
- 最初は「迷惑メールではない報告」で育てる(レピュテーションの育成)
どれだけ認証(SPF/DKIM/DMARC)が完璧であっても、新しく生まれたばかりの自前メールサーバーのIPアドレスは、GoogleなどのAIから見ると「まだ実績のない謎の新人」です。最初はメールが迷惑メールフォルダに入る可能性がありますが、焦らず「迷惑メールではないことを報告」を押して受信トレイに引っ張り上げてください。数回繰り返して「通信実績(レピュテーション)」を育てることで、AIが完全に味方になり、常時受信トレイに直行するようになります。 - セキュリティの強化(Fail2banの導入など)
メールサーバー(587番ポートや25番ポート)を世界に公開すると、ログで目撃した通り、数分もしないうちに海外のBotから辞書攻撃(総当たりログイン試行)が飛んでくるようになります。PostfixとOpenDKIMが堅牢に守ってくれていますが、サーバーの負荷軽減と安全のため、次はFail2banなどを導入して「認証に数回失敗したIPアドレスを自動で数日間ファイヤーウォールで完全遮断する」といったセキュリティ強化アプローチに進むのがおすすめです。 - ポリシーのステップアップ(none から quarantine/reject へ)
現在はDMARCのポリシーを最も安全なp=none(監視モード)に設定しています。数週間運用してみて、自作サーバーからのメールが世界中に安定して届いていることを確認できたら、お名前.comのDMARCレコードをp=quarantine(怪しいメールは迷惑メールへ)、最終的にはp=reject(なりすましは完全受信拒否)へと引き上げてみてください。これであなたのドメインは、世界最強の防御力を手に入れることになります。
終わりに
自宅サーバーでのメール運用は、近年のセキュリティ激化に伴い「個人ではもう不可能」と言われることも増えました。しかし、こうしてフロントに安価なVPSを1台立てて丁寧に技術を積み上げていけば、現代でも完全に通用する最高品質のメールシステムを自らの手で組み上げることができます。
ターミナルに刻まれた status=sent の文字と、Gmailのソースに輝く SPF: PASS / DKIM: PASS / DMARC: PASS の三冠王の輝きは、あなたがインフラの壁を実力で突破した何よりの証拠です。
この頼もしい自前インフラと共に、快適なサーバーライフをお楽しみください!
最後まで読んでいただきありがとうございました!



コメント