Help us understand the problem. What is going on with this article?

Postfix Cloudflare 利用時におけるサブドメインのDKIM SPFの設定方法

More than 5 years have passed since last update.

今まできちんと向き合って来なかったメール設定について、今更ながらきちんと設定してみます。迷惑メールに入るのはまっぴらです。
エラー文言で検索しても出てくるのが英語サイトばかりだったということも有りこちらを書いています。エラー文言経由でたどり着いた人は下の方に進んでください。

基本的な流れはこちらを踏襲

https://blog.apar.jp/linux/856/

DKIM署名用の秘密鍵と公開鍵の作成

opendkim-genkey -D /etc/opendkim/keys/apar.jp -d apar.jp -s 20141105

ここの形式はこんな感じです。

opendkim-genkey -D 保存フォルダ -d ドメイン -s セレクタ名

セレクタ名は何でも良いので日付でももちろんOKだが、複数ドメインのキーを作る場合で
/etc/opendkim/keys/
以下に全てのキーを作ってしまう場合に日付だけだとファイル名が被ってしまうので注意。
(もちろんフォルダを掘れば良いのだが、設定ファイル書く時面倒な気がする)
上記の理由から下記のコマンドでファイルを作る。
(以下、a.lne.stというサブドメインで設定する場合を例にする)

opendkim-genkey -D /etc/opendkim/keys/ -d a.lne.st -s 20151117a

結果として /etc/opendkim/keys/以下に
- 20151117a.private
- 20151117a.txt

の2つのファイルが出来上がる。

ファイルができたら鍵ファイルの所有者をopendkimにしないとメール送信時にエラーが出るので注意。

chown opendkim:opendkim /etc/opendkim/keys/20151117a.*

CloudFlareへのレコードの登録

サブドメインの場合にハマったのはName属性の書き方でした。サブドメイン入れてなかった。

登録方法
- TYPEをTXT
- Nameを20151117a._domainkey.a
- Valueを p=ここに20151117a.txtの中にあるp=の部分を書く

これでOK。
もう一つレコードが必要

  • TYPEをTXT
  • Nameをa
  • Valueをv=spf1 ptr:lne.st ip4:xxx.xxx.xxx.xxx(サーバのIP) ~all として保存する。

KeyTableの書き方

/etc/opendkim/KeyTable
にこの一行を追加する。

20151117a._domainkey.lne.st a.lne.st:20151117a:/etc/opendkim/keys/20151117a.private

SigningTableの書き方

/etc/opendkim/SigningTable

*@a.lne.st 20151117a._domainkey.lne.st

hostsでハマる

サーバのhosts設定が適当だった為、メールのソースを見るとこんなエラーが出ていた。

Received-SPF: neutral (google.com: xxx.xxx.xxx.xxx is neither permitted nor denied by best guess record for domain of nginx@localhost.localdomain) client-ip=xxx.xxx.xxx.xxx;

localhost.localdomainってなっている。そりゃ、このドメインからじゃ認証されませんよね…

/etc/hosts

127.0.0.1 localhost localhost.lne.st localhost4 localhost4.localdomain4
xxx.xxx.xxx.xxx(サーバのIP) a.lne.st

  • localhost4の記載は必要なのでしょうか…どなたか教えて下さい…

書き換えてからリロード

service network reload

再度送信してみてメールソースを見てみるとこうなっているはず

Received-SPF: pass (google.com: domain of nginx@lne.st designates xxx.xxx.xxx.xxx as permitted sender) client-ip=xxx.xxx.xxx.xxx;

dkim=temperror (no key for signature) header.i=@a.lne.st

こんなの出る場合。
DNSの設定がダメなパターンです。Cloudflareでやっていたのですが先ほど設定したNameを

20151117a._domainkey
と、サブドメイン抜きで設定してしまっていました。こうすると、a.lne.stというサブドメインに設定されたDKIMの設定を読み出すことが出来ません。
きちんとName設定をしましょう。設定を終えてメールを送信し、メールのソースを見るとdkimがパスしているのが見て取れると思います。

dkim=pass header.i=@a.lne.st

以上の設定でメールの設定は完璧だと思います。

http://www.mail-tester.com/

こちらにサーバからメールを送信してみると、何が悪いのか教えてくれるのでオススメです。
が…DNS(僕の場合で言うとCloudflare)の設定については、おかしいよとは言ってくれますが、何がおかしいのかについては自分で調べないといけないので注意ですね。

無事に迷惑メールに入らなくなりました!

備考

Nginx リバースプロキシで設置したWordpressのフォームからメールを送信した時の挙動です。

geeorgey
https://twitter.com/geeorgey
https://geeorgey.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away