torの出口ノードからのアクセスをfirewalldで全て拒否する方法
tor経由で悪さをされるとたまったもんじゃないのでfirewalldでアクセス自体をお断りすることにしました。
torの出口ノードのIPアドレスはここにあるので、それを使います。
出口ノードのIPアドレスはsedコマンドを使って抜き出します。
抜き出したらipsetに登録してからfirewalldでブロックします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/bash EXIT_ADDRESS_URL='https://check.torproject.org/exit-addresses' EXIT_ADDRESS_FILE='/usr/local/etc/tor_exit_node.txt' SET_NAME='TOR_EXIT_NODE' # アドレス一覧をダウンロード wget -q -O $EXIT_ADDRESS_FILE $EXIT_ADDRESS_URL || exit $? # IPアドレスだけ抽出 sed -i -n -E 's/^ExitAddress ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) .+$/\1/p' $EXIT_ADDRESS_FILE [[ -s $EXIT_ADDRESS_FILE ]] || exit 1 if [[ $(firewall-cmd --get-ipsets) =~ ^${SET_NAME}\ ]]; then # set削除 firewall-cmd -q --permanent --delete-ipset=${SET_NAME} fi # set作成 firewall-cmd -q --permanent --new-ipset=${SET_NAME} --type=hash:net # アドレス追加 firewall-cmd -q --permanent --ipset=${SET_NAME} --add-entries-from-file=${EXIT_ADDRESS_FILE} # firewalldでdrop if ! [[ $(firewall-cmd --direct --get-rules ipv4 filter INPUT) =~ ^0\ -m\ set\ --match-set\ $SET_NAME\ src\ -j\ DROP\ ]]; then firewall-cmd -q --permanent --direct --add-rule ipv4 filter INPUT 0 -m set --match-set $SET_NAME src -j DROP fi # 設定反映 systemctl reload firewalld |
torの出口ノードなんてたまに変わるので恒久的な登録はしてません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<del>#!/bin/sh # Get tor exit address data=`curl https://check.torproject.org/exit-addresses` if [ $? -ne 0 ]; then echo "Cannot get address." exit 1 fi echo "${data}" | grep "ExitAddress" | while read line; do ip=`echo "${line}" | sed -e "s/^ExitAddress \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/g"` firewall-cmd --zone=drop --add-source="${ip}" # firewall-cmd --zone=drop --permanent --add-source="${ip}" done </del> |
せっかくなので新しいtorの出口ノードも塞げるようにこのシェルスクリプトを定期的に実行するようにしましょう。
というわけでcronの設定をします。
シェルスクリプトは/usr/local/bin/ban_tor_exit_nodeに保存しました。
1 |
ln -s /usr/local/bin/ban_tor_exit_node /etc/cron.hourly/ |
起動時に実行したい場合はrc.localに書いておけばOKです。
1 |
echo "/usr/local/bin/ban_tor_exit_node" >> /etc/rc.local |