SPFレコードの記述とルールについてまとめてみました

1/30/2021

Exchange Online Microsoft 365

 前回、[Office365をオンプレミスメールサーバーなどと併用する場合、SPFレコードはしっかり管理しましょうというお話と、よく使うリンク集]という記事を書きました。あらためてSPFレコードを書く際の記述やルールについて、まとめてみました。


基本的な記述について

一般的に、以下のような記述になります。基本的に、1行で書きましょう。

text = "v=spf1 +ip4:192.168.100.100/32 include:spf.protection.outlook.com ~all"


上記を例に、分解するとこんな感じです。

区切り 区切る場合は、必ず半角スペースで区切ります
v=spf1 SPFレコードの記述バージョン。2もあるけど、基本は1を使えばOKです
+ip4:192.168.100.100/32 ipv4で指定する場合に使います。ipv6を使う場合は、+ip6:
include:spf.protection.outlook.com 他のSPFレコードを参照する場合に使います
~all 前述以外のすべてのIPからのメールは、不正な送信元から送信されたとみなしてもいいけど、とりあえずは届けてね、の目印

+ip4:

オンプレミスのメールサーバーを使っているなどで決まったIPアドレスから送信する場合に使います。[このIPからの場合は、信じてもらってOK]という意味です。

・サブネットマスクでの指定も可能です。
・もし複数のIPを記入したい場合は、+ip4:192.168.100.100 +ip4:192.168.100.101などと「+ip4から必要なIP」を記述します。もちろん、間には半角スペースを入れましょう。

include:

Office365など外部のメールサービスを使っている場合などで、[参照先のレコードを参照してください]というときに使います。

・参照先のSPFレコードを参照させます。
・SPFレコード以外のaレコードやMXレコードを指定することも可能です。その場合は少し記述が異なります。
・もし複数includeしたい場合は、include:spf.protection.outlook.com include:amazonses.com などと記述します。

~all

[これまでのレコード以外からのメールの場合は、信用しないでください。でも、とりあえずメールサーバーには届けてもらってOK]という記述です。届けられたメールサーバー側で、メールボックスに届くケースもあれば、迷惑メール判定されて迷惑メールボックスに入るケースもあります。


それだと困るな、信用しないでください、というときは

-all

を使います。[これまでのレコード以外からのメールの場合は、信用しないでください]という強い意味になります。基本的には、-allが優先ですが、それだと困るときは~allを使います。

+、~、-などの記号(qualifier)

ipv4だったり、allだったりの前についている記号は、qualifierというそうです。

+ 信じてね!
- 信じないでね!
~ 信じないでね!でも、通してはあげてほしい

+ip4:だったら 信じてね!このIPからのメールを。
-all だったら、信じないでね!これまでのレコード以外からのメールの場合は。
という感じです。


1レコードに入れられる文字数


無制限に記入できるわけではなく、最大255文字まで、です。なるべく255文字に収まるSPFレコードに収まる範囲に、送信元となるIPアドレスは統制しましょう。
とはいえ、1レコードに収まらない場合もあります。その場合に利用するのが先ほどのincludeです。

includeで入れ子にできる回数

includeで入れ子にできます。例えば、peridot-green.comのSPFレコードに含むinclude:spf.protection.outlook.comですが、これは以下のようになっています。

text = "v=spf1 ip4:40.92.0.0/15 ip4:40.107.0.0/16 ip4:52.100.0.0/14 ip4:104.47.0.0/17 ip6:2a01:111:f400::/48 ip6:2a01:111:f403::/48 include:spfd.protection.outlook.com -all"


さらに、上記のspfd.protection.outlook.comですが、以下のようになっています。

 text = "v=spf1 ip4:51.4.72.0/24 ip4:51.5.72.0/24 ip4:51.5.80.0/27 ip4:51.4.80.0/27 ip6:2a01:4180:4051:0800::/64 ip6:2a01:4180:4050:0800::/64 ip6:2a01:4180:4051:0400::/64 ip6:2a01:4180:4050:0400::/64 -all"

2回入れ子になっていますね。
入れ子できる回数にも制限があり、最大10回までです。

同じドメイン内ではSPFレコードは必ず1行にする

spfレコードは1行のみ、です。どうしても複数行にしなければならない場合は、別の複数レコード設定できません。どうしても複数行になる場合はサブドメインを作成し、includeさせましょう。

正しい例:サブドメインなどを作成し、includeしている
ドメイン名

include:spf.protection.outlook.com include:_spf1.peridot-green.com -all
_spf1 include:amazonses.com -all

誤った例:サブドメインを指定せず、同じドメインのレコードが複数ある
ドメイン名
include:spf.protection.outlook.com -all

include:amazonses.com -all
1行目で判定され、2行目は無視されます。


まとめ

メール送信元がOffice365だけならあまり悩まないのですが、別のメールサービス使ってたりするとレコード数が1行で収まらなくなることも・・・。そういったときにはルールのあった記述になっているか確認の上登録しましょう。