Kodama's home / tips.
参考リンク:
S25R 方式(Selective SMTP Rejection)は, メールの受渡しのために接続した時点で, 接続元のサーバ名を検査して排除する方法です. ppp 接続など動的な接続から直接送られるメールを SPAM の可能性が高いとして排除します. また, DNS への登録の状況なども参照されます. そこで, エンドユーザが自分で手軽に構築したサーバなどでは, 排除されてしまう危険もあります.
サイト間のメールの受渡しでは, 送信ドメイン認証(通信者認証) が採用されつつあります. SPF/SenderID, DomainKeys や DKIM など DNS サーバを通じてメールサーバの正当性を検査します. 送信ドメイン認証はこの文書では扱いませんが, 大手ISPでは, エンドユーザが構築するメールサーバから直接メールを送信することを制限する方向にあります. このような状況で, エンドユーザがメールサーバを運用したい場合には, 他サイトへのメールはプロバイダのメールサーバを中継して送付すべきと思われます.
postfix でこのような設定を調整するには SMTP プロトコルとメールヘッダ について知っておく必要があります. メール受渡しの SMTP レベルでの検査などの箇所としては, 以下のようなものが考えられます..
パターン 動作 メッセージ # 行頭が # ならコメント行
使用できるパターンは postconf -m でしらべます. ここでは hash と pcre(Perl Compatible Regular Expressions) を用います. hash では固定文字列, pcre では正規表現によるマッチングを使えます.
$ postconf -m btree cidr environ hash nis pcre proxy regexp sdbm static tcp unix
動作
"メッセージ" は接続しているサーバへのメッセージ(エラーメールのメッセージ)や mail.log への記録に使用されます.
# /etc/postfix/Makefile # Rules for Postfix data files. # all: makedb all : reload reload: makedb /usr/sbin/postfix reload makedb: transport.db client_access.db helo_access.db sender_ns.db sender_mx.db transport.db : transport /usr/sbin/postmap hash:/etc/postfix/transport client_access.db : client_access /usr/sbin/postmap hash:/etc/postfix/client_access helo_access.db : helo_access /usr/sbin/postmap hash:/etc/postfix/helo_access sender_ns.db : sender_ns /usr/sbin/postmap hash:/etc/postfix/sender_ns sender_mx.db : sender_mx /usr/sbin/postmap hash:/etc/postfix/sender_mx以下で hash を併用しているので postmap が必要だが, pcre を使うなら, postmap は不要になる.
/etc/postfix/main.cf に以下を書き込みます.
# /etc/postfix/main.cf # tarpitting smtpd_soft_error_limit = 2 smtpd_error_sleep_time = 30s smtpd_hard_error_limit = 10
使用例:
smtpd_client_restrictions=
permit_mynetworks,
reject_unauth_pipelining,
reject_multi_recipient_bounce,
sleep 100
休止の入る条件を調整できるので, 可能な限り 許可/不許可を振り分けたあと, 残っているものに対して 一時休止すると良いでしょう.
振り分けの条件が多く入っている smtpd_sender_restrictions の最後にいれるのが良いかも知れません.
master.cf から待ち時間つきのスクリプトを呼び出す方法もあります. この方法だと, 無差別に接続開始の時点で休止が入ってしまいます.
まず, 次のようなスクリプトを /usr/libexec/postfix/slowsmtpd.sh として作成し, chmod で実行可能にしておきます.
#!/bin/sh /usr/bin/sleep 70 /usr/libexec/postfix/smtpd $@ ## end of the script ##次に /etc/postfix/master.cf の smtp の項で上のスクリプトを呼び出すようにします.
# smtp の該当行を修正 smtp inet n - n - 200 slowsmtpd.sh #smtp inet n - n - - smtpd/usr/sbin/postfix reload します.
確認試験の方法: SMTP プロトコルとメールヘッダ を参考に手動で smtp のポートにアクセスしてみます.
$ telnet localhost smtp
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
: ここで待ち時間が入る
220 mail.receive.ac.jp ESMTP Postfix (Debian/GNU) : 受信サーバ名
quit
221 2.0.0 Bye
Connection closed by foreign host.
$
# /etc/postfix/main.cf
# smtp connection
smtpd_delay_reject = yes
# 評価の開始時点を RCPT TO まで遅らせるが, 評価の順序は
# smtpd_client_restrictions, smtpd_helo_restrictions, smtpd_sender_restrictions, smtpd_recipient_restrictions となる.
# smtpd_data_restrictions はこれとは無関係に DATA の後になります.
disable_vrfy_command = yes
# VRFY コマンドは使わせない
smtpd_client_restrictions=
permit_mynetworks,
#自ネットワークからの要求は許可
reject_unauth_pipelining,
# いわゆる「同期エラー」が発生したら拒否。
reject_multi_recipient_bounce,
#bounce (envelope sender が <>) が複数の recipient を含むことはありえない
check_client_access hash:/etc/postfix/client_access,
check_client_access pcre:/etc/postfix/client_access_S25R,
### reject_unknown_client
### クライアントの IP アドレスが DNS に PTR (アドレスから名前への) レコードを持たない場合や、
### その PTR レコードがマッチする A (名前からアドレスへ) レコードを持たない場合に拒否
# hash:/etc/postfix/client_access 202.66.133 DISCARD client_access 202.66.134 DISCARD client_access 202.134.72 DISCARD client_access 202.134.81 DISCARD client_access 202.134.98 DISCARD client_access 202.134.106 DISCARD client_access dyxnet.com DISCARD client_access 58.180.196 DISCARD client_access 58.180.197 DISCARD client_access 58.180.199 DISCARD client_access 58.180.217 DISCARD client_access 221.207.172 DISCARD client_access 221.207.173 DISCARD client_access # jp ac.jp OK ad.jp OK go.jp OK mixi.jp OK #co.jp yahoo.co.jp OK vh.plala.or.jp OK # ne.jp m2.home.ne.jp OK softbank.ne.jp OK ezweb.ne.jp OK so-net.ne.jp OK eonet.ne.jp OK docomo.ne.jp OK vodafone.ne.jp OK zaq.ne.jp OK # com nifty.com OK # ppp.infoweb.ne.jp hotmail.com OK google.com OK yahoo.com OK data-hotel.net OK verisign.net OK edu OK unknown REJECT reverse_lookup_failure # DNS 逆引きが無い場合
# pcre:/etc/postfix/client_access_S25R
# S25R client permission specifications for Postfix
# c.f. http://gabacho.reto.jp/anti-spam/anti-spam-system.html
# To check /var/log/mail.log:
# grep ': client=' mail.log|gawk '{print $8}'|sort|uniq -c|sort -n
# grep ': from=' mail.log|gawk '{print $8}'|sort|uniq -c|sort -n
####################################
# S25R White list
# 許可を出しておきたいものはここに記述
/\.hotmail\.com$/ OK
####################################
# S25R GENERIC PROTECTION
# 動的な接続と思われるものを排除する.
# これは, 避けて個々に調整する方が良いかも. とりあえずコメントアウト.
#
# [rule 0]
/^unknown$/ REJECT reverse_lookup_failure
#
# [rule 1]
# ex: evrtwa1-ar3-4-65-157-048.evrtwa1.dsl-verizon.net
# ex: a12a190.neo.rr.com
#/^[^.]*[0-9][^0-9.]+[0-9]/ REJECT client_access_S25R_gen1
#
# [rule 2]
# ex: pcp04083532pcs.levtwn01.pa.comcast.net
#/^[^.]*[0-9]{5}/ REJECT client_access_S25R_gen2
#
# [rule 3]
# ex: 398pkj.cm.chello.no
# ex: host.101.169.23.62.rev.coltfrance.com
#/^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/ REJECT client_access_S25R_gen3
#
# [rule 4]
# ex: wbar9.chi1-4-11-085-222.dsl-verizon.net
#/^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/ REJECT client_access_S25R_gen4
#
# [rule 5]
# ex: d5.GtokyoFL27.vectant.ne.jp
#/^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./ REJECT client_access_S25R_gen5
#
# [rule 6]
# ex: dhcp0339.vpm.resnet.group.upenn.edu
# ex: dialupM107.ptld.uswest.net
# ex: PPPbf708.tokyo-ip.dti.ne.jp
# ex: dsl411.rbh-brktel.pppoe.execulink.com
# ex: adsl-1415.camtel.net
# ex: xdsl-5790.lubin.dialog.net.pl
#/^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9]/ REJECT client_access_S25R_gen6
##########################
# S25R Black list
# 止めたいものをここに明示的に記述する.
# pr86.internetdsl.tpnet.pl
# fq217.neoplus.adsl.tpnet.pl
# pa148.braniewo.sdi.tpnet.pl
/\.(internetdsl|adsl|sdi)\.tpnet\.pl$/ REJECT client_access_S25R_black1
#
# user-0cetcbr.cable.mindspring.com
# user-vc8fldi.biz.mindspring.com
/^user.+\.mindspring\.com$/ REJECT client_access_S25R_black2
#
# c9531ecc.virtua.com.br (hexadecimal used)
# c9066a60.static.spo.virtua.com.br (hexadecimal used)
/^[0-9a-f]{8}\.(.+\.)?virtua\.com\.br$/ REJECT client_access_S25R_black3
#
# catv-5984bdee.catv.broadband.hu (hexadecimal used)
/\.catv\.broadband\.hu$/ REJECT client_access_S25R_black4
#
# Edc3e.e.pppool.de
# BAA1408.baa.pppool.de
/[0-9a-f]{4}\.[a-z]+\.pppool\.de$/ REJECT client_access_S25R_black5
#
# pD9EB80CB.dip0.t-ipconnect.de (hexadecimal used)
/\.dip[0-9]+\.t-ipconnect\.de$/ REJECT client_access_S25R_black6
#
# pD9E799A1.dip.t-dialin.net (hexadecimal used)
/\.dip\.t-dialin\.net$/ REJECT client_access_S25R_black7
#
# ool-43511bdc.dyn.optonline.net (hexadecimal used)
/\.dyn\.optonline\.net$/ REJECT client_access_S25R_black8
#
# rt-dkz-1699.adsl.wanadoo.nl
# c3eea5738.cable.wanadoo.nl (hexadecimal used)
/\.(adsl|cable)\.wanadoo\.nl$/ REJECT client_access_S25R_black9
#
# ACBBD419.ipt.aol.com (hexadecimal used)
/\.ipt\.aol\.com$/ REJECT client_access_S25R_black10
#
# /etc/postfix/main.cf # HELO/EHELO smtpd_helo_required = yes # HELO又はEHLOコマンドを送信してこない要求は拒否 smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, # HELO または EHLO ホスト名の文法が不正な場合に拒否 # reject_non_fqdn_hostname, # HELO(EHLO) ホスト名が RFC で要求されているような完全修飾ドメイン形式ではない場合に拒否 # reject_unknown_hostname, # HELO または EHLO ホスト名の DNS A または MX レコードがない場合に拒否 check_helo_access hash:/etc/postfix/helo_access # check_helo_access pcre:/etc/postfix/helo_access_pcre
# /etc/postfix/helo_access # 外部から 自サイト名でアクセスされることは無い,と仮定する. my-domain.ac.jp DISCARD helo_access(my-domain.ac.jp) .my-domain.ac.jp DISCARD helo_access(my-domain.ac.jp)
# /etc/postfix/helo_access_pcre /^[[]?[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+[]]?$/ REJECT Not_Hostname # IP アドレスであれば拒否. アドレスリテラル ([x.x.x.x] の形式) も拒否 # 整備不良のサーバの可能性があるが... !/\.(?:[a-z][a-z]|com|net|org|edu|gov|mil|int|info|biz|name|pro|museum|aero|coop)$/ REJECT bad-FQDN.RFC2821_section4.1.1.1. # インターネット上に存在し得るトップレベルドメインを持つホスト名でなければ拒否
# /etc/postfix/main.cf
# envelope
strict_rfc821_envelopes = yes
# envelope FROM が不正な形式であれば拒否する。
smtpd_sender_restrictions=
permit_mynetworks,
# 自ネットワークからの要求は許可
check_sender_access pcre:/etc/postfix/sender_access_pcre,
# メールアドレスによる制限
check_sender_ns_access hash:/etc/postfix/sender_ns,
# DNS サーバによる制限
check_sender_mx_access hash:/etc/postfix/sender_mx,
# DNS MX による制限
sleep 90
# ここで休止
# reject_non_fqdn_sender
#MAIL FROM アドレスが RFC で要求されているような完全修飾ドメイン形式ではない場合に拒否
# reject_unknown_sender_domain
#MAIL FROM アドレスに DNS A または MX レコードがなく、Postfix がその送信者アドレスの最終配送先ではない場合に拒否
# /etc/postfix/sender_access_pcre # /^spammer@example.com/ REJECT # /.*spammers.org/ REJECT /^.*@no.com/ DISCARD sender_access_pcre /^.*nomorespam.nowhere.info/ DISCARD sender_access_pcre /^.*pinkponk.com/ DISCARD sender_access_pcre /^.*reject-all.my-deja.com/ DISCARD sender_access_pcremailq でバウンスを見ると, 捨てアドレスにバウンスするようなものが確認できる. 実在する第三者にバウンスするものはここでは対策できない.
dig ... ns して NS の名前を調べ調整.
# /etc/postfix/sender_ns ns1.diyixian.com DISCARD sender_ns ns2.diyixian.com DISCARD sender_ns ds1.hkdom.net DISCARD sender_ns ds2.hkdom.net DISCARD sender_ns ns1.domainmanager.com DISCARD sender_ns ns2.domainmanager.com DISCARD sender_ns ns.buydomains.com DISCARD sender_ns ns1.busiassist.net DISCARD sender_ns ns1.busiassists.com DISCARD sender_ns ns1.dehfs.com DISCARD sender_ns ns1.dmfactory.net DISCARD sender_ns ns1.dmfactorys.com DISCARD sender_ns ns1.dmfactorys.net DISCARD sender_ns ns1.dsfad.com DISCARD sender_ns ns1.dufpv.net DISCARD sender_ns ns1.dufqv.net DISCARD sender_ns ns1.is-name.net DISCARD sender_ns ns1.kim-name.net DISCARD sender_ns ns1.magmagss.com DISCARD sender_ns ns1.mr-bater.com DISCARD sender_ns ns1.qrbyv.com DISCARD sender_ns ns1.qrdvy.com DISCARD sender_ns ns1.smagmag.net DISCARD sender_ns ns1.sogobusi.com DISCARD sender_ns ns1.toptjechnology.com DISCARD sender_ns ns1.ttforever.net DISCARD sender_ns ns1.zets-1.com DISCARD sender_ns ns2.busiassist.net DISCARD sender_ns ns2.busiassists.com DISCARD sender_ns ns2.dehfs.com DISCARD sender_ns ns2.dmfactory.net DISCARD sender_ns ns2.dmfactorys.com DISCARD sender_ns ns2.dmfactorys.net DISCARD sender_ns ns2.dsfad.com DISCARD sender_ns ns2.magmagss.com DISCARD sender_ns ns2.mr-bater.com DISCARD sender_ns ns2.smagmag.net DISCARD sender_ns ns2.toptjechnology.com DISCARD sender_ns ns2.ttforever.net DISCARD sender_ns ns2.zets-1.com DISCARD sender_ns s-name.net DISCARD sender_ns this-domain-for-sale.com DISCARD sender_ns
# /etc/postfix/sender_mx nullmx.domainmanager.com DISCARD sender_mxdig ... mx して MX の名前を調べ調整.
例:(mail.log から影響を調査)
grep relay /var/log/mail.log|gawk '{print $8}'|sort|uniq -c|sort -n
# /etc/postfix/main.cf
# envelope rcpt to
smtpd_recipient_restrictions =
permit_mynetworks,
#自ネットワークは素通し
reject_non_fqdn_recipient,
# RCPT TO アドレスが RFC で要求されているような完全修飾ドメイン形式ではない場合に拒否
reject_unauth_destination
#自ネットワーク以外への要求は拒否
# /etc/postfix/main.cf header_checks = pcre:/etc/postfix/header_check_pcre
# /etc/postfix/header_check_pcre # filename extensions #/^Content-Type: .*;\s*name="(.+\.(?:BAT|CMD|COM|CPL|EXE|HTA|JS|JSE|LNK|MSI|PIF|REG|SCR|VBE|VBS|WSF|WSH))"/ DISCARD header_check_file:$1 #/^Content-Disposition: .*;\s*filename="(.+\.(?:BAT|CMD|COM|CPL|EXE|HTA|JS|JSE|LNK|MSI|PIF|REG|SCR|VBE|VBS|WSF|WSH))"/ DISCARD header_check_file:$1 # MUA/MTA /^X-Mail-Agent: (BSMTP) DLL .+ by Tatsuo Baba/ DISCARD header_check_mailer_$1 /^Received: \((shiroyagi) .+ Release build .+\) ; .+ \(.+\)/ DISCARD header_check_mailer_$1 /^X-Mailer: .*(Achi-Kochi) Mail/ DISCARD header_check_mailer_$1 /^X-Mailer: .*(IM200[0-9]) Version/ DISCARD header_check_mailer_$1 /^Subject:.*!!!/ DISCARD header_check_subject /^Subject:.*( \$\$\$|\$\$\$ )/ DISCARD header_check_subject
# /etc/postfix/main.cf #body_checks = pcre:/etc/postfix/body_check_pcre
# /etc/postfix/body_check_pcre
# smtpd_data_restrictions = sleep 90 # ここで一旦,遅延させる
一方, 有効な宛先名に送るタイプのメールは1/2 程度にしか減っていないように見える. こちらは, ユーザの聞き取り調査や mail.log の記録から推定する. こちらの方は, SPAM 対策の ベイジアン フィルタなどで, 検査を行い, ユーザの段階で振り分けなどで対処している.
個人的に云うと SPAM が 1/10 程度には減っている.
Kodama's home / tips.