Использование Tor в качестве альтернативы proxy

Часто бывает необходимо использовать proxy для подмены IP-адресов при парсинге и т.д. Но бесплатные proxy только в мышеловке, а платные — не для нас. В качестве альтернативы, можно заюзать Tor. Единственный минус такого подхода — скорость ответа.


Идём сюда и читаем о Tor: ru.wikipedia.org/wiki/Tor

Для установки Tor для Lenny нужно выполнить команду:

apt-get install tor tor-geoipdb

После установки должен быть открыт 9050-ый порт. Для проверки создаём файлик test.php, с кодом:

<?php

function get($url,$proxy) { 
        $ch = curl_init();   
        curl_setopt($ch, CURLOPT_URL,$url); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208'); 
        curl_setopt($ch, CURLOPT_PROXY, "$proxy"); 
        $ss=curl_exec($ch); 
        curl_close($ch); 
        return $ss; 
} 



      $prox = 'ip_вашей_машины или localhost:9050';
      $a=get('internet.yandex.ru',$prox); 
      echo $a;

?>


Видно, что IP успешно подменился. Но остаётся при обновлении страницы. После прочтения манулов по Tor, выясняется, что им можно управлять. Для этого лезем в конфиг:

nano /etc/tor/torrc

И меняем следующее:

ControlPort 9051 — разрешаем управлять tor на порту 9051.
SocksListenAddress по умолчанию localhost — означает что tor принимает только соединения с localhost. Для «внешнего» доступа можно поставить 0 или перечислить хосты.

Перезапускаем tor:

/etc/init.d/tor restart

Если
netstat -na

даёт порты 9050 и 9051 в состоянии LISTENING — всё сделали верно.

Ну и теперь мы можем менять промежуточные звенья по принуждению по 9051 порту:

<?php
/**
 * Меняем звено tor
 **/
function tor_new_identity($tor_ip='127.0.0.1', $control_port='9051', $auth_code=''){
    $fp = fsockopen($tor_ip, $control_port, $errno, $errstr, 30);
    if (!$fp) return false; // не можем законнектицца на порт управления
 
    fputs($fp, "AUTHENTICATE $auth_code\r\n");
    $response = fread($fp, 1024);
    list($code, $text) = explode(' ', $response, 2);
    if ($code != '250') return false; 
 
    // шлём запрос на смену звена
    fputs($fp, "signal NEWNYM\r\n");
    $response = fread($fp, 1024);
    list($code, $text) = explode(' ', $response, 2);
    if ($code != '250') return false;
 
    fclose($fp);
    return true;
}


if (tor_new_identity('127.0.0.01', '9051')) {
  // здесь код получения странички через tor
}
?>


Enjoy!
Надеюсь кому-то будет полезно.
Tags:
tor, proxy, php

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.