【spam対策】:さくらのレンタルサーバのfmlでスパム対策をする

うちの鯖ではメーリングリストを2件運用している。さくらのレンタルサーバがfmlをインストールしてくれてあるので、設置はとても簡単なのだが、今月に入ってそのうちの一つのMLでやたらスパムメールが飛び交うようになってしまった。
多分原因はメーリングリスト参加メンバの一人がウイルススパムに引っかかって、自分のアドレス帳に載っているメールアドレスを垂れ流してしまったこと。そのなかにメーリングリスト用のアドレスも入っていて、どこかで拾われたっぽい(ので僕のところには自分のアドレスとMLのアドレスと両方からスパムが増えてしまった)。
まあ、参加メンバがウイルスに引っかかったり、スパムをやらかしたりと言うのは責におえる話では無いし、そういう状況に対応してこそ自前で運用していることの最大のメリットであるべきだと考えているので、いろいろ設定を加えてみた。この記事はその備忘記事。

なお、この記事の内容はfml の SPAM 対策を大いに参考にしてもらった。と言うか、ほとんど抜粋でしかない。参考記事は決して新しい記事ではないようだが、参考元にもあるようにfml自体が相当に古いソフトでもあるので、参考記事の内容で充分であった。

スパムメールフィルタを通す設定にする

まずは必須の設定。さくらのレンタルサーバはspamassassinと言うベイジアンフィルタを標準搭載しているので、これはぜひ活用したい。
スパムアサッシンの設定はサーバ提供の初期設定でも構わないが、可能なら日本語環境向けにカスタマイズぐらいはしておきたい。
うちのサーバでのspamassassinカスタマイズ状況は、臨時対策:最近急に増えたスパムメール対策および2011年04月版SpamAssassinのベターな設定@さくらインターネットのレンタルサーバにまとめてあるので、そっちを参考にされたし。
で、SpamAssassinに対応する設定は以下の通り。

まず、/home/(user名)/fml/spool/ml/(ml名)/を開き、そこのconfig.phファイルとcfファイルに以下のコードを書き加える。
(config.ph:445行目ぐらいに設定があるのでコメントアウト外して追記しても、その辺りにコード追記でも構わない。もちろんどこに書いてもいいけど)

<code>
$USE_DISTRIBUTE_FILTER = 1;
&DEFINE_FIELD_PAT_TO_REJECT('X-Spam-Flag', 'Yes');
</code>

(cf:90行目辺りの# YOU CAN EDIT MANUALLY AFTER HERE. の後に書いておくのが無難だと思う)

<code>
USE_DISTRIBUTE_FILTER	1
&DEFINE_FIELD_PAT_TO_REJECT('X-Spam-Flag', 'Yes');
</code>

両方同じ設定を書いてあるように見えるけど、まあおまじないと言うことで両方書いておいた方がいい。また、同じように見えて;一個分表記が違うのでその辺は一応注意。たしかさくらのレンタルサーバ初期設定でも、うちのスパムフィルタ設定参考にしても、さくらのレンタルサーバ非公式FAQを参考にしても、X-Spam-FlagをYesにして判定しているのは同じはずなので、そこは気にしなくてもいいだろう。これで、fmlのフィルタ機能が有効になる。

次に、同じく/home/(user名)/fml/spool/ml/(ml名)/の、includeおよびinclude-ctlに以下のように書き足す。
(includeの場合)

<code>
"|/usr/local/bin/spamassassin |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name "

# Multipart Canceler Filter by Yuao TANIGAWA 
#"|/home/user-name/fml/bin/multipart.pl |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name "
</code>

(include-ctlの場合)

<code>
# ***ATTENTION***  --ctladdr options is stronger than "--distribute", 
# Hence even if config.ph has the setting &DEFINE_MODE(distribute),
# this "fml.pl ... --ctladdr" does commnads-service;
"|/usr/local/bin/spamassassin |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name  --ctladdr"

# Multipart Canceler Filter by Yuao TANIGAWA 
#"|/home/user-name/fml/bin/multipart.pl |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name  --ctladdr"
</code>

つまり、|/usr/local/bin/spamassassinを書き足す(上記コードではuser-nameおよびfml-nameを適宜修正すべし)。include-meadなんてファイルもあるが、これは書き換えても書き換えなくてもどっちでもいいだろう(エラーメール用のフィルタらしい)。これで、フィルタの中でSpamAssasinを呼ぶように設定が加わる。なお、参考記事では|/usr/bin/spamassassinとなっているけど、さくらのレンタルサーバではSpamAssassinの置き場所が違うのでそこは注意。一応SSHログインしてwhich spamassassinをして場所を確認しておいた方がいいかもしれない。

で、この二つを書き終えるとスパムからのfml投稿は拒否されるわけだけど、拒否された結果どこかの.spamボックスなどに残るのか、闇夜の彼方に消え去るのかはちょっと不明。時間があれば調査したい。

参加者以外の投稿を禁止

上記設定してあればほとんどのメールは食い止められると思うが、一部スパムフィルタをすり抜けるメールは存在するだろうので、ML登録者以外からの投稿は禁止してしまった方がいい。メーリングリストを介してスパムを垂れ流すなんて正直、管理者として赤っ恥もいいところなので、そんなメールはゼロにしたいと言う強い思い入れでもある。
なお、この設定をして何が困るかと言うと、ML参加者が複数のメールアドレスを所持していて、たまたまML配信先とは違うアドレスから投稿したら拒否された、と言うケースだが、fmlでは一応『配信可能なアドレス』と『配信されるアドレス』は別個に設定できる。設定はさくらのレンタルサーバコントロールパネルからでも可能だし、fmlの設定メニュー(makefml config ML)からでも可能だけど、めんどくさいので/home/(user名)/fml/spool/ml/(ml名)/にある
members→『配信可能なメールアドレス』
actives→『配信されるメールアドレス』
の一覧なのでこれに直接書き足した方が手っ取り早いと思う。で、管理者ですら知らないメーリングリスト参加者の保有メールアドレスへの対応はすっぱり諦めよう(余裕があれば棚卸調査のメールをMLに流してもいいとは思うが)。

で、以下のように設定を書き換える。/home/(user名)/fml/spool/ml/(ml名)/を開き、そこのconfig.phファイルとcfファイルを再び開きコードを書き換える。
(config.ph:90行目ぐらいと115行目ぐらいに設定があるので、書き換える。)

<code>
$MAIL_LIST                     = "fml-name\@$DOMAINNAME";
$PERMIT_POST_FROM              = "members_only";
$REJECT_POST_HANDLER           = "ignore";

$CONTROL_ADDRESS               = "fml-name-ctl\@$DOMAINNAME";
$PERMIT_COMMAND_FROM           = "members_only";
$REJECT_COMMAND_HANDLER        = "ignore";
</code>

(cf:26行目辺りからのアクセスポリシーの書き換え)

<code>
### Access Policy
MAIL_LIST                	lapis@$DOMAINNAME
PERMIT_POST_FROM         	members_only
REJECT_POST_HANDLER      	ignore

CONTROL_ADDRESS          	lapis-ctl@$DOMAINNAME
PERMIT_COMMAND_FROM      	members_only
REJECT_COMMAND_HANDLER   	ignore
</code>

これも両方設定は同じことなんだけどおまじないで両方書き換えで。要するにPERMIT_XXX_FROMをmembers_onlyに、REJECT_XXX_HANDLERをignoreにしている。参加者以外からのメールは拒否した上に無視する、と言うこと。無視にしておかないと、『spam業者がfmlにメールを投げる』→『fmlが拒否メールをspam業者宛てに返す』→『spam業者から文句のメールが返ってくる』と言うくだらない事態が起こるからだ。文句と言うのはReturned mail: see transcript for details(reason: 550 5.1.:User unknown)だったりWarning: could not send message for past 4 hours(454 4.7.1 : Relay access denied)だったりとまあいろいろ(と言うか文句言ってるのはspam業者の鯖じゃなくてうちの鯖か)あるのだけど、こんな無駄なキャッチボールしてても仕方ない。

この設定をしておくことで、少なくともfml参加者にスパムを垂れ流すことは防げるだろう。いや、さらにfml参加アドレスで詐称してスパムメール流して来たらどうすんの?とかなくもないけど、そこまでになったらその時考える。まあ、可能性として高いのは、『詐称されるアドレス垂れ流すほどリテラシーの低いそのML参加者の方になんらかの対策を促し、それが不可能ならそのML参加者を退会処置にする』とすべきかなあ。

不正メール受信時の警告メール抑制

上記まで終えるとスパムメールがメーリングリスト上に流れたり、スパムメールに対して無駄な応答をしたり、と言った処置には対応が済むのだけど、最後の迷惑モノとして、メーリングリスト管理者宛てに「不正メールが来たので報告しておきますよ」と言うfmlのおせっかい機能がある。まあ、そりゃfmlのソフトの挙動として不審なエラーを報告する義務は大事なんだけど、毎日そんな報告を何件も受けていても仕方ない。ので、このfmlおせっかい機能を無効にする。

これは直接ソースコードを書き換えるしかないので、/home/(user名)/fml/を開き、そこのfml.plファイルを開きコードを改変する。
(fml.pl:1833行目辺りからのIgnoreHandler関数の改変)

<code>
sub IgnoreHandler
{
    &Log("Ignored: \"From:\" field is not member");
#    &WarnE("Ignored NOT MEMBER article from $From_address $ML_FN", 
#	   "Ignored NOT MEMBER article from $From_address");
}
</code>

IgnoreHandler という関数定義の中の「WarnE」をコメントアウトする。

これでfmlへの迷惑なメールの対処は一応完了。

【spam対策】:最近急に増えたスパムメール対策

ここ数日、スパムメールを受ける割合が急速に増えた。
正しく言うとスパムメールフィルタ(SpamAssassin)をすり抜けて受信してしまうメールが増えた。
これはどういうことかと思い調べてみると、どうやら同一の手口のメール対策が不十分で、受信してしまうことが分かった。

Return-Path:
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on www302.sakura.ne.jp
X-Spam-Level: ******
X-Spam-Status: No, score=6.1 required=12.0 tests=BAYES_50,CONTENT_TYPE_PRESENT, HTML_MESSAGE,MIMEQENC,MULTIPART_ALTERNATIVE,ONLY1HOPDIRECT,ONLY1HOPDIRECTRIPE, QENCPTR1,QENCPTR2,RCVD_IN_SBL,RIPE_NCC,RP_MATCHES_RCVD,TOOLONGSTR, URIBL_JP_SURBL autolearn=no version=3.3.2
Received: from www302.sakura.ne.jp (ksav31.sakura.ne.jp [210.224.165.211])
by www302.sakura.ne.jp (8.14.5/8.14.5)
with ESMTP id s1PCK5ID038721 for <___@________.net>;
Tue, 25 Feb 2014 21:20:05 +0900 (JST) (envelope-from OnlineDoctorate-___=______.net@_alaskansmokedsalmonplus.com)
X-Nat-Received: from [202.181.99.22]:20402 [ident-empty] by smtp-proxy.isp with TPROXY id 1393330805.22619
Received: from net._alaskansmokedsalmonplus.com (net._alaskansmokedsalmonplus.com [77.81.108.140])
by www302.sakura.ne.jp (8.14.5/8.14.5)
with ESMTP id s1PCJhkJ038572 for <___@________.net>;
Tue, 25 Feb 2014 21:19:46 +0900 (JST) (envelope-from OnlineDoctorate-___=_______.net@alaskansmokedsalmonplus.com)
MIME-Version: 1.0
From: Online Doctorate
To: ___@______.net
Subject: Find the degree program for you.
Reply-To: replyto1@_alaskansmokedsalmonplus.com
List-Unsubscribe:
Message-ID: <5253142afb72bdd6c0db0751d4f7433d@_alaskansmokedsalmonplus.com>
Date: Tue, 25 Feb 2014 12:19:51 +0000
X-Anti-Virus: Kaspersky Anti-Virus for Linux Mail Server 5.6.45.2/RELEASE, bases: 25022014 #7301207, status: clean
X-Antivirus: avast! (VPS 140224-1, 2014/02/25), Inbound message
X-Antivirus-Status: Clean
Content-Type: multipart/alternative; boundary=”===============3635023624886176509==”
Content-Transfer-Encoding: 7bit

There is no text only message available for this email. Please use an HTML capable email client.
Unsubscribe from future emails: unsub1@_alaskansmokedsalmonplus.com

(HTMLパートは省略)

Return-Path:
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on www302.sakura.ne.jp
X-Spam-Level: **********
X-Spam-Status: No, score=10.9 required=12.0 tests=BAYES_50, CONTENT_TYPE_PRESENT,HTML_MESSAGE,MIMEQENC,MULTIPART_ALTERNATIVE, ONLY1HOPDIRECT,ONLY1HOPDIRECTRIPE,QENCPTR1,QENCPTR2,RCVD_IN_MSPIKE_L3, RIPE_NCC,RP_MATCHES_RCVD,TOOLONGSTR,URIBL_DBL_SPAM,URIBL_JP_SURBL autolearn=no version=3.3.2
Received: from www302.sakura.ne.jp (ksav51.sakura.ne.jp [219.94.192.131])
by www302.sakura.ne.jp (8.14.5/8.14.5)
with ESMTP id s1OAV2Tv091610 for <____@______.net>;
Mon, 24 Feb 2014 19:31:02 +0900 (JST) (envelope-from CookingSchool-___=______.net@jessicadegouw.net)
X-Nat-Received: from [202.181.99.22]:44918 [ident-empty] by smtp-proxy.isp with TPROXY id 1393237862.29202
Received: from non._jessicadegouw.net (non._jessicadegouw.net [31.220.43.158])
by www302.sakura.ne.jp (8.14.5/8.14.5)
with ESMTP id s1OAV1lg091606 for <___@______.net>;
Mon, 24 Feb 2014 19:31:01 +0900 (JST) (envelope-from CookingSchool-___=________.net@jessicadegouw.net)
MIME-Version: 1.0
From: Cooking School
To: ___@________.net
Subject: You won’t get in trouble for playing with food here.
Reply-To: replyto1@_jessicadegouw.net
List-Unsubscribe:
Message-ID: <5253142afb72bdd6c0db0751d4f7433d@_jessicadegouw.net>
Date: Mon, 24 Feb 2014 05:31:02 -0500
X-Anti-Virus: Kaspersky Anti-Virus for Linux Mail Server 5.6.45.2/RELEASE, bases: 24022014 #7276764, status: clean
X-Antivirus: avast! (VPS 140223-1, 2014/02/24), Inbound message
X-Antivirus-Status: Clean
Content-Type: multipart/alternative; boundary=”===============9001998848229897669==”
Content-Transfer-Encoding: 7bit

There is no text only message available for this email. Please use an HTML capable email client.
Unsubscribe from future emails: unsub1@_jessicadegouw.net

(HTMLパートは省略)

一部伏字にしてあるけどこんな感じのメール。SpamAssassinのフィルタがしきい値(うちは12に設定している)までカウントしていない。
手口としては、
・送信元サーバはいろいろ。偽装サーバではなくちゃんとドメインも存在していそう。
・Return-Pathのアドレスに受信したうちのアドレスが入っているので、ヘタに返信するとさらに多量のスパムを受け取ると思われる。
・メッセージ本文にUnsubscribeアドレスが入っているけど、ここにメール送ってもたぶんスパム100倍返しを食らうだろう。
・送信元サーバは様々だけど、Unsubscribeアドレスがどれも「unsub1@XXXX」になっているので、たぶん同一犯かなあ。

と言うことで、メッセージ本文中のUnsubscribeアドレスに送れ、の文章が同じことに着目して、private_prefsに以下の通り設定を追加してみた。
(user_prefs、private_prefsの設定し方については過去の記事参照。)

<code>
# For irregular spam.
rawbody  UNSUB1 /Unsubscribe from future emails/
describe UNSUB1 Unsubscribe adress is unsub1@example.net
score    UNSUB1 10.0
</code>

ついでに、今のprivate_prefsを他のところも抜粋して書いておくと

<code>
# 
# more information (default spamassassin rules)
# -- about : http://spamassassin.apache.org/tests_3_2_x.html
# 

# added 2011/04/15 by [chatarou] helped by [yoh]
# for checking SAKURA & MY MAIL's network.
# following IPs are anti-Virus Servers of SAKURA INTERNET (ksavXX.sakura.ne.jp)
trusted_networks 210.224.165.38 210.224.165.45 210.224.165.143 210.224.165.142 210.224.165.211 210.224.165.212 210.224.165.35 210.224.165.220 219.94.192.131 219.94.192.132 219.94.192.133 219.94.192.134 219.94.192.135 219.94.192.136 219.94.192.137 219.94.192.138 219.94.192.139 219.94.192.140 219.94.192.141 219.94.192.142 219.94.192.143 219.94.192.144 219.94.192.145 219.94.192.146 219.94.192.147 219.94.192.148 219.94.192.149 219.94.192.150 219.94.192.151 219.94.192.152 219.94.192.153 219.94.192.154 219.94.192.155 219.94.192.156 219.94.192.157 219.94.192.158 219.94.192.159 219.94.192.160 219.94.192.161 219.94.192.162 219.94.192.163 219.94.192.164 219.94.192.165 219.94.192.166 219.94.192.167 219.94.192.168 219.94.192.169 219.94.192.170 219.94.192.171 219.94.192.172 219.94.192.173 219.94.192.174 219.94.192.175 219.94.192.176 219.94.192.177 219.94.192.178 219.94.192.179

#replace_tag MYMTA ((mail|www)\.chatarou\.net)
#trusted_networks 127.0.0.1 192.168.0.1/24

# I receive very few Japanese spam mails, allmost all of spam mails are come from foreign countries.
# so changes some socres of Japanese mail's rule. :2011/04/26 by [chatarou]
score ISO2022JP_CHARSET -2.0
score ISO2022JP_BODY -2.0

# 
# We use SAKURAWEB as SMTP. so the following rule has no meanings. : 2007/12/21 by [chatarou]
# 
score SAKURAWEB 0.0

# For RAKUTEN Mail.
header   RAKUTEN_INFO Subject =~ /\!Z3ZE7\!\[/
describe RAKUTEN_INFO Rakuten Mail
score RAKUTEN_INFO -5.0

# For SONY Info Mail.
header   SONY_INFO From =~ /info\@e\.crmstyle\.com/
describe SONY_INFO SONY Info Mail
score SONY_INFO -5.0

# For irregular spam.
header   VIRTUAL_VEGASCLUB From =~ /Virtual VegasClub/
describe VIRTUAL_VEGASCLUB Virtual VegasClub
score    VIRTUAL_VEGASCLUB 5.0

header   LINKEDIN Subject =~ /LinkedIn/
describe LINKEDIN LinkedIn
score    LINKEDIN 5.0

header   PAYROLL Subject =~ /Payroll Invoice/
describe PAYROLL Payroll Invoice
score    PAYROLL 50.0

header   IRREGULAR_RETURN_PATH Return-Path =~ /\-___\=example\.net/
describe IRREGULAR_RETURN_PATH Return-Path contains (-___=example.net)
score    IRREGULAR_RETURN_PATH 6.0

rawbody  UNSUB1 /Unsubscribe from future emails/
describe UNSUB1 Unsubscribe adress is unsub1@example.net
score    UNSUB1 10.0


# 
# "FERA" ,or "DYN_FERA" is defined & scored as porn word by [yoh].
# but, "FERRARI" is not porn word for [chatarou]...: 2011/04/16 by [chatarou]
# 
rawbody  FERRARI /\%U\%\'\%i\!\<\%j/
describe FERRARI  Ferrari (maybe F1 WORKS TEAM)
score    FERRARI -0.1

#'

rawbody  MCRALEN /\%\^\%\/\%i\!\<\%l\%s/
describe MCRALEN  Mcralen (maybe F1 WORKS TEAM)
score    MCRALEN -0.1

meta  F1_MAIL FERRARI && MCRALEN
score F1_MAIL -4.0

# 
# Other Virtual Domains(chatarou.sakura.ne.jp, www302.sakura.ne.jp) are not used on mailservice. : 2011/04/24 by [chatarou]
# 
header   FAKE_VDH_TO To =~ /\@(chatarou|www302)\.sakura\.ne\.jp/
describe FAKE_VDH_TO To:  @(chatarou|www302).sakura.ne.jp
score    FAKE_VDH_TO 5.0

# 
# Other Virtual Domains are used by spammers as fake from-address. : 2011/04/24 by [chatarou]
# 
header   FAKE_VDH_FROM From =~ /\@www302\.sakura\.ne\.jp/
describe FAKE_VDH_FROM From:  @www302.sakura.ne.jp
score    FAKE_VDH_FROM 5.0

# 
# Spammers frequently writes "Nothing" in To:header. . : 2011/04/24 by [chatarou]
# 
header   NOTHING_TO_HEADER To =~ /!@/
describe NOTHING_TO_HEADER To:  Nothing
score    NOTHING_TO_HEADER 5.0


# 
# Default postmaster is used by almost only spammers. : 2008/06/20 by [chatarou]
# 
header   POSTMASTER_TO To =~ /postmaster\@example\.net/
describe POSTMASTER_TO To:  postmaster@example.net
score    POSTMASTER_TO  5.0

# threshold level down from 10.0 to 8.0 2011/04/13 by [chatarou]
# threshold level up to 12.0 2011/04/18 by [chatarou]
required_score 12.0
</code>

こんな感じになっていた。一応判定基準等をメモっておくと
・楽天とソニーはやたら危険な文字列をメール本文に盛り込むせいで、しょっちゅうスパム行き誤判定を食らっていてかわいそうだったので、救済措置をつけた。
・VIRTUAL_VEGASCLUBってのは一時期スパムフィルタをすり抜けて来ていたメールだけど、最近見かけないが設定放置。
・LINKEDINも同様。って言うかうちでNGにしてるって、LINKEDINは過去にどんな変なメール送ってきていたのやら。さっぱり記憶なし。
・PAYROLLって言うのは2013年末ごろから頻繁に見かけるようになった気がする。これはスパムメールではなくウイルスメールなので、絶対に受信拒否。
・UNSUB1は今回追加のルール。IRREGULAR_RETURN_PATHも今回の対策に反応するように書いた予備のルール。
・FERRARI、MCRALEN、F1_MAILの理由は以前の記事で書いたので省略。以降の設定も以前の記事と同じなので省略。

僕は臨時で困ったときのみ対策をするけど、こういうのを常にチェックしていて日本語用スパムフィルタ設定ファイルを書いているyohさんには頭が下がるなあと思いました。

改訂版:さくらのレンタルサーバ用spfレコード、AAAAレコード設定

さくらのレンタルサーバにspfレコードが追加されたの追記と言うか、修正と言うか、改訂版。

前回の記事の内容を抜粋すると、

(a) 最近、さくらのレンタルサーバからGMailに送信するメールで、遅延問題が発生しているらしい。

(b) そこで、さくらのレンタルサーバではspfを導入し、チェックボックスをONにするとspfの設定が有効になるらしい。

(c) が、少なくともうちの環境では上記設定はうまくいかなかった。そこで、初心に帰ってドメインメニューから自分でTXTレコードのspfを設定し直すことにし、GMailでうまくいかない原因を探ってみた。

(d) すると、GMail側ではうちのサーバのIPv6アドレスを使ってspfの評価がされていることが原因だと分かった。

(e) そこで、spfレコードに(1)IPv6アドレスの指定を追加してあげる、か(2)FQDNのAレコードを指定してあげると言う対策で問題は解消した。

と言う感じなのだが、そもそもなんでIPv6が通ってないの? とかspfレコードで直打ちでIPv6レコードを書くのはちょっと強引じゃないか? とか思い、もう少し設定を見直すことにした。

そもそも、さくらのレンタルサーバではIPv6を有効にするための手順があり、いつの間にか僕のサーバでもIPv6を有効にできるようになっていたのだけど、僕はまだIPv6サービスを有効にしていなかった。

20140208-spf_11

どうやらさくらのレンタルサーバからGmailへの配信で問題が出るのは、この辺の設定にありそうだ。つまり、

(a) 僕がchatarou.netドメインでメール配信を行うと、結果的には僕のアカウントが入っているサーバであるところのwww302.sakura.ne.jpでGMail側でspf評価がされる。

(b) 僕はIPv6アドレス設定をしていないので、IPv6での評価は失敗する。(たぶん、www302サーバの誰かがIPv6設定を有効にすると、全体に影響があるのだろう)

と言う感じになっていそう。

ならば、IPv6アドレスをドメイン設定に追加してあげれば問題は解決するのではないか?と考えた。

最良の対策案:IPv6アドレスの追加

そこで、自分のドメイン情報にIPv6アドレスを追加してみる。

まず、自分のサーバのIPv6アドレスを調べる。これは、wwwXXX.sakura.ne.jpのサーバ番号にnslookupすればわかる。やり方は、コマンドプロンプトを開いて『nslookup』と打ち込み、『wwwXXX.sakura.ne.jp』と打ち込む。WindowsXPなどの場合はIPv4しか返ってこないので、『set type=AAAA』と打ち込んでから同様に『wwwXXX.sakura.ne.jp』と打ち込む。

20140208-spf_12

次に、調べたIPv6アドレスを自分のサーバに追加してあげる。さくらインターネットのコントロールパネルから設定してもいいが、イマイチ不安なので自分で直接追加してみる。

20140129-spf_6

さくらのコントロールパネル(会員メニューの方)にログインして、『契約情報』をクリック。

20140129-spf_7

『ドメインメニュー』をクリック。

20140129-spf_8

『ゾーン編集』を行う。

20140208-spf_14

現在のゾーン設定が見れるので、『編集』をクリック。

20140208-spf_13

『エントリの追加と変更』に必要な値を入力していく。IPv6用のエントリはAタイプではなくAAAAタイプなので注意。入力が終わったら『新規登録』ないし『変更』をクリックして、上のエントリ名テーブルに正しく追加されたことを確認して、一番最後に『データ送信』をクリックして完了。

この方法で、『AAAA=(IPv6アドレス)、TXT=”v=spf1 +mx ~all”』と言うシンプルな記述で設定は完了する。ドメインが浸透するまで若干の時間待ってから、SPFレコードチェックツールやGMailにテストメールを配信してうまく設定が完了しているか確認すればいい。

次善の対策案:spfレコードに必要なIPを追加

何らかの理由があって、上記設定は見送りたいという場合は、spfレコードを直接編集して設定すればいい。

spfレコードの設定方法はtxtレコードに
“v=spf1 +ip4:(IPの4桁アドレス) +ip6:(IPの6桁アドレス) +mx ~all”
“v=spf1 +a:www(鯖番号).sakura.ne.jp +mx ~all” か
のどちらかを記載する。

細かい設定方法は前回のエントリに書いてあるので、こっちは割愛します。

上記の設定のどれかを行うことで、GMailのspf認証設定は完了します。

さくらのレンタルサーバにspfレコードが追加された

—- 2014.02.08追記 —-

このエントリの内容をベースに改訂したものを改訂版:さくらのレンタルサーバ用spfレコード、AAAAレコード設定として新規エントリに記載しました。このエントリでの記述内容で設定を変更してもメール配信問題は解決しますが、新しいエントリの設定方法の方がよりスマートかと思います。

なにやら、さくらのレンタルサーバからGMailへの送信に遅延が発生していたらしい。(うちでは未確認)
で、その対策として2014/01/27付でさくらのレンタルサーバにもspfが追加された。

他のサーバでなにやらspfを使ったような記憶があった(後述の通り、それはさくらの鯖でだった(笑))けど、だいぶ前のことだしすっかり忘れていたので、『spfレコードってどう書くんだっけかなあ…思い出さなきゃ』と思っていたら、単にチェックボックスをONにするだけだったのでちょっと拍子抜け。まあ、チェック入れとけばいいかあ…と思いつつドメイン設定が浸透するまで一日放置。
で、昨日試しにGMail宛てにテストメールを送信してみたのだけど、これが届かない。『あれーおっかしーなー』と思ってまってたら、約2時間後に迷惑メールに振り分けられていた。ダメじゃん。

GMailで迷惑メールに振り分けられた原因が『題名、または本文が迷惑メールの可能性があります』だったので、まあそういうこともあるかなあと思って迷惑メールを解除してチェックしてみた。
うちはいまだにBecky!2をメーラとして使っているレガシーさん。で、ヘッダを詳細に見ることもできるんだけど、いつも必要最低限なヘッダをチェックできるように、Header View Plugin for B2と言うのも入れてある。

20140129-spf_1

こんな感じで、本文を見ても必要なヘッダが表示されるようになっているのだが、

20140129-spf_2

こんな風に「softfail」判定されてる。(spfレコードが正しいと、Received-SPF: passと表示されるはず。) あっれー、おっかしいなあと思ってその他を一通りチェックしていると…
そもそもspf = txtレコードの追加、でこれは僕はとうの昔に設定済みだった。

20140129-spf_3

<code>
v=spf1 mx ~all
</code>

(※mxだけかくのは+mxの省略形)

(表記の意味:spfのversion1.0での判定で、mxレコードに登録されているサーバは認証を通す=pass、その他のサーバは一応拒否はしない=softfail。spfの書き方の詳細はSPF(Sender Policy Framework)を参照のこと。)

で、この記述なら従来は問題ないはずで、実際にSPFレコードチェックツールでも問題なしと言う判定になっている。

20140129-spf_4

けどよくよく読んでいくとGmailの判定では『SoftFail:SPFレコードが「~」として公開されている条件にマッチした』とある。本来ならば”+mx ~all”なので、”+mx”の部分でマッチするはずなのに、GMailさんでは”+mx”をスルーして”~all”が評価されている。

そこで、いろいろ調べていくと、どうやらGMailさんはIPv4とIPv6の両方が配布されているサーバの場合、IPv6のアドレスを評価して、IPv4の方は評価しないっぽいと言うことがわかってきた。mxレコードに登録されているのが”10 @”=”202.181.99.22″のみ評価しており、うちのサーバのIPv6であるところの”2001:e42:101:2:202:181:99:22″は評価されないようなのだ。

で、結局これに対する対策として、(1)IPv6アドレスを正しく指定してあげる、(2)FQDNのAレコードを指定してあげる、のいずれかをすればちゃんと認識するようだ。(※2014.02.08追記:もっとスマートな解決策として、IPv6用のAAAAレコードを指定してあげる方法を思いついたのでそっちを推奨します。)結果的に、冗長でも正しい判定をする方が好ましいと思ったので、以下のように記述するようにした。

<code>
 "v=spf1 +ip4:202.181.99.22 +ip6:2001:e42:101:2:202:181:99:22 +a:www302.sakura.ne.jp +mx -all"
</code>

表記の意味:spfのversion1.0で、以下の順に評価をしていく。(先に書いた方から評価されていくので、”all”は最後に書くこと。上記の”+”印は省略可。)
(ip4:202.181.99.22) ←IPv4アドレスで割り振られているサーバのアドレス。
(ip6:2001:e42:101:2:202:181:99:22) ←IPv6アドレスで割り振られているサーバのアドレス。分からなければ、GMailに試しにメールを送ればメールヘッダ内に記述されてます。※基本的にこの行が記述されていればGMail対策は終了。
(a:www302.sakura.ne.jp) ←aレコードのFQDNを記述。※GMail対策だけならこっちの表記だけでもいい。
(mx) ←mxレコードのアドレスでもpassとする。
(-all) ←上記アドレス以外はfailを返す。うちは他のSMTPサーバ経由でメール配信することはないので”-“記述だが、普通は”~all”記述の方が無難だろう。

これでGMailには無事にspf=passのメールが届くようになりましたとさ。うーむ、最初に戻るけど、さくらのレンタルサーバのコントロールパネルでのチェックボックスにはいったい何の意味があったのだろう…って言うか、サーバにIPv6アドレスをいつ配布したのか定かじゃないけど、実は鯖にIPv4/IPv6両方のアドレスを割り振ってることがGMail遅延の主因だったりしないかなあ…それとせっかくspfに対応するなら、受け取るメールでもspf認証可能にしてほしいな…それから、spfだけでなくDomainKeysにも対応して欲しいな(たしかYahooはDKIM認証やってたはずなんだけど)…

20140129-spf_5

長ったらしい文章なので、結論だけ書くと、spfとしてtxtレコードに
“v=spf1 +a:www(鯖番号).sakura.ne.jp ~all” か
“v=spf1 +ip4:(IPの4桁アドレス) +ip6:(IPの6桁アドレス) ~all”
のどちらかを記載するとGmail対策は完了です。

20140129-spf_6

さくらのコントロールパネル(会員メニューの方)にログインして、『契約情報』をクリック。

20140129-spf_7

『ドメインメニュー』をクリック。

20140129-spf_8

『ゾーン編集』を行う。

20140129-spf_9

現在のゾーン設定が見れるので、『編集』をクリック。

20140129-spf_10

『エントリの追加と変更』に必要な値を入力していく。入力が終わったら『新規登録』ないし『変更』をクリックして、上のエントリ名テーブルに正しく追加されたことを確認して、一番最後に『データ送信』をクリックして完了。