LoginSignup
21
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-08

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

送信メールが送り先のメールサーバになりすましメールと判定されずに正しいメールとして判断してもらうためには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」ぐらいに短くしても問題は起きにくいとのこと。

21
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
14