SPF レコードをどのように書けばよいか、悩んでいる方にここで幾つか例を見せて説明しておきます。よくある間違えについても紹介しますので、そちらの方ははまねしないでくださいね。
メールサーバーの IPアドレスを直接リストする方法です。簡単かつわかりやすく記述でき、DNS の通信回数を増やさないため理想的ですが、サーバー数が多い場合はうまくいかない場合があります。
example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 -all"
IPアドレスの代わりにメールサーバーのホスト名をリストします。IPアドレスにくらべて管理しやすいといえますが、DNS に対する負荷は IPアドレスより多い場合があります。ホスト名は必ず FQDN で書いてください。
example.org. IN TXT "v=spf1 a:mx01.example.org a:mx02.exmaple.org a:ns.example.org -all"
メールを送出する可能性のあるホストが存在するネットワークを CIDR 方式で指定する。
example.org. IN TXT "v=spf1 ip4:192.0.2.0/28 -all"
広範囲のネットワーク指定すると、SPF レコード自体の意味がなくなる場合がありますので、最小限のネットワーク範囲を指定するようにしましょう。
例1 と例3 の組み合わせです。
example.org. IN TXT "v=spf1 ip4:192.0.2.101 ip4:192.0.2.102 ip4:192.0.2.103 ip4:192.0.2.0/28 -all"
MX レコードに登録したメールサーバーからしかメールを外部に送出しない場合には、mx を利用する。メンテナンスが楽であるという点で、記述ミスの発生を防ぐことができますが、ただし、受信側での認証処理においてやや DNS への負荷が大きくなる可能性があります。
example.org. IN TXT "v=spf1 mx -all"
単に Web サーバのためだけに利用しているドメインや、まったく利用していないドメインなど、メールを送受信しないドメインはそのことをはっきり宣言できます。
example.org. IN TXT "v=spf1 -all"
もうすこし、複雑な例を説明します。
外部のメール送信業者を利用して、広告メールやユーザへの告知メールなどを送信している場合、自分たちが普段使っているメールサーバーとは異なるメールサーバーを使ってメールが送られます。そのような場合、よく include 文を使います。
例えば次のように、
example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 include:advertise.example.com -all"
ここでは、メール送信業者の SPF レコードが advertise.example.com に公開されているとして、その SPF レコード を include しています。
一つの企業でも複数のドメインを利用している場合がある。複数のドメインのメールを1つのメールシステムを共有するケースでは、redirect を利用して共有化を図ることでメンテナンスを簡単にできる場合があります。
example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 -all"
example.net. IN TXT "v=spf1 redirect=example.org"
example.com. IN TXT "v=spf1 redirect=example.org"
include や redirect を利用する場合は、参照先が必ず存在するように気をつけましょう。また、相互参照によって参照のループを発生さないように、参照先のレコードでは include や redirect を使わないように気をつけましょう。
通信業者や大きな会社ではメールサーバの台数が多く、SPF のレコードサイズが大きくなる傾向があります。SPF では、1つの SPF レコードで複数の文字列を含むことが可能であり、1つの文字列の最大長は255バイトであると決まっています。1つの SPF レコードが複数の文字列で構成されている場合、受信側ではその文字列はすべてつなぎ合わせて1つの文字列として認証処理します。ただし、複数の文字列を1つの文字列に連結するとき、そのつなぎ目に空白文字は挿入されないので注意してください。
example.org. IN TXT "v=spf1 include:_spf-a.example.com include:_spf-b.example.com include:_spf-c.example.com -all"
_spf-a.example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 ip4:192.0.2.4 -all"
_spf-b.example.org. IN TXT "v=spf1 ip4:192.0.2.11 ip4:192.0.2.12 ip4:192.0.2.13 ip4:192.0.2.14 -all"
_spf-c.example.org. IN TXT "v=spf1 ip4:192.0.2.21 ip4:192.0.2.22 ip4:192.0.2.24 ip4:192.0.2.24 -all"
文法的に間違った SPF レコードを公開すると受信側では PermError と扱われ、せっかく公開しても正しく扱われません。以下に、間違いやすい例を説明します。
【誤】example.org. IN TXT "v=spf1.0 include:example.net -all"
“v=spf1.0”ではなく“v=spf1”ですね。
【正】example.org. IN TXT "v=spf1 include:example.net -all"
【誤】example.org. IN TXT "v=spf1 mx nm nm1 ~all"
上記の例では、機構が省略されているうえにドメイン名が FQDN ではないため、エラーになります。“+a:ホスト名(FQDN)”ときちんと記述しましょう。
【正】example.org. IN TXT "v=spf1 +mx +a:nm.example.org +a:nm1.example.org ~all"
【誤】example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ~all"
example.org. IN TXT "v=spf1 a:mx01.example.org ~all"
example.org. IN TXT "v=spf1 a:web.example.org ~all"
1つのドメインに対しては1つの spf1 レコードだけが公開可能である。複数公開すると、エラーとなる。
【正】example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 a:mx01.example.com a:web.example.org ~all"
または、以下のように記述する。
【正】example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 a:mx01.example.com a:web.example.org ~all"
example.org. IN TXT "spf2.0 ip4:192.0.2.1 ip4:192.0.2.2 a:mx01.example.com a:web.example.org ~all"
【誤】example.org. IN TXT "v=spf1 ipv4:192.0.2.1 mx ~all"
“ipv4:”は間違いです。
【誤】example.org. IN TXT "v=spf1 ip:192.0.2.1 mx ~all"
“ip:”は間違いです。
【誤】example.org. IN TXT "v=spf1 ip192.0.2.1 mx ~all"
“:”が抜けてますね。
【誤】example.org. IN TXT "v=spf1 ip4=192.0.2.1 mx ~all"
“:”の代わりに“=”を使っています。
【誤】example.org. IN TXT "v=v=spf1 ip4:192.0.2.1 mx ~all"
“v=v=”とバージョン記述を間違えている。
【誤】example.org. IN TXT "v=spf1 ip4"
書きかけで終わってます。徹夜作業で力尽き果てたのでしょうか?
【誤】example.org. IN TXT "v=spf1 ip4:192.0.2.1 mx \150all"
“~”が文字化けしている
“ip4:”を“ipv4:”や“ip:”などと間違えるケースは非常に多く見られます。また、最後の例のように、レコードを作成するために使ったツールなどが“~”文字を間違って変換してしまう場合などもあるので、注意してください。
【正】example.org. IN TXT "v=spf1 ip4:192.0.2.1 mx ~all"
【誤】example.org. IN TXT "v=spf1 ip4:192.0.2.64/26" "ip4:192.0.2.101 ~all"
上記のように二重引用符で複数に分けて記述することは可能ですが、その場合“ip4:192.0.2.0/26”と“ip4:192.0.2.101 ~all”は“v=spf1 ip4:192.0.2.64/26ip4:192.0.2.101 ~all”という大きな1つのレコードとして扱われます。” ” でくくられた2つの部分を接続するとき空白文字は補われないため、区切り文字として空白文字が入らない。
【正】example.org. IN TXT "v=spf1 ip4:192.0.2.64/26 ip4:192.0.2.101 ~all"
【誤】example.org. IN TXT "v=spf1 include:_spf.example.org ~all"
* Can’t find _spf.exmaple.org: Non-exisitent domain
include している _spf.example.org のレコードが存在していないためにエラーとなる例です。 SPF レコードを公開した当初は参照先があったのですが、その後の DNS レコードの整理などでの参照先が変わってしまったことを反映していないことなどが原因としてあります。
【誤】example.org. IN TXT "v=spf1 include:_spf.example.org ~all"
_spf.example.org. IN TXT "v=spf1 include:example.org ~all"
example.org と _spf.example.org がお互いに相手を参照し合っているためにエラーとなる。