メッセージ欄
分類 【spam】 で検索
▼ [spam] 国別DNSBL with rbldnsd
以前、特定の国からのメールをすべて拒否で、Postfix のみに利用できる方法を解説したが、他のソフト (Apache + mod_access_rbl や CGIプログラムなど) から利用可能にするには、DNSBLとして利用できる形態が望ましい。(DNSBLについては、Apache 1.3 + mod_access_rbl を参照。)
DNSBLの運用にBINDを利用することも可能ではあるが、ある程度規模があるDNSBLを運用する場合には設定ファイルの再読み込みに時間がかかるなどの問題があるため、ここでは rbldnsd を利用する方法を解説する。
導入するべきソフト
- dns/rbldnsd
方針
rbldnsdは 127.0.0.1:10053 で待ち受けする。BINDは特定のゾーン (rbldnsd.local) のクエリのみ rbldnsd を参照する。
+------+ +---------+
query -->| *.53 | --> | L:10053 |
| BIND | | rbldnsd |
+------+ +---------+
設定方法
- 設定ファイルの作成・修正
# mkdir /usr/local/etc/rbldnsd # cd /usr/local/etc/rbldnsd # vi rbldnsd.rbl # vi /etc/namedb/named.conf # vi /etc/rc.conf # /usr/local/etc/rc.d/rbldnsd.sh start
rbldnsd.rbl の記載内容は以下の通り (実際のデータの一部):$DATASET ip4set:ad ad :127.0.0.1:Andorra 194.158.64.0-194.158.95.255 85.94.160.0-85.94.191.255 91.187.64.0-91.187.95.255 $DATASET ip4set:ae ae :127.0.0.1:United Arab Emirates 194.170.0.0-194.170.255.255 195.229.0.0-195.229.255.255 213.132.32.0-213.132.63.255
named.confの追加内容は以下の通り:zone "rbldnsd.local" { type forward; forward first; forwarders { 127.0.0.1 port 10053; }; };rc.confの追加内容は以下の通り:rbldnsd_enable="YES" rbldnsd_flags="-u bind:bind -r /usr/local/etc/rbldnsd -b 127.0.0.1/10053 -c 0 rbldnsd.net:combined:rbldnsd.rbl"
- 194.158.64.0 は Andorra に割り当てられたアドレスなので、"ad.rbldnsd.local" にはレコードが存在し、"jp.rbldnsd.local" には存在しないことを確認する。
% host 0.64.158.194.ad.rbldnsd.local 0.64.158.194.ad.rbldnsd.local has address 127.0.0.1 % host -t txt 0.64.158.194.ad.rbldnsd.local 0.64.158.194.ad.rbldnsd.local descriptive text "Andorra" % host 0.64.158.194.jp.rbldnsd.local Host 0.64.158.194.jp.rbldnsd.local not found: 3(NXDOMAIN)
- 外部からの利用を許したくない場合、ゾーン設定に
allow-queryを追加すればよい。(以下の例は127.0.0.1, 192.168.1.0/24 のみを許可する場合。)allow-query { 127.0.0.1; 192.168.1.0/24; }; - 必要に応じて Apache や Postfix などの設定を行う。
とりあえず、試験的に countrycode.dnsacl.net を立ち上げてみた。たとえば、kr.dnsacl.net は韓国のアドレスをブロックするDNSBLになっている。("acl" は access control list; ホワイトリストにも利用できるため。)
▼ [spam] アドレス収集ボットからアドレスを隠蔽する
ウェブサイトにメールアドレスを掲載するとボット (bot = robot) に収集され、そのうちspamが大量に押し寄せるようになる。私のアドレスも10年ほど前から無防備に晒していたため、今では1日に500通ほどのspamが送信されてくる。(実際には、前述の通り中国・韓国を国ごと拒否することで緩和されているが。)
これらのbotに対抗するため以下のような方法が採られてきたが、利便性が損なわれる、実効性が低いなどの問題があり、決定打とはなっていない。
- 画像でメールアドレスを掲載
- ASCII以外の文字 (いわゆる全角) で掲載
- 実体参照で掲載
- JavaScriptで出力する
- 途中、無関係の文字列 "REMOVE-THIS-PART" 等を入れる
今回考えた方法では、無関係の文字列 "REMOVE-THIS-PART" を入れつつ、それをCSSやJavaScriptで非表示・削除することで、それらのいずれかに対応しているUAであれば通常通りに表示される。(ただし、JavaScriptに対応していないまたは無効にしてある場合には、コピー・ペーストにより "REMOVE-THIS-PART" が出現する。)
- メールアドレスを記載する場合には、以下のように "hidden" クラスに属する任意の要素を入れ、その中には適当な文字列を入れておく。その際、実際にはこの文字列を除く必要があることが分かる文字列が望ましい。
<p>sakura@<span class="hidden">REMOVE-THIS-PART.</span>example.com</p>
- スタイルシートに以下の設定を行う。
.hidden { display: none; } - 以下のJavaScriptコードを読み込ませる。(HTMLファイル中に記載、または別ファイルにして読み込ませる。
- ロード時に上記関数を呼び出す。とりあえず、bodyの開始タグに以下の設定をすれば動く。
<body onload="delete_hidden()">
function delete_hidden()
{
var elems = document.getElementsByTagName("*");
for(var i = 0; i < elems.length; i++) {
var elem = elems[i];
if(elem.className == "hidden") {
var parent = elem.parentNode;
parent.removeChild(elem);
}
}
}
この方法が十分に機能するかどうかは分からないが、JavaScriptを理解するbotでも無い限りは大丈夫… と信じたい。
