–
From詐称した迷惑メールへの対応として、「BATV」をPostfixで有効にしたいと思う。
BATVはBounce Address Tag Validation(バウンスアドレス タグ バリディション)の頭文字をとったらしい。
細かいところは自身で検索を。
参考にしたサイトはこちら
batv-proxy.plの動作として、
- メールを送信する際、送信元メールアドレス情報にタグをつける。
- 送信先でエラーになってバウンスメールとなり戻ってくる。
- 戻ってきたバウンスメールの宛先メールアドレスからタグを探す。
- タグが有る場合は受信しますが、ない場合は拒否する。
From詐称されたメールがバウンスしてきた場合、上記「3」の時点でタグを見つけられないため、「4」にてメールは拒否されます。
設定に先立ち、ちょっと理解に時間が掛かったのが、アウトバウンド(サーバから送る)メールとインバウンド(サーバに届く)メールで使うポート番号を分けるということ。batv-proxy.plの機能の中で「送信元メールアドレス情報にタグをつける」という作業と「メールアドレスからタグを探す」という作業を行っており、それぞれアウトバウンド用のポートとインバウンド用のポートの用意が必要だった。
今回、trippyboy.comの環境では、587番ポートを送信専用とする。これから送信するメールは全て587番ポートからメールを送信するようにした。Webメールも例外ではない。自サーバから送る全てのメールは587番ポートを使って送信することにする。そうしないと送信時にタグが付かないので、送信先でバウンスし、エラーメールの配信があっても受け取ることが出来ない(とおもう)。
準備
①必要なファイルをダウンロードして解凍しておこう。サーバ上で作業を行うのであれば以下を参考に。
http://babel.de/download/batv-proxy.pl.bz2
# cd /tmp # wget http://babel.de/download/batv-proxy.pl.bz2 # bunzip2 batv-proxy.pl.bz2 # chmod +x batv-proxy.pl
②サーバで使用しているポートを確認しておこう
これから設定する「batv-proxy.pl」を利用する上でディフォルトで4つのポート(10025~10028)を利用する。現在のサーバにて以下のポートが利用されていないかを確認しておこう。「netstat」コマンドを使って確認します。
# netstat -ap | grep 1002
もし利用されているポートがあるなら、起動時に異常終了しエラーになってしまいます。自環境では「amavis」を用いてウイルスフィルタを噛ましているのだが、それに10025を利用していたので10025~10028の設定を全て10026~10029で行いました。もし同じように10025~10028のポートに関して利用している場合、「baty-proxy.pl」のなかの記述の変更が必要。加えてこれから行なうPostfxiの設定変更時にも注意が必要なので、そのへん宜しく。
/var/log/messagesに記録されたエラー
Apr 22 12:11:14 trippyboy batv-proxy-in[34448]: Error during bind(): Address already in use
設定1:「batv-proxy.pl」を編集する
ダウンロードしてきたファイルはそのままでは使えません。
①47行目あたりから「@keys」に入る鍵「secret*」を変更します(このままでも問題なく利用できます)。
47 my @keys = 48 ( 49 'secret0', 50 'secret1', 51 'secret2', 52 'secret3', 53 'secret4', 54 'secret5', 55 'secret6', 56 'secret7', 57 'secret8', 58 'secret9' 59 );
上記「secret*」を「tomato*」に変更したい場合は、以下のコマンドで一括変更できます。
# sed -i 's/secret([0-9])/tomato1/g' batv-proxy.pl
#
# head -n 59 batv-proxy.pl|tail←確認
'tomato1',
'tomato2',
'tomato3',
'tomato4',
'tomato5',
'tomato6',
'tomato7',
'tomato8',
'tomato9'
);
#
②自サーバで利用しているドメインを指定します。
63 use constant ADDRESSES => 64 '@example.com$', 65 '@example.net$', 66 '@example.org$';
もし利用しているドメインが「trippyboy.com」だったら以下のようになります。
63 use constant ADDRESSES => 64 '@trippyboy.com$';
Perlの記述で、最後に「;」を忘れないようにしましょう。「,」を使って次の行に続くときは「;」は必要ありません。
③外部サーバから接続し、送信のみに使っているメールアドレスが有る場合は指定します。
ここで指定されたメールアドレスは、メール送信時に送信元メールアドレスに「タグ」が付与されなくなります。なぜかというと「送信のみ」に使っていますので、「タグ」を付与し、そのメールがバウンスし自サーバではないほかのサーバに配信されたとき、そのメールアドレスに含まれた「タグ」を認識できずにエラーになってしまうからです。
79 use constant OUR_EXCEPTIONS => 80 '^external-shop@example.com$';
特に指定がない場合はこのままでも言いですし(どうせ使わないので)、もしくは「’**’;」の中身をけして「”;」だけにしてあげてください。
79 use constant OUR_EXCEPTIONS =>
80 '';
④「batv-proxy.pl」を適切な場所に移動する。
現在は/tmp/配下にあると思うので、これを適切な場所に移動しておきましょう。ぶっちゃけ何処でもいいんですが、私の場合/root/bin/配下に置くようにしておきます。
# mkdir /root/bin/ ←/root/binを利用する + /root/bin/がない場合 # mv /tmp/batv-proxy.pl /root/bin/
設定2:「/etc/rc.d/rc.local」を編集する
①「batv-proxy.pl」がサーバの起動時に自動で起動するように設定を記述しておきます。
以下のコマンドは「batv-proxy.pl」が「/root/bin/」に有る場合です。
# echo "/root/bin/batv-proxy.pl -i -n &" >> /etc/rc.d/rc.local # echo "/root/bin/batv-proxy.pl -o -n &" >> /etc/rc.d/rc.local
なお、上記「-i」はインバウンド、「-o」はアウトバウンド、「-n」は拒否しないという設定です。
設定が完了し動作に問題がないときにはこの「-n」を削除しておきましょう。
変更が正しく行なわれたかも一応見ておきましょう。
# cat /etc/rc.d/rc.local
設定3:「/etc/postfix/master.cf」を編集する
さてさて、いよいよメインの/etc/postfix/master.cfの編集です。
編集をする前に必ずバックアップを取っておきましょう。
準備段階で、利用しているポート番号がかぶっている場合、以下内容の「10025~10028」を適時自身で決めたポート番号に変更してください。このポート番号は「batv-proxy.pl」に設定したものと同じである必要があります。
以下「-o」から始まる行は行頭からではなく必ず半角スペースで行頭との隙間を開けてください。
①「smtp inet n - n - - smtpd」の記述を探し、その下に以下を追記 -o smtpd_proxy_filter=127.0.0.1:10025 -o receive_override_options=no_unknown_recipient_checks
②「submission inet n - n - - smtpd」の記述を探し、その下に以下を追記 -o smtpd_proxy_filter=127.0.0.1:10027 -o receive_override_options=no_unknown_recipient_checks
③「cleanup unix n - n - 0 cleanup」の記述を探し、その下に以下を追記 -o canonical_classes=envelope_recipient,header_recipient -o canonical_maps=regexp:/etc/postfix/batv.regexp
④以下の記述を一番下にそのままコピペします。
127.0.0.1:10026 inet n - n - - smtpd -o smtpd_authorized_xforward_hosts=127.0.0.1 -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions= -o mynetworks=127.0.0.1 127.0.0.1:10028 inet n - n - - smtpd -o smtpd_authorized_xforward_hosts=127.0.0.1 -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions= -o mynetworks=127.0.0.1
④「/etc/postfix/batv.regexp」を作成します。
# echo '/^prvs=[0-9]{4}[0-9A-Fa-f]{6}=(.*)$/ $1' >> /etc/postfix/batv.regexp
ここではまだPostfixの再起動はしないように。
起動
①まずはメインとなる「batv-proxy.pl」を起動しておきます。
# /root/bin/batv-proxy.pl -i -n & # /root/bin/batv-proxy.pl -o -n &
②Postfixを再起動します。
# service postfix restart
以上で設定が完了です。今後は/etc/rc.d/rc.localを編集したのでサーバ起動時に自動で起動してくれます。
もし、①で起動したプロセスを停止し起動オプションを変えたい場合には、プロセス一覧からPIDを特定しkill -9してあげてください。
さて、「どうやって正しく動いているか確認したらいいんだ?」って事ですよね。
以下に私がやってみたことを書いておきます。
1. 587番ポートを使ってメールを送信し、送信先に届いたメールのヘッダの内「Return-Path」の記述が書き換わっていることを確認。
2. 他サーバAから自サーバのメールアドレスを詐称したメールを他サーバBに送信し、他サーバBからのバウンスメールが自サーバに配信されるが、宛先不明でエラーになることを確認(batv-proxy.plのオプション「-n」を削除したあと)。
3. 587番ポートを使ってメールを「でたらめ@他サーバA」に送り、バウンスメール配信時の自サーバのメールログにて「orig_to=<prvs=***」を確認。
不明点あればコメント or コンタクトme。
コメント