- perl(perl-5.8.0.tar.gz) のインストール
perl 5.8 からは日本語漢字用のパッチが不要だと言われています。また、spamassassinなどでも perl 5.8 を使用した方が楽です。
コンパイルとインストール
- ./Configure -Duseshrplib -Dusethreads -Dprefix=/usr
- make
- make test
- make install
パッケージにしようと、Configure 実行時に -Dinstallprefix=/var/tmp/usr を
指定したところ、Config.pm に「/var/tmp/usr」が組み込まれてしまったので、止めることにしました。
- mysql (mysql-standard-4.0.13-pc-linux-i686.tar.gz) のインストール
INSTALL-BINARY に書いてあるとおりです。(適当な group 番号を選んでつけました)
shell> groupadd mysql 70 # 70 は空いていたのでつけただけです。
shell> useradd -g mysql mysql # user 番号はお任せ
shell> cd /usr/local
shell> tar zxvf どこか/mysql-standard-4.0.13-pc-linux-i686.tar.gz
#
# 習慣なので下記のようには使っていません。
# shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
#
shell> ln -s mysql-standard-4.0.13-pc-linux-i686 mysql
shell> cd mysql
shell> scripts/mysql_install_db
shell> chown -R root .
shell> chown -R mysql data
shell> chgrp -R mysql .
shell> bin/mysqld_safe --user=mysql &
- sendmail (sendmail.8.12.9.tar.gz)のコンパイルとインストール
- siteconfig の用意
sendmail.8.12.9/devtools/Site/site.config.m4 を作成します。内容は次のとおりです。
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
- sendmail 用ユーザとグループの登録
他の名称でも良いのですが ユーザ smmsp グループ smmsp を登録しておく必要があります。
- sendmail のコンパイルとインストール
shell> cd sendmail.8.12.9
shell> ./Build -c # これをつけると site.config.m4 を見てくれる
shell> ./Build install
- perl ライブラリのインストール
お馴染みのインストール手順です。各々解凍後次のコマンドを実行します。
shell> perl Makefile.PL
shell> make
shell> make test
shell> make install
下記のパッケージを展開し上記インストール手順をそれぞれ実行しました。
- Sendmail-Milter-0.18.tar.gz
- DBI-1.37.tar.gz
- DBD-mysql-2.9002.tar.gz">DBD-mysql-2.9002.tar.gz
- mysql データベースの作成
mysql の初期データベース作成 コマンド mysql.sql を mysql に実行させれば良いのです。
方法は多々ありますが、下記の手順でも出来ます。(事前に mysql を使用できるようにしておきます)
- PATH に /usr/local/mysql/bin を加える。
- /usr/local/mysql/bin/mysql の link を作成する。
e.g. shell> ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
shell> mysql < mysql.sql
- White List の設定
割り当ててもらっている IP は設定しました。また、ローカルに使用している IP も設定します。(このあたりにはサイト運営の基準が効いて来ます)
shell> mysql
mysql > INSERT INTO relaytofrom (relay_ip, record_expires, create_time)
mysql > VALUES ('127.0.0.1', '9999-12-31 23:59:59', NOW());
Query OK, 1 row affected (0.00 sec)
mysql >
127.0.0.1 を希望する IP にして実行して下さい。
(クラス C 全体 ならば 127.0.0 と最下位と. を省略します。
マスクは指定できません、また、sendmail でのフィルタでは右端に「.」があると
働きませんでした。)
'9999-12-31 23:59:59' は4桁の年で表現できる範囲内での最大値です。
(これから約7000年、これでも劫に比べれば小さい)
下表の値は参考です。
| 設 定 値 例 | 有 効 期 限 |
| '9999-12-31 23:59:59' | 9999年12月31日の最後の時刻まで 言わば永久 |
| '2003-10-31 12:30:20' | 2003年10月31日12:30:20まで |
| NOW() + INTERVAL 1 YEAR | 今から1年間 |
| NOW() + INTERVAL 3 MONTH | 今から3ヶ月間 |
| NOW() + INTERVAL 60 DAY | 今から60日間 |
| NOW() + INTERVAL 6000 HOUR | 今から6000時間 |
- Black List の設定
Black List に載せると block_expires に設定した時刻まで 451 を返すようになります。
shell> mysql
mysql > INSERT INTO relaytofrom (relay_ip, record_expires, ,block_expires,create_time)
mysql > VALUES ('192.168.0.1', NOW() + INTERVAL 1 YEAR,NOW() + INTERVAL 1 YEAR,NOW());
Query OK, 1 row affected (0.00 sec)
mysql >
上記例では今から(NOW 関数)1年間受け取り拒否です(言うまでも無いことですが 192.168.0.1 を Black IP に変えてください)。
record_expires の値を block_expires より大きくすると block_expires 経過後、今度は White List になってしまいます。
block_expires を '9999-12-31 23:59:59'を設定すれば永久に Black List に載ることになります。
- White と Black の判定方法
Greylisting では着信メールを次の3つに分けています。
| 種別 | 判定基準 | データとの関連 |
| White mail |
消去時刻(record_expires)が現在(NOW())時以降でブロック終了時刻(block_expires)が現在時以前 |
record_expires > NOW() AND block_expires < NOW() |
| Black mail |
消去時刻(record_expires)が現在(NOW())時以降でブロック終了時刻(block_expires)が現在時以降\td>
| r ecord_expires > NOW() AND block_expires > NOW() |
| 未登録 |
消去時刻(record_expires)が現在(NOW())時以降のデータが無い |
record_expires > NOW() のレコードが無い。 |
White mail は受信されます。Black Mail は 451 (TEMPFAIL) として受け取りを拒否します。
未登録 mail は寿命5時間ブロック時間1時間のレコードが作成され、即刻実行されるので「Black Mail」として扱われます。
- sendmail.cf の作成
Readme_First に書いてありますが、
define(`MILTER',1)
INPUT_MAIL_FILTER(`myfilter', `S=local:/var/run/perl.sock, T=S:1m;R:2m;E:3m')dnl
を指定します。大体次のような形です。
divert(0)dnl
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`confPRIVACY_FLAGS', ``authwarnings,noexpn,novrfy'')
FEATURE(`use_cw_file')dnl
FEATURE(`use_ct_file')dnl
FEATURE(`access_db')dnl
define(`MILTER',1)
INPUT_MAIL_FILTER(`myfilter', `S=local:/var/run/relaydelay.sock', T=S:1m;R:2m;E:3m')dnl
MAILER(local)dnl
MAILER(smtp)dnl
蛇足ですが、次の手順で作成します。
shell> 上記ファイルを sendmail.mc として sendmail-8.9.12/cf/cf に格納
shell> cd sendmail-8.9.12/cf/cf
shell> ./Build sendmail.cf
- localhost での実行
今までの設定で
- 作成した sendmail.cf を /etc/mail にコピーする
- mysql のデーモンを実行する(インストール手順の中で実行しています)
shell> cd /usr/local/mysql
shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &
手動で実行させるときには cd /usr/local/mysql が必要です。
- relaydelay の設定ファイル src.co.jp> relaydelay.conf を /etc/mail にコピーする。
- milter プログラムを実行する。
shell> /usr/bin/perl relaydelay.pl /etc/mail/relaydelay.conf &
tarball の中に relaydelay.sh と言う起動用(/etc/rc.d/initd に置くためか)のシェルスクリプトがありますが、
このスクリプトを使用するためには次の操作が必要です。
- relaydelay.pl を /usr/local/sbin にコピーする。
- /usr/local/sbin/relaydelay.pl を実行可能にする(chmod +x /usr/local/sbin/relaydelay.pl)
- スクリプトの中にある /usr/local/sbin/relaydelay.pl $CONFIG の末尾に & をつける。
- sendmail を起動する。(自信が無かったので一旦終了させました)
shell> kill `head -1 /var/run/sendmail.pid`
shell> /usr/sbin/sendmail -bd -q30m
- 確認方法
mysql で relaydelay.relaytoform を表示しました。
(select 文は「select * from relaytofrom;」 でも良いですが、
このあたりはお好きにどうぞ)
表示の情報は実データから割愛し件数だけ合わせました。
shell> mysql
mysql> use relaydelay;
Database changed
mysql> select relay_ip,blocked_count,passed_count from relaytofrom;
+-----------------+---------------+--------------+
|relay_ip | blocked_count | passed_count |
+-----------------+---------------+--------------+
| 127.0.0.1 | 0 | 38 |
| NULL | 0 | 0 |
| 192.168.1 | 0 | 797 |
| 202.248.37.209 | 100 | 4 |
| 202.17.189.144 | 3 | 1 |
| 202.248.37.210 | 30 | 1 |
| 211.125.95.53 | 2 | 1 |
| 202.248.37.208 | 28 | 1 |
| 202.17.189.171 | 3 | 1 |
| 210.188.175.70 | 2 | 0 |
+-----------------+---------------+--------------+
10 rows in set (0.00 sec)
mysql>
- remote host での実行
私のところではメールの受信は2台のサーバが受け持っています。
このため両方に同じ情報を使用させるために milter をネット越にさせる事にしました。このために変更点は次のとおりです。
- mysql を働かせるサーバでは上記設定どおりにインストールしました。
- sendmail.mc の設定を下記のように変更しました。(host_nameは localhostとしてはだめです- hosts の所為かも知れませんが 127.0.0.1 で実行するようです)
ポート 91 は使っていないように見えたので勝手に使用しました。
define(`MILTER',1)
INPUT_MAIL_FILTER(`myfilter', `S=inet:91@'host_name', T=S:1m;R:2m;E:3m')dnl
変更した sendmail.mc で新しい sendmail.cf を作成し、/etc/mail にコピーします。
- relaydelay.pl が使用するポートは relaydelay.pl か relaydelay.conf の中で指定します。
relaydelay.conf の中に
$milter_socket_connection = 'local:/var/run/relaydelay.sock';
と定義されています。これを
$milter_socket_connection = 'inet:91@host_name';
と変更します。
- mysql の起動と relaydelay.pl の起動は localhost で実行する場合と同じです。