UNIX的技術向上計画

UNIX系のOS。主にOpenBSDとUbuntuについて、自分のメモも兼ねて書いていきます。基本的に内容及びリンク先については保証致しません。ご了承ください。

OpenBSD spamd でメールフィルタリング(FreeBSD9)

OpenBSD spamd でメールフィルタリングを行う設定です。

今回は FreeBSD 上で動作させます。

環境

OS: FreeBSD 9

アーキテクチャ: x86_64

FreeBSD9を使用していますが、 pkg の spamd が古いらしいため、 後ほど FreeBSD10 の手順も作成します。

準備

OSインストール後、 pf のモジュールをロードさせます。

# kldload pf

kldstat コマンドで「pf.ko」というのがあれば大丈夫です。

# kldstat 
Id Refs Address            Size     Name
 1    7 0xffffffff80200000 1611688  kernel
 2    1 0xffffffff81a12000 52f2     fdescfs.ko
 3    1 0xffffffff81a18000 2bcf     pflog.ko
 4    1 0xffffffff81a1b000 307d3    pf.ko

上記でうまくいかない場合はカーネルの再コンパイルを行います。

# cd /usr/src/sys/amd64/conf/
# cp GENERIC MYGENERIC

「 MYGENERIC 」に以下を追加します。 # Enabling Packet Filter(PF)| device pf # Packet filter device pflog # Packet filter logging device pfsync # Packet filter state table logging

# Enabling ALTQ (for Packet Filter(PF))
options                ALTQ            # Enable ALTQ.
options                ALTQ_CBQ        # Build the ``Class Based Queuing'' discipline.
options                ALTQ_RED        # Build the ``Random Early Detection'' extension.
options                ALTQ_RIO        # Build ``Random Early Drop'' for input and output.
options                ALTQ_HFSC       # Build the ``Hierarchical Packet Scheduler'' discipline.
options                ALTQ_CDNR       # Build the traffic conditioner. 
options                ALTQ_PRIQ       # Build the ``Priority Queuing'' discipline.
options                ALTQ_NOPCC      # Required if the TSC is unusable.

カーネルコンパイルします。

# config MYGENERIC
# cd /usr/src
# make buildkernel KERNCONF=MYGENERIC
# make installkernel KERNCONF=MYGENERIC

再起動

# sync
# sync
# sync
# shutdown -r now

環境設定

spamdをインストール

# pkg install spamd

「/etc/fstab」に以下を追加

fdescfs /dev/fd fdescfs rw 0 0

適用

# mount -a

「/etc/rc.conf」を編集

pf_enable="YES"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pf_rules="/etc/pf.rules"
pflog_flags=""
gateway_enable="YES"
obspamd_enable="YES"
obspamd_flags="-h mysntp.local -G 25:4:864 -l 127.0.0.1 "
obspamd_grey="YES"
obspamlogd_enable="YES"
obspamlogd_flags="-I -i lo0"
pfspamd_enable="YES"
pfspamd_flags="-g -v"

「/etc/pf.rules」を編集します。

# インターネットと通信する側の NIC 名
em0_if = "em0"

# spamdへnatさせる
table <spamd-white> persist file "/usr/local/etc/spamd/white-db"
rdr on $em0_if inet proto tcp from any to port smtp -> 127.0.0.1 port 8025
rdr on $em0_if inet proto tcp from <spamd-white> to port smtp -> 127.0.0.1 port 25

# Allow Local Loop back
set skip on lo0

# localhostのみでListen
pass in proto tcp from any to lo0 port spamd keep state
pass in proto tcp from any to lo0 port smtp keep state

# Allow all packets to go out, and keep state of them
pass out all keep state

「rdr on $em0_if inet proto tcp from <spamd-white> to port smtp -> 127.0.0.1 port 25」 については実際に設置されている自分のメールサーバを指定してください。

例えばメールサーバが「192.168.0.10」の場合は、「127.0.0.1」の部分をそのIPにします。

ホワイトリスト用テーブルデータを作成

# vim /usr/local/etc/spamd/white-db

許可したいアドレスを「ネットワークアドレス/ネットマスク長」のように記入

192.168.152.1/32

再起動後、適用させる

# pfctl -f /etc/pf.rules

変更したテーブルのみを適用させる場合は以下のようにコマンドを利用する。

# pfctl -t spamd-white -T replace -f /usr/local/etc/spamd/white-db

persist テーブルの内容を表示する

# pfctl -t spamd-white -T show

spamdの設定

設定ファイルをコピーする。

cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf

必要であれば「/usr/local/etc/spamd/spamd.conf」ファイルを編集します。

今回はホワイトリストはpfで処理しているので、ブラックリストのみ処理させるように、 編集・追加します。

all:\
        :uatraps:nixspam:china:korea:myblack:  # myblack を追加

myblack:\
       :black:\
       :method=file:\
       :file=/usr/local/etc/spamd/block-db:

ブロックしたいIPのデータを作成

# vim /usr/local/etc/spamd/block-db

作成方法はホワイトリストと同じです。

ブラックリストの取得

「spamd-setup」を実行します。

# spamd-setup

これで公開されているブラックリストを取得してきてくれます。

定期的に実行する必要があるので、cronに登録しておきます。

いったんサーバを再起動させます。

spamdbによる手動登録

man による説明は以下となっています。

       whitelisting
       # /usr/local/sbin/spamdb -Y foo.example.org -a 1.2.3.4 2.3.4.5
       # /usr/local/sbin/spamdb -Y foo.example.org -Y bar.example.org -a 1.2.3.4

       blacklisting
       # /usr/local/sbin/spamdb -Y foo.example.org -ta 1.2.3.4 2.3.4.5

また、スパム判定用のダミーメールアドレスを登録することもできます。

# /usr/local/sbin/spamdb -T -a 'trapmeil@trapdmain.localhost'

「trapmeil@trapdmain.org」を自分のサイト等に入れて、クローニングさせます。

<a herf="trapmeil@trapdmain.localhost"></a>

これで上記のメールアドレス宛に送信してきた場合はスパマーだと分かります。

状態を確認するときは「spamdb」と入力します。

まとめ

メールフィルタリングのシステムは他にもいくつかありますが、 OpenBSD spamd の場合は既存の環境を壊さずに追加できる点が良いと思います。

また、自身がダミーのメールサーバとして動作し、 実際のメールサーバが何であっても利用可能なのも有用です。

最初に記述しましたが、後ほどFreeBSD10用のものも作成します。

参考資料・リンク

OpenBSD spamd

サーバに spamd を入れてみた

魔術師見習いのノート

The FreeBSD Diary -- Fighting spam with pf

FreeBSDサーバー構築マニュアル

pf.conf の設定順序 - sparcintosh の気まぐれ日記

FreeBSD Enable PF ALTQ Firewall Support

8.4. コンフィグレーションファイル

カーネルの再構築 - 英語とプログラミング気まぐれ日記

FreeBSDのローダブルモジュール入門 - syohex’s diary

PF(パケットフィルタ) on FreeBSD | シカでした。

FreeBSDでpfを使う(1/2) - Qiita

Spamd Greylisting Tarpit Spam Protection @ Calomel.org

更新履歴

  • 2015/10/10 作成

  • 2015/10/22 pf のルールを修正