Edited at

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

More than 3 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のフォームからメールを送信した時の挙動です。