スパムメール対策は実にいろいろあり、当方でもいくつか対策してはいますが、一向に減らないのでスパムが多い国を丸ごと拒否することにしました。方法はいくつかあるようですが、postfixのpolicy委譲機能を使ってgeoipでrejectする短いスクリプトをサンプルを元に作ってみました。
メールのスパム対策は、元々古いプロトコルですし、昔から問題が多いこと、技術的な議論、なにかあったときの影響度、ユーザ数、ポリシー(信仰?)など特に議論が多くなりがちな話題だと思います。
やり方も様々ありますが、とりあえず私のところではpostfixで自前アクセス拒否リスト+αとspamassassin、クライアントサイドではthunderbirdのフィルタで対策しています。
しかしながらpostfixの設定と自前の拒否リストだけではreject率が70-80%からなかなか上がらない上、更新の手が回らなくなってきたので、今まで個人的に避けてきたDNSBLをrbl.jpさんだけ導入することと、通信することがなくかつスパムの多い国からの受信を拒否してしまうことにした次第。
国別の拒否方法として一番手軽な方法はXX.countries.blackholes.us(XX=国)をdnsblに設定することだと思いますが、DNSトラフィックが増えてしまうこととデータの更新が止まってるようなので、geoipでやってみようとpostfix付属のgreylist.plを参考にいじってみました。
前置きが長くなりましたがスクリプトの紹介と使いかたです。
インストールなど
- まずはgeoip本体をインストール。CentOSやFedora等のRedhat系ではrpmforgeをリポジトリに追加してあれば"yum install geoip geoip-devel"としてgeoipの導入が出来ます。
- MaxMind - GeoIP Perl APIから1.27をダウンロードしてインストール。
- 今回のスクリプトをインストール
>geoip-policyd-0.01.tar.gz
展開後のファイルのうち実行ファイルを/usr/local/sbinに、設定ファイルを/usr/local/etcに手動でコピーして下さい。confファイルには例としていくつか国の設定がありますので必ず内容を確認の上、修正をお願いします。配置を変える場合にはスクリプトの先頭の方にある$config_file変数の値を修正してください。
postfixの設定/etc/postfix/master.cf
user=nobody argv=/usr/local/sbin/geoip-policyd
/etc/postfix/main.cf
permit
/etc/init.d/postfix restart等としてpostfixを再起動。
/var/log/maillogにログにエラーと各メールの国情報、テスト結果が出力されます。
国情報をいじって適当にメールを送ったり、拒否させてみたりしてテストしてみて下さい。
この方式の利点はチェック時にネットワーク負荷(DNS引きとか)がないところです。国の指定が少々増えても大丈夫です。どうせならgreylist.plにこれを組み込んでホワイトリストに使った方がよかったかもしれないですね。指定のない国のメールは全てグレーとか。でも、そろそろうちでもRgrey - S25R + greylistingとかやったほうがいいような気がしてきました。
postgreyにパッチを当てて見ました。手抜きパッチですが。。。全て拒否よりましかもしれません。
なを、このスクリプトで何らかの問題が発生しても当方では責任は持てませんのであしからず御了承下さい。 問題やバグ等お気付きな点があれば御連絡頂ければうれしいです。