SPFの導入

SPFですよ。SPF!
Sun Protection Factorでも、Specific Pathogen Freeでもないですよ。
Sender Policy Frameworkのことですよ。

詳しくは、IT用語辞典などを見てもらうことにして、
spam対策として期待されている技術だそうですよ。
まぁ、私個人としてはあまり期待していないんですが・・・(をひ
これを入れないと、メールが送れなくなっちゃうかもしれないので導入しておきましょう。
少なくとも、送信側は。
「あまり期待していない」
だって、結局はDNSを自分で操作できるspamerには何の意味も無いから。
spamerって結構自分でドメイン持っちゃってるからねぇ・・・

まぁ、「やっていないよりはマシ」位の気持ちで設定しましょう(゚ω゚)b

やること一覧
	・送信側の設定受信側の設定

関連ページ
	・postfix with smtp auth独自ドメインの取得(VALUE DOMAINの場合)メール転送時にSPF認証が失敗する



送信側の設定

メールを送信するとき、「このメールは正式なメールですよ」と証明する方法。
送信の証明は、単にドメインのtxtレコードを編集するだけですが・・・
システム全体としてみれば、MTA:DNSの各管理者が協力しないといけないものらしい。
自宅鯖だから、全部1人でやってると思うけど・・・

まぁ、設定。
VALUE DOMAINさんでは、そのまんまTXTレコードが編集可能なので書き込めばいいです。
はい。

書式としては、
(例:au one netの場合)
txt @ v=spf1 +mx +a:nmomta.auone-net.jp +ip4:211.5.2.125 ~mx:auone-net.jp -all
といった感じになる。

それぞれで説明していくと

	"txt @":VALUE DOMAINで、TXTレコードを書くときのお約束。
	"v=spf1":SPFを使いますよ〜といった宣言文。その後は、メール送信の条件文。
	"+":続く条件のところから「メールが送信されます(肯定:pass)」という記号。
	"~":続く条件のところから「メールが送信されるかも知れない(弱い否定:softfail)」という記号。
	"-":続く条件のところから「メールは送信されません(強い否定:fail)」という記号。
	"mx":DNSに登録されているメール鯖(MXレコード)
	"a:":ホスト名を指定するときの記号。
	"ip4:":IP(ver4)を指定するときの記号。
	"all":それ以外の全てをあらわす記号。
全部通して意訳すると、
「MXレコードとnmomta.auone-net.jp、211.5.2.125からメールを送ります。これは大丈夫。
もしかしたら、auone-net.jpのメール鯖からも送るかも・・・よくわかんないから許可しておいて。
でも、他からは送りせん。捨ててください。偽者です」
となる。

ちなみに"v=spf1 -all"とかくと、
「このドメインからは、メールが送信されることはありません」
という意味になる。

他にも"ip6:"など、いろいろあるけど・・・
まぁ、それは、センダー・ポリシー・フレームワークとか、
Sender ID:送信者側の設定作業を見てください。

ちなみに、au one net(当時DION)メール関係のドメイン-IPの関係を調べた結果は以下の通りでした。
--IP/domain--

nmomta.auone-net.jp=>ラウンドロビン(多数のIP)<=>nm0[1-9]omta0[1-9].auone-net.jp
relay-mta.dion.ne.jp=>211.5.2.125<=>rns01.dion.ne.jp
dion.ne.jp(mx)=>ispmail01.dion.ne.jp/ispmail02.dion.ne.jp<=>61.200.164.[33,36]

--outboundリレー--
自分のドメイン>relay-mta.dion.ne.jp>nmomta.auone-net.jp(ラウンドロビン動作)>[internet]
relay-mta.dion.ne.jp>nmomta.auone-net.jpのリレーは相変わらず謎。
設定したSPFがきちんと機能しているかは
空メールを送ると自動的に結果が返信されてきます。
ちなみに、設定してすぐはDNSの情報が拡散していないので、しばらく経ってから実行したほうがいいです。
「送信側の設定」
ドメインのTXTレコードを登録するだけですが、docomoやauでSPF対応を宣言してますから
これを登録しないと携帯にメールが遅れなくなる可能性があります。
まぁ、そこまでは厳しくないと思いますが、docomoはかなり怪しいみたいですので対応しておきましょう。

参考:どさにっき

受信側の設定

受信側の設定ではMTAへのSPF確認の実装が必要になります。
で、うちで紹介しているpostfixにはSPFの確認手段が搭載されていませんし、
今後、搭載される予定も無いようです。
なので、大抵の方は外部のソフトを利用されているようですが・・・
そのソフトで一番有名なpostfix-policyd-spf-perlは、まんまperlなんですよ。
つまり、純正玄箱の貧弱なperlでは動きません(確認済み)

で、見つけたのがpolicyd-spf-fsというもの。
これはC言語で書かれているとのことで、postfix-policyd-spf-perlより高速に動いてくれる・・・
と思います。

まぁ、うちでは動いてくれればそれで御の字なんですけどねw

で、事前準備です。
libspf2のインストール

libspf2-1.2.5.tar.gzを手に入れる
libspf2 - SPF Library - Home

そのままコンパイルすると以下のようなエラーが出るので修正が必要。

make時のエラー内容
	┃make[4]: Entering directory `/mnt/home/[username]/libspf2-1.2.5/src/spfquery'
	┃source='spfquery.c' object='spfquery.o' libtool=no \
	┃depfile='.deps/spfquery.Po' tmpdepfile='.deps/spfquery.TPo' \
	┃depmode=gcc /bin/sh ../../config/depcomp \
	┃gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../src/include -I../../src  \
	┃  -g -O2 -Wall -c spfquery.c
	┃spfquery.c: In function `response_print_errors':
	┃spfquery.c:265: parse error before `int'
	┃spfquery.c:275: `i' undeclared (first use in this function)
	┃spfquery.c:275: (Each undeclared identifier is reported only once
	┃spfquery.c:275: for each function it appears in.)
例のあれ
	$ tar xvfz libspf2-1.2.5.tar.gz
	$ cd libspf2-1.2.5
	$ ./configure --prefix=/usr
	$ patch -p0 <~/libspf2-1.2.5p1.obj
		libspf2-1.2.5パッチ1(libspf2-1.2.5p1.tar.gz) md5sum crc32:4127A48C
		参考:building libspf2 on NetBSD and Linux: questions and patches
		注:パスはパッチを置いた場所を指定する。
	$ make
	$ make check
	# make install
インストールされるもの
	[prefix]/bin/
		spf_example spfd spfquery spftest spf_example_static
		spfd_static spfquery_static spftest_static
	[prefix]/include/spf2/*
	[prefix]/lib/
		libspf2.a libspf2.la libspf2.so libspf2.so.2 libspf2.so.2.0.0
おまじない
	# strip -p /usr/bin/spf*

policyd-spf-fsのインストール

policyd-spf-fs_23.tar.gzを手に入れる
FreeStone Systems - SPF Policy Daemon for Postfix

パッチを準備する
参考:王様の耳は驢馬の耳
一般にSPFのヘッダは"Received-SPF:"なのにpolicyd-spf-fsでは"X-Received-SPF:"になっているとのこと。
また、「SPFが登録されてない時のヘッダの形が微妙に不正っぽい(変)」とのこと。
(オリジナル)コンパイル時にlibspf2と同じエラーが出るのでその対策を追加。
(オリジナル)エラー時、必要以上にサーバーの情報を渡しているのを修正。

policyd-spf-fs_23パッチ1(policyd-spf-fs_23p1.tar.gz) md5sum crc32:4E2ACEA9

例のあれ
	$ tar xvfz policyd-spf-fs_23.tar.gz
	$ cd policyd-spf-fs_23
	$ patch -p0 <~/policyd-spf-fs_23p1.obj
spf_dns_internal.hがねぇよヽ(`Д´)ノ といわれるので、もらってくる。
	# cd /usr/include/spf2
	# wget http://csourcesearch.net/data/package/libspf2/libspf2-1.2.5/src/include/spf_dns_internal.h
		参考:csourcesearch.net File: libspf2-1.2.5/src/include/spf_dns_internal.h
spf_dns_internal.h(spf_dns_internal.tar.gz) md5sum crc32:D7DE1D09 を、/usr/include/spf2/に置く。

Makefileの編集
	$ vi Makefile
		(変更)
		┃PREFIX  ?= /usr
		┃BIN     = $(PREFIX)/sbin
		┃CFLAGS = -g -O2 -Wall -DHAVE_GETOPT_LONG_ONLY -DHAVE_NS_TYPE
			注:prefixを/usr/localから/usrに変更
			注:インストール先を$(PREFIX)/binから$(PREFIX)/sbinに変更
			注:コンパイルオプションに"-DHAVE_NS_TYPE"を追加
	$ make
	# make install
インストールされるもの
	[prefix]/sbin/policyd-spf-fs

postfixにポリシーを組み込む(READMEの通り)
	# vi /etc/postfix/master.cf
		(追加)
		┃# Policy daemon for SPF
		┃spf-policy  unix  -       n       n       -       -       spawn
		┃        user=nobody argv=/usr/sbin/policyd-spf-fs --debug=1

	# vi /etc/postfix/master.cf
		(追加)
		┃smtpd_sender_restrictions =
		┃   ・・・(自分の設定)・・・
		┃   reject_unknown_sender_domain
		┃   reject_unverified_sender
		┃   check_policy_service unix:private/spf-policy
			注:順番を間違えないこと。
postfixのリロード
	# /etc/init.d/postfix reload
		注:一応、不正中継テストをしておくべき。
ちなみに、デフォルトでの動作は、
"Failしたらリジェクト、それ以外はヘッダに残す設定"
とのことです。
まぁ、failする設定にする奴が悪いってことで、問題ないと思います。はい。
「貧弱なperl」
兎に角、最低限の作業以外に使えないperlです。
拡張はできないし、perl使いの方なら即再インストールされるような代物。
って言うか、私も「面倒臭いから」って理由だけで放置しているだけですからね。

まぁ、これで受信側でのSPF対応は終了です。


戻るなら押せ!