SPFレコードの文字数制限とサービス別のSPFの設定の比較


上記サイトからの抜粋だけど、毎回忘れるのでメモまでに。

送信メールが送り先のメールサーバになりすましメールと判定されずに正しいメールとして判断してもらうためにはSPFレコードをDNSサーバに設定する必要がある。

サーバ台数が増えてくると、SPFレコードが長くなってしまうが、1つの文字列の最長は255文字制限がある。
文字列の連結によりこの制限を超えることができる。ただし連結部分に空白を入れること


【誤】 /24と"の間、もしくは”と+ip4の間に空白を入れること 
example.jp.   IN TXT "v=spf1 +ip4:192.168.100.0/24" "+ip4:10.0.0.0/24 ~all"

【正】 
example.jp.   IN TXT "v=spf1 +ip4:192.168.100.0/24 " "+ip4:10.0.0.0/24 ~all"
【正】 
example.jp.   IN TXT "v=spf1 +ip4:192.168.100.0/24" " +ip4:10.0.0.0/24 ~all"


【正】 
example.jp.   IN TXT ( "v=spf1"
                          " +ip4:192.168.100.0/24"
                          " +ip4:10.0.0.0/24"
                          " ~all" )

連結したレコードの長さは450文字以上になるようであれば、includeを使って分割


【正】 
example.jp.   IN TXT "v=spf1 include:_a.example.jp include:_b.example.jp ~all"
_a.example.jp IN TXT "v=spf1 +ip4:192.168.100.0/24 ~all"
_b.example.jp IN TXT "v=spf1 +ip4:10.0.0.0/24 ~all"

他のサービスの状況

実際に他のサービスではどのように設定しているか調べて見た。
調べるのにはMXToolBoxのサイトを使った。
digコマンドを使っても良い。

前提知識としてSPFの主な設定パターンは次の通り。
詳細についてはIAJapan 10. SPFレコードの記述例SendGrid 送信ドメインを認証するためのSPFレコードに詳しくなろうを参考

# ホストのIPアドレスで記述
example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 -all"
# ホスト名で記述
example.org. IN TXT "v=spf1 a:mx01.example.org a:mx02.exmaple.org a:ns.example.org -all"
# ネットワークでの指定
example.org. IN TXT "v=spf1 ip4:192.0.2.0/28 -all"
# サブドメインに個別のSPFレコードを定義する
example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 -all"
announce.example.org. IN TXT "v=spf1 ip4:192.0.2.10 ip4:192.0.2.11 -all"
campaign.example.org. IN TXT "v=spf1 include:advertise.example.com -all"

Googleの場合

# gmail.com
v=spf1 redirect=_spf.google.com

# google.com
v=spf1 include:_spf.google.com ~all

# _spf.google.com
v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all

# _netblocks.google.com
v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all

gmailの場合、_spf.google.comにredirectされる。
Gsuiteなどを他のサービス経由でgoogleのメールサービスを使う場合は_spf.google.comをincludeなどで指定しているようだ。
最初にincludeではなく、redirectしているのは多分、単に同じサービスの別エイリアスだからだとか、includeに使用回数制限があるからだからとかなのか。
includeを辿っていくとip4指定までたどり着く。あまりaレコード指定を使っているspfの例がないのは名前解決のコストを減らすため?

Slackの場合

# slack.com
v=spf1 include:amazonses.com include:mailgun.org include:u931175.wl176.sendgrid.net include:_spf.qualtrics.com -all

Slackの場合はip4の指定がなく、全て外部サービスのincludeのみ、自社のsmtpサーバはなくて、amazonsesやmailgun、sendgridを使って配信しているみたいだ。ちなみにqualtricsはアンケートサービス

Yahoo(米国)の場合

# yahoo.com
v=spf1 redirect=_spf.mail.yahoo.com
# _spf.mail.yahoo.com
v=spf1 ptr:yahoo.com ptr:yahoo.net ?all

Yahooの場合は、ちょっとあまり見かけない書き方をしている。
ptrは送信元ホストの逆引きと正引きが一致していたら認証OKとするやり方。負荷がかかるので一般的には推奨されていない。
「?all」は「Neutral」となっている。softfailはfailとneutralの間とのことなので送信元ホスト以外から送られてきたメールのなりすまし判断は行わない。

salesforce.comの場合

# salesforce.com
v=spf1 include:_spf.google.com include:_spf.salesforce.com  include:spf.mandrillapp.com exists:%{i}._spf.corp.salesforce.com ~all

# _spf.salesforce.com
v=spf1 exists:%{i}._spf.mta.salesforce.com -all

Salesforce.comの場合も珍しく、existsが指定されている。
existsは

引数であるドメイン名に指定された表記でAレコードルックアップを実施し、該当のAレコードが存在すればマッチする。SPFのマクロ機能とあわせての利用を想定している

ということなので、***._spf.mta.salesforce.comというサブドメインがあるのか。

大体のサービスがSlack方式で外部サービスのspfレコードがincludeされている場合が多かった。
自前でsmtpサーバを立てるのではなく、amazonsesやsendgrid、mailgunなどのサービスを利用するパターンが増えてきているようだ。

参考

あと、「アプリケーションエンジニアが知るべきDNSの基本」のスライドも為になる。

example.jp.   IN TXT "v=spf1 +ip4:192.168.100.0/24 +ip4:10.0.0.0/24 ~all"

の「~all」は非推奨で、「-all」が良いとのこと。
TTL値は最近のDNSサーバのスペックは優れているので、通常「300」で、切り替え時「60」ぐらいに短くしても問題は起きにくいとのこと。