Проксі-сервер з допомогою Tor. Основа для багатопотокового парсинга

Всім привіт! Днями прилетіла цікаве завдання: «Знайти безкоштовні проксі-сервера». Взявшись за неї, вирішив обійти всі сайти вільних проксі і зрозумів — дохлі… ну або з високим пінгом.

Після декількох годин безуспішних пошуків, було прийнято рішення використовувати свої ресурси!

Отже, що в результаті повинно вийти:

1. VM Ubuntu/Debian 2 CPU, 2GB RAM, 8GB HDD (ну тобто зовсім не вимоглива)
2. PRIVOXY для проксі серверів запитів (Можна взяти nginx, varnish — я взяв Privoxy)
3. TOR сервер

На своєму досвіді скажу, 70 проксі витрачають десь 30 мегабіт каналу. Нас цілком влаштувало. Можливо ваші ресурси будуть більш вимогливі до трафіку.

Першим ділом піднімаємо необхідні бібліотеки:

apt-get install tor privoxy

Надалі ми будемо клонувати скрипти tor і privoxy і запускати окремі служби тому первісна настройка не потрібна.

Установка позаду і приступимо до формування скрипта для автоматичного розгортання сервісу

Визначимо початкові вхідні параметри:

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

tor_privoxy_start.sh
#!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.0.0.1 #Зазначимо, за яким IP буде відбуватися коннект до нашого проксі. Це зручно якщо ця ж тачка буде відкрита в інтернет.
BASE_DIR=./data_tor #Каталог з PIDами TOR
BASE_DIR_PRIVOXY=/etc #Каталог з конфіг Privoxy, заміна на інший каталог повинна бути узгоджена з 64 і 65 рядком коду
INSTANCE=$1 #В скрипті передаємо кількість потрібних инстансов. Це зручно, якщо тобі не потрібно зараз 99 проксі

if [ ! -d $BASE_DIR ]; then
mkdir -p $BASE_DIR
fi

#Оновлюємо сервіси якщо це потрібно
if [ $2 -eq "update" ];
then
echo "Оновлюємо потоки TOR\n"
for i in $(seq $INSTANCE)
do
c_port=$((TOR_CONTROL+i))
./tor_renew.exp $c_port
done
exit 1
fi

#Запускаємо сервіси

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"
exit 1
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 -a ${BASE_DIR_PRIVOXY}/privoxy ${BASE_DIR_PRIVOXY}/privoxy$i #копіюємо конфігурацію з оригіналу 
#Заповнюємо конфігурацію
echo -e "forward-socks4a / 127.0.0.1:$s_port .\nconfdir ${BASE_DIR_PRIVOXY}/privoxy$i\nlogdir /var/log/privoxy$l\nlogfile privoxy${I}.log\nactionsfile default.action\nactionsfile user.action\nfilterfile default.filter\ndebug 4096\ndebug 8192\nlisten-address $BASE_IP:$p_port\ntoggle 1\nenable-remote-toggle 0\nenable-edit-actions 0\nenable-remote-http toggle 0\nbuffer-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

#Застосовуємо зміни
/etc/init.d/privoxy${i} restart
done

echo "Update RC"
update-rc.d defaults
systemctl daemon-reload

#для зручності виводимо запущені проксі в файл
netstat -4ln | grep 10.1.9.98:80** | grep -Eo '10.{12}' > ./proxy_list.txt


І скрипт оновлення потоку Tor через контрольний порт.

tor_renew.exp
#!/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. Використовувати можна!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.