После нескольких часов безуспешных поисков, было принято решение использовать свои ресурсы!
Итак, что в итоге должно получиться:
1. VM Ubuntu/Debian 2 CPU, 2GB RAM, 8GB HDD (ну тоесть совсем не требовательная)
2. PRIVOXY для проксирования запросов (Можно взять nginx, varnish — я взял Privoxy)
3. TOR сервер
На своем опыте скажу, 70 проксей расходуют где то 30 мегабит канала. Нас вполне устроило. Возможно ваши ресурсы будут более требовательны к трафику.
Первым делом поднимаем необходимые библиотеки:
apt-get install tor privoxy expect
В дальнейшем мы будем клонировать скрипты privoxy и tor и запускать отдельные службы поэтому первоначальная настройка не нужна.
Установка позади и приступим к формированию скрипта для автоматического развертывания сервиса
Определим начальные входные параметры:
PID_END=99 #Ограничить количество ресурсов
PRIVOXY_PORT=8100 #Стартовый порт для privoxy, соответственно всего будут заняты порты с 8100 по 8199
TOR_PORT=9100 #Стартовый порт для Tor, соответственно всего будут заняты порты с 9101 по 9199
TOR_CONTROL=20000 #Стартовый порт контроля за Tor. Данный параметр опустить нельзя, но в принципе для данной задачи он нам не нужен.
BASE_IP=10.0.0.1 #Укажем, по какому IP будет происходить коннект к нашему прокси. Это удобно если эта же тачка будет открыта в интернет.
BASE_DIR=./data_tor #Каталог с PIDами TOR
BASE_DIR_PRIVOXY=/etc #Каталог с конфигами Privoxy, замена на другой каталог должна быть согласована с 52 и 53 строчкой кода
INSTANCE=$1 #В скрипте передаем количество нужных инстансов. Это удобно если тебе не нужно сейчас 99 проксей
То, что будет подниматься первым, решайте сами. Я сначала поднимаю 99 экземпляров Tor, и позже 99 экземпяров Privoxy.
Что бы TOR работал на каком нибудь определенном порту, нужно выполнить такую команду
tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword "" --ControlPort $c_port --PidFile tor$i.pid --SocksPort $s_port --DataDirectory ${BASE_DIR}/tor$i
А вот с privoxy придется сделать страшные вещи: сделать дубликаты конфигов и исполняемых файлов.
Приведу сразу скрипты исполнения. В них все подробно расписал, что бы не ошибиться.
Запустить Tor и Privoxy можно так:
./tor_privoxy_start.sh 50
Обновить потоки так:
./tor_privoxy_start.sh 50 update
#!/bin/bash
#set -e #Остановим скрипт при первой ошибке
PID_END=99 #Ограничить количество ресурсов
PRIVOXY_PORT=8100 #Стартовый порт для privoxy, соответственно всего будут заняты порты с 8100 по 8199
TOR_PORT=9100 #Стартовый порт для Tor, соответственно всего будут заняты порты с 9101 по 9199
TOR_CONTROL=20000 #Стартовый порт контроля за Tor. Данный параметр опустить нельзя, но в принципе для данной задачи он нам не нужен.
BASE_IP=10.1.9.98 #Укажем, по какому IP будет происходить коннект к нашему прокси. Это удобно если эта же тачка будет открыта в интернет.
BASE_DIR=./data_tor #Каталог с PIDами TOR
BASE_DIR_PRIVOXY=/etc #Каталог с конфигами Privoxy, замена на другой каталог должна быть согласована с 64 и 65 строчкой кода
INSTANCE=$1 #В скрипте передаем количество нужных инстансов. Это удобно если тебе не нужно сейчас 99 проксей
ACTION=$2
UPDATE="update"
if [ ! -d $BASE_DIR ]; then
mkdir -p $BASE_DIR
fi
echo "Выберите редатор для запуска:"
echo "1 Запустить TOR и Privoxy"
echo "2 Обновить потоки TOR"
echo "3 Очистить следы TOR и Privoxy"
read doing
case $doing in
1)
#Запускаем сервисы
for i in $(seq 1 ${INSTANCE});
do
p_port=$((PRIVOXY_PORT+i))
s_port=$((TOR_PORT+i))
c_port=$((TOR_CONTROL+i))
if [ $i -gt $PID_END ]; then
echo "Количество Treads превысило максимально, допустимое значение\n"
break
fi
if [ ! -d "$BASE_DIR/tor${i}" ]; then
echo "Создаем директорию ${BASE_DIR}/tor${i}"
mkdir -p "${BASE_DIR}/tor${i}"
fi
if [ ! -d "${BASE_DIR_PRIVOXY}/privoxy${i}" ]; then
echo "Создаем директорию ${BASE_DIR_PRIVOXY}/privoxy${i}"
mkdir -p "${BASE_DIR_PRIVOXY}/privoxy${i}"
fi
cp -r ${BASE_DIR_PRIVOXY}/privoxy/* ${BASE_DIR_PRIVOXY}/privoxy$i #копируем конфигурацию из оригинала
#Заполняем конфигурацию
echo "" > ${BASE_DIR_PRIVOXY}/privoxy$i/config;
echo "forward-socks4a / 127.0.0.1:${s_port} ." >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "confdir ${BASE_DIR_PRIVOXY}/privoxy${i}" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "logdir /var/log/privoxy/" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "logfile privoxy.log" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "#actionsfile standard" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "actionsfile default.action" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "actionsfile user.action" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "filterfile default.filter" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "debug 4096" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "debug 8192" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "listen-address ${BASE_IP}:${p_port}" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "user-manual /usr/share/doc/privoxy/user-manual" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "toggle 1" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "enable-remote-toggle 0" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "enable-edit-actions 0" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "enable-remote-http-toggle 0" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
echo "buffer-limit 4096" >> ${BASE_DIR_PRIVOXY}/privoxy$i/config
cp -r /etc/init.d/privoxy /etc/init.d/privoxy$i
cp -r /usr/sbin/privoxy /usr/sbin/privoxy$i
sed -i "s/NAME=privoxy/NAME=privoxy${i}/g" /etc/init.d/privoxy$i
FROM="CONFIGFILE=\/etc\/privoxy\/config"
TO="CONFIGFILE=\/etc\/privoxy${i}\/config"
sed -i "s/$FROM/$TO/g" /etc/init.d/privoxy$i
echo "Запуск: tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword \"\" --ControlPort $c_port --PidFile tor$i.pid --SocksPort $s_port --DataDirectory ${BASE_DIR}/tor$i"
tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword "" --ControlPort $c_port --PidFile tor$i.pid --SocksPort $s_port --DataDirectory ${BASE_DIR}/tor$i
echo "Update RC"
update-rc.d privoxy$i defaults
systemctl daemon-reload
#Применяем изменения
/etc/init.d/privoxy$i restart
done
#для удобства выводим запущенные прокси в файл
netstat -4ln | grep $BASE_IP:80** | grep -Eo '10.{12}' > ./proxy_list.txt
;;
2)
#Обновляем сервисы если это нужно
echo "Обновляем потоки TOR\n"
for i in $(seq 1 ${INSTANCE});
do
c_port=$((TOR_CONTROL+i))
./tor_renew.exp $c_port
done
;;
3)
for i in $(seq 1 ${PID_END});
do
rm -r /etc/privoxy${i}
rm /etc/init.d/privoxy${i}
rm /usr/sbin/privoxy${i}
done
kill $(ps aux | grep -e 'tor' -e 'privoxy' | awk '{print $2}')
;;
esac
И скрипт обновления потока Tor через контрольный порт.
#!/usr/bin/expect -f
set port [lindex $argv 0]
spawn telnet 127.0.0.1 $port
expect "Escape character is '^]'."
send "AUTHENTICATE\r"
expect "250 OK"
send "signal NEWNYM\r"
expect "250 OK"
send "quit\r"
И не забудьте прикрутить мониторинг!
P.S. Использовать можно!
Комментарии (23)
Andrey_Volk
11.11.2016 14:33Довольно-таки простое решение, спасибо, схоронил!)
ValdikSS
11.11.2016 16:11+2Довольно топорное, некрасивое решение. Для запуска нескольких Tor достаточно было одного измененного systemd .service-файла с шаблоном, и можно было бы запускать как-то так:
Непонятно, зачем нужен privoxy, если Tor сам делает Socks5-прокси. Только если приложение не поддерживает Socks, наверное, но тогда удобней было бы использовать какой-нибудь «проксификатор», перехватывающий сетевые вызовы, вроде proxychains.systemctl start tor@1 systemctl start tor@2 …
И причем здесь хаб «Спам и антиспам»? Вероятно, такие задачи только у спамеров бывают.Scherbakov
11.11.2016 16:19Возможно Вам данная тема очень знакома. Были причины использования именно данной связки. Что то вообще не захотело работать. Я ваше решение посмотрю, как говорится, любое мнение бывает полезным. А хаб этот я добавил по сугубо тонким соображениям)
simpleadmin
11.11.2016 16:21Вероятно, такие задачи только у спамеров бывают.
Если к спамерам и парсерам добавить ddos'еров, то, пожалуй, получим полный перечень пользователей такого решения :)ValdikSS
11.11.2016 16:32DDoS через медленные публичные прокси будет делать только глупый, а через Tor — самый отчаявшийся человек, т.к. ему заблокируют доступ уже через несколько часов.
simpleadmin
11.11.2016 16:39Разумеется борьба с ними не составляет проблем, но при этом всём такие атаки наблюдаю раз в неделю минимум. Причиной именно бесплатность решения, которая нивелирует остальные недостатки.
Demogor
11.11.2016 14:44Хорошая статья, спасибо.
А еще тор вполне неплохо контролируется программно+есть готовые решения для http/s трафика поверх тора(по крайней мере, для шарпа и ноды делал такие штуки).
Еще есть небольшой фокус: сам тор поддерживает смену IP без перезапуска(под виндой управление осуществляется через телнет, на остальных ОС — не в курсе), но, если не ошибаюсь, есть ограничение в 15 секунд между сменой. Обходится простым перезапуском.Scherbakov
11.11.2016 14:50Все решения для Unix, которые я нашел, ведут к выполнению команд на контрольном порту. В любом случае можно ведь решить этот вопрос через cron
simpleadmin
11.11.2016 15:40+22. PRIVOXY для проксирования запросов (Можно взять nginx, varnish — я взял Privoxy)
Если парсится курлом, то это лишнее ресурсоёмкое звено. К tor'у можно напрямую цепляться через socks.
kumbr_87
11.11.2016 16:18+1Есть еще такая штука как Whonix, скачивается готовая виртуальная машина, запускается, на ПК адрес машины прописывается в качестве шлюза и всё :) Удобство такого решения — можно всю домашнюю сеть без труда направить через тор. Ну или мешок виртуальных машин занимающихся парсингом или еще чего :)
epicf4il
11.11.2016 18:35Если вы везде открывает ControlPort, то не надо ли включать аутентификацию для него? HashedControlPassword или CookieAuthentication.
## If you enable the controlport, be sure to enable one of these ## authentication methods, to prevent attackers from accessing it. #HashedControlPassword #CookieAuthentication
Scherbakov
11.11.2016 18:41Прослушивание только с внутреннего IP адреса. Думаю это лишнее
epicf4il
11.11.2016 22:02Печально будет, если будет скомпрометирован любой локальный хост, у которого есть доступ к управляющим портам tor.
Кстати, еще момент. Если ставить tor на Ubuntu, то лучше прописать официальные репы и добавить ключи, да бы получить последнюю стабильную версию. Для Debian вроде и так все должно быть ок, хотя репы и для него есть.
Rakshas
12.11.2016 16:48Можно сделать проще. Достаточно добавить в /etc/tor/torrc необходимое количество портов:
SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections.
SOCKSPort 9051
SOCKSPort 9052
SOCKSPort 9053
SOCKSPort 9054
…
Для балансировки использовать haproxy с директивой roundrobin:
…
frontend rotatingproxies
mode tcp
bind *:10101
default_backend torproxies
backend torproxies
mode tcp
balance roundrobin
server proxy1 127.0.0.1:9050
server proxy2 127.0.0.1:9051
server proxy3 127.0.0.1:9052
server proxy4 127.0.0.1:9053
server proxy5 127.0.0.1:9054
…
igor_suhorukov
Вас сервисы к которым вы обращаетесь не блокируют из-за обращения с IP узлов TOR?
Scherbakov
Блокируют, еще как))) А IP узлов TOR очень много! Поэтому в случае блокировки — обновляем IP и работаем дальше
igor_suhorukov
Тема дня на linkedin перед предстоящей блокировки сети по решению суда: «Как выгрузить ваши контакты, как научиться работать с прокси серверами и tor»
simpleadmin
Не так то их и много
$ grep -cF " Exit " consensus.z
914
из них прилично работающих процентов 30.
Scherbakov
Многие порталы специально не блокируют эти узлы что бы не потерять аудиторию