SPFレコードの高度な書き方10選

![email-3582970_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14841/303b343a-f87b-47e8-a328-90a7e67dfb0a.jpeg)


みなさん、SPF(SenderPolicyFramework)レコード設定してますか？

SPFレコードとは、メール送信者の正当性を確認するために使用されるDNS設定です。
昨今のメールを取り巻く状況はより厳しさを増しており、設定していないことにより、本来届くはずのメールが正しく受信出来ないという問題が目立つようになりました。

:::note info
詳しくは[こちら](https://blastmail.jp/blog/spam/spf-record)がとてもわかりやすいです。
:::

SaaSのメール配信サービスやメール周りの管理者の方なら、一度は耳にしたことや、設定したことはあるのではないでしょうか？
設定をする場合、自身の送信元ドメインのみをシンプルに登録するようなことが多いと思いますが、実は様々な記法があります。

今回は、普通に使っていると使わないだろうなと思われる記法を高度ということにして、10選形式でまとめてみました。

## 1. メカニズムと修飾子の組み合わせ

```
v=spf1 ip4:192.0.2.0/24 include:example.com ?all
```

このレコードは `192.0.2.0/24` のIP範囲と `example.com` のSPFレコードを組み合わせ、`?all` でニュートラルな結果を示します。
`example.com`からのメールは許可され、他のドメインは各自のSPFレコードに基づいて処理されます。


## 2. CIDR表記を用いたIP範囲指定

```
v=spf1 ip6:2001:0db8::/32 -all
```

このレコードは `2001:0db8::/32` のIPv6アドレス範囲からのメール送信を許可し、それ以外を拒否します。

指定IPv6範囲からのメールは受け入れられ、他は拒否されます。

## 3. 複数のメカニズムの組み合わせ

```
v=spf1 ip4:192.0.2.0/24 include:example.com redirect=_spf.anotherdomain.com
```

`192.0.2.0/24` のIP範囲とexample.comのSPFレコードにマッチするサーバーを許可し、他は`anotherdomain.com` のSPFレコードにリダイレクトします。

指定IP範囲と `example.com` は許可され、他は `anotherdomain.com` のSPFレコードに従います。

## 4. 動的な条件に基づくメール送信を許可するexists

```
v=spf1 exists:%{i}.spf.example.com -all
```

exists修飾子で送信者のIPアドレス（%{i}）に基づく動的なチェックを行い、特定のDNSレコードの存在で判断します。

:::note info
SPFはDNSルックアップが10回までに制限されており、この制約を回避するために使われることもあります。
:::

送信者のIPアドレスが `203.0.113.5` の場合、このレコードは `203.0.113.5.spf.example.com` というDNSレコードの存在を確認します。このDNSレコードが存在する場合、メールは許可されます。存在しない場合は、メールは拒否されます。


## 5. マクロの組み合わせ

```
v=spf1 +mx a:%{ir}.%{v}._spf.%{d} -all
```

SPFマクロを使用して特定のIPアドレスパターンやドメイン名に基づく条件付きルールを作成します。`%{ir}` は逆順の送信者IPアドレス、`%{v}` はIPバージョン（ipv4またはipv6）、`%{d}` はドメイン名を表します。

送信者のIPアドレスが `203.0.113.5` で、ドメインが `example.com` の場合、このレコードは`5.113.0.203.ipv4._spf.example.com` というDNSレコードの存在を確認します。このDNSレコードが存在する場合、メールは許可されます。存在しない場合は、メールは拒否されます。

## 6. 送信者ドメインによる制限

```
v=spf1 include:%{l}.%{d} -all
```

`%{l}` マクロはローカルパート（メールアドレスのユーザー名部分）、`%{d}` はドメインを表します。この設定では、送信者のメールアドレスに基づいてドメインのSPFレコードを動的に参照します。

メールアドレスが `user@example.com` の場合、`user.example.com` のSPFレコードに従ってメールがチェックされます。

## 7. 特定の送信者を許可

```
v=spf1 a:mail.example.com -all
```

`a` メカニズムを使用して、特定のドメイン（この例では `mail.example.com` ）からのメール送信のみを許可し、他のすべてを拒否します。

mail.example.comのIPアドレスからのメールのみが許可されます。

## 8. 多段階のincludeメカニズム

```
v=spf1 include:spf1.example.com include:spf2.example.com -all
```

複数の `include` メカニズムを使用して、別のドメインのSPFレコードを連鎖的に参照します。

`spf1.example.com` と `spf2.example.com` のSPFレコードに定義されているIPアドレスからのメールが許可されます。

## 9. 特定の国からの送信を許可

```
v=spf1 ip4:203.0.113.0/24 geo:%{c}.spf.example.com -all
```

`%{c}` マクロを使用して、送信者の国コードに基づいたジオロケーションベースのSPFレコードを設定します。geoメカニズムは、送信者のIPアドレスの国コードを取得し、対応する国のSPFレコードを参照します。

フランス（FR）からのメールが送信される場合、`fr.spf.example.com` のSPFレコードに従ってメールがチェックされます。

## 10. カスタムマクロと複雑なロジック

```
v=spf1 %{s}.mail.%{d2} -all
```

`%{s}` マクロは送信者のメールアドレス、`%{d2}` は2レベル上のドメインを表します。この設定では、送信者のメールアドレスとドメインの組み合わせに基づいて特定のDNSレコードを参照します。

メールアドレスが `user@sub.example.com` の場合、`user.mail.example.com` のSPFレコードに従ってメールがチェックされます。

## まとめ

これらの高度なSPF設定例は、メール認証プロセスを細かく制御するためのものです。
特に、送信者ドメインによる制限やカスタムマクロの使用などは、特殊なケースでの利用を想定しています。

メールをきちんと受信者に到達させるためには、他にもDKIMや配信速度、送信元の各種レピュテーションの維持など、実はとても大変であり、奥が深いんですよね。

各種メールプロバイダーも昨今のスパム問題への対応を強化していることもあり、今後もよりセキュアな状態でメールを配信しなければ届かないという状況は加速していくものと思います。

正しい設定と、適切な内容と配信量を心掛けて、送信側も受信側も無理や無駄のないメール配信を行なっていきましょう。

## 参考

https://datatracker.ietf.org/doc/html/rfc7208