perlスクリプトの準備

SPFはperlでチェックするようになっているので、postfix-policyd-spf-perl in Launchpadからpostfix-policyd-spf-perlをダウンロードする。
(右の方に tar.gz のダウンロードリンクがある)
ダウンロードしたら/usr/local/postfix/sbin/にでも移動しておく。

perlモジュールのインストール

必要なperlモジュールをインストールする。
とりあえずpostfix-policyd-spf-perl固有の物としては

が有るのでインストールする。
他にも足りないモジュールがあるかもしれないので、postfix-policyd-spf-perlを実行してモジュールが足りないエラーが出れば都度インストールすること。

設定ファイルの編集

master.cfとmain.cfを変更する。

master.cf
#
# SPF
#
policy unix  -       n       n       -       -      spawn
  user=nobody argv=/usr/local/bin/perl /usr/local/postfix/sbin/postfix-policyd-spf-perl
main.cf
smtpd_recipient_restrictions =
        check_helo_access regexp:$config_directory/check_helo_access,
        permit_mynetworks,
        permit_sasl_authenticated,
        check_client_access hash:/usr/local/watcher2/popauth,
        reject_unauth_destination,
        check_policy_service unix:private/policy,
        check_recipient_access hash:$config_directory/acl_rcpt_map,
        check_client_access hash:$config_directory/tarpit_client_whitelist,
        check_client_access regexp:$config_directory/tarpit_client_logger,
        check_client_access regexp:$config_directory/tarpit_client

check_policy_service unix:private/policy は必ず reject_unauth_destination よりも下に書くこと。
上に書くとオープンリレーになってしまう。

設定が完了したらpostfix reloadを実行。

設定後の確認

SPF 対応しているドメインからメールを送信してみる。
対応しているかどうかは dig で TXT レコードを引いてみる。
今回は Gmail を使ってみた。

dig TXT google.com.
;; ANSWER SECTION:
gmail.com.   300 IN TXT   "v=spf1 redirect=_spf.google.com"
Gmail からのメールを受信すると以下のようなログが maillog に出力される。
Dec 22 11:57:46 leviathan postfix/policy-spf[92068]:
  : SPF pass (Mechanism 'ip4:209.85.128.0/17' matched):
  Envelope-from: *******@gmail.com
Dec 22 11:57:46 leviathan postfix/policy-spf[92068]:
  handler sender_policy_framework: is decisive.
Dec 22 11:57:46 leviathan postfix/policy-spf[92068]:
  : Policy action=PREPEND Received-SPF: pass
  (gmail.com ... _spf.google.com: 209.85.216.43 is authorized to
  use '*******@gmail.com' in 'mfrom' identity
  (mechanism 'ip4:209.85.128.0/17' matched))
  receiver=griffonworks.net; identity=mailfrom;
  envelope-from="*******@gmail.com"; helo=mail-qw0-f43.google.com;
  client-ip=209.85.216.43
また、メールヘッダには以下のような記述が挿入される。
Received-SPF: pass (gmail.com ... _spf.google.com: 209.85.216.43 is
  authorized to use '*******@gmail.com' in 'mfrom' identity
  (mechanism 'ip4:209.85.128.0/17' matched)) receiver=griffonworks.net;
  identity=mailfrom; envelope-from="*******@gmail.com";
  helo=mail-qw0-f43.google.com; client-ip=209.85.216.43
これで受信時のSPFチェック対応は完了となる。

SPF送信側対応

送信側の対応はDNS設定だけで完了するので難しいことは何もない。
ゾーンファイルに以下の行を追加する。

IN TXT "v=spf1 +ipv4:[自ホストIPアドレス] ~all"
例) IN TXT "v=spf1 +ipv4:219.75.232.51 ~all"

MX ホストからメールを送信するのであれば "+mx" も追加すればよいかと思われる。
SPF レコードのオプションについてはぐぐれ。