Tor(The Onion Router)と呼ばれる匿名ネットワークに接続するためのルーターが存在する。匿名ネットワークはFrom IPをルーターで暗号化することで隠蔽し、接続先のサーバにはTorの出口IPがFromとして記録される仕組みになっている。匿名ネットワークその物が悪と言うわけでは無いが、サイバー犯罪に利用されることも多く、利用をコントロールしたいと考えるケースもある。
そういったことから、匿名ネットワークの出口IPアドレスリストを生成するスクリプトを作成した。
TorプロジェクトのWebサイトから出口IPアドレスのリストをダウンロードすると以下の様に不要な情報も記載されている。この中からExitAddressのIP部分だけを抜き出す必要がある。
DFA97DED4CE79FF6F31DAF917C2810CCE8729E9D
Published 2023-03-30 12:50:52
LastStatus 2023-03-31 08:00:00
ExitAddress 45.61.185.83 2023-03-31 08:01:12
ExitNode D04317BF5C7694CE5914E17CBECFAAC88348579D
Published 2023-03-31 00:45:49
LastStatus 2023-03-31 11:00:00
ExitAddress 185.220.101.18 2023-03-31 11:24:31
ExitNode 359068C031765892420A672F28D506C41341AA73
Published 2023-03-31 00:34:24
LastStatus 2023-03-31 11:00:00
ExitAddress 185.194.142.90 2023-03-31 11:23:43
ExitNode E375CD23D60C2291BD04E97CBF4E7BA90E3E54E2
Published 2023-03-31 03:08:42
LastStatus 2023-03-31 10:00:00
ExitAddress 109.70.100.73 2023-03-31 10:09:36
無加工のデータでは使いにくいため、これを正規表現を駆使して不要なデータを削除する。やっている事は簡単で ExitAddress と記載された行を sed コマンドで加工しIPアドレスのみを抜き出す。抜き出したIPアドレスをファイルに書き出す。
#!/usr/bin/bash
mv -f toriplist.txt toriplist.old
toriplist=`curl https://check.torproject.org/exit-addresses`
if [ $? -ne 0 ]; then
mv -f toriplist.old toriplist.txt
exit 1
fi
echo "${toriplist}" | grep "ExitAddress" | while read line; do
ip=`echo "${line}" | sed -e "s/^ExitAddress \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/g"`
echo "${ip}" >> toriplist.txt
done
上記のスクリプトで得られるデータは純粋なIPアドレスだけのリストであるため、Firewallと連携するなど自由に利用して欲しい。
プロキシ配下の環境では curl コマンドのオプション -x でプロキシを指定する様にする。
#!/usr/bin/bash
mv -f toriplist.txt toriplist.old
toriplist=`curl https://check.torproject.org/exit-addresses -x px.example.com`
if [ $? -ne 0 ]; then
mv -f toriplist.old toriplist.txt
exit 1
fi
echo "${toriplist}" | grep "ExitAddress" | while read line; do
ip=`echo "${line}" | sed -e "s/^ExitAddress \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/g"`
echo "${ip}" >> toriplist.txt
done
Tor の出口IPのリストを手に入れることが出来たら次にをファイアウォールやUTMに適用します。適用方法に関しては様々あるが、Google Cloud Platform (GCI) に作成した Linux(Debian) のファイアウォール (ufw) に適用してみたので例を挙げる。
# cat toriplist.txt | grep -v "^$" | sed -r -e "s/^([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})$/ufw deny from \1/g" > denytorip.sh
# chmod 755 denytorip.sh
# ./denytorip.sh
# ufw status numbered
Status: active
To Action From -- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] Anywhere DENY IN 45.61.185.83
[ 3] Anywhere DENY IN 185.220.101.18
[ 4] Anywhere DENY IN 185.194.142.90
[ 5] 22/tcp (v6) ALLOW IN Anywhere (v6)
余談だがTorプロジェクトからダウンロードした出口IPアドレスのリストは重複しているようだ。実際に利用する際は sort してから uniq コマンドを利用するなど、重複排除して利用するのが望ましい。