ひよこになりたい

Programming Server Network Security and so on

.htaccessでTor経由のアクセスを遮断する

Tor使っててなんとなくTorからのアクセス遮断したくなったので書いてみた(特に意味は無い) Torの出口ノードを.htaccessで遮断するだけなので

出口ノード一覧はここにあります
http://torstatus.blutmagie.de/ip_list_exit.php/Tor_ip_list_EXIT.csv

一覧更新が定期的に行われるっぽいので.htaccessをその都度更新します

# -*- coding: utf-8 -*-
import time
import datetime
from subprocess import call, PIPE, DEVNULL

while True:
    # download Tor list
    cmd = "wget -nc http://torstatus.blutmagie.de/ip_list_exit.php/Tor_ip_list_EXIT.csv"

    ret = call(cmd.split(), stdout=DEVNULL, stdin=DEVNULL, stderr=DEVNULL)
    if ret != 0:
       print("download error")
    else:
        with open('/var/www/.htaccess', 'w') as fp:
            fp.write('Order allow,deny\n')
            fp.write('Allow from all\n')
            fp.write('<IfModule mod_rewrite.c>\n')
            fp.write('    RewriteEngine on\n')
            with open('Tor_ip_list_EXIT.csv', 'r') as torfp:
                list = torfp.readlines()
            for l in list:
                ip = l.replace('.', '\\.').replace('\n', '') + '$'
                fp.write('    RewriteCond %{REMOTE_ADDR} ^' + ip)
                tail = '\n' if l == list[-1] else ' [OR]\n'
                fp.write(tail)
            fp.write('    RewriteRule ^(.*) torpage.html [L]\n')
            fp.write('</IfModule>\n')
    print(datetime.datetime.now().isoformat(' '), "done")
    time.sleep(60 * 60 * 12) # 12じかんおき

python3で書いてます。

12時間おきにTorの出口ノード一覧をチェックし、/var/www/.htaccessを上書きします。内容はTorからのアクセスをtorpage.htmlに書き換えて返すだけです(以前のhtaccessは失われるので注意

実行&常駐

$ screen
$ python3  torlimit_htaccess.py
[Ctrl + A + D]でデタッチ

出力

Order allow,deny
Allow from all
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REMOTE_ADDR} ^2\.98\.200\.182$ [OR]
    RewriteCond %{REMOTE_ADDR} ^2\.111\.64\.26$ [OR]
(略)
    RewriteCond %{REMOTE_ADDR} ^217\.172\.190\.19$ [OR]
    RewriteCond %{REMOTE_ADDR} ^217\.210\.165\.43$
    RewriteRule ^(.*) torpage.html [L]
</IfModule>

http://zipsan.pw/ にTorでアクセスしてみるとしっかり遮断してくれるので一応動いてるっぽい。

他にうまい方法あるかも?