Xpoint
   [напомнить пароль]

Как заставить LWP работать через Socks proxy

Метки: [без меток]
[удл]
2005-02-27 05:53:23 [обр] Сергей Чернышев(0/589)[досье]

Передо мной встала задача - заставить скрипты на LWP ходить в интернет не напрямую, а через два десятка Socks-серверов таким образом чтобы каждый следующий запрос шел через новый Socks-сервер (chaining этих Socks-серверов мне НЕ нужен). Проблема еще утежеляется тем, что нужен Socks5 с авторизацией, но слегка облегчается тем, что в данный момент логины и пароли для всех серверов одинаковы.

LWP умеет работать с обычными HTTP Proxy, но не умеет работать через Socks - отсюда два варианта решения проблемы:

  1. Администраторский - найти HTTP-прокси, который сможет ходить через Socks и либо сама выбирать socks-сервер либо просить тот Socks сервер к которому она коннектится чтобы он дальше шел не на прямую, а через еще один Socks-сервер, который уже выбирался бы из списка.

HTTP-прокси, который бы мог ходить на разные Socks я не нашел, но [[http://www.privoxy.org/][Privoxy]] умеет ходить через фиксированый Socks4/4a (ну почему они не поддерживают Socks5?) прокси, а [[http://www.ufasoft.com/socks/][SocksChain]] умеет делать chaining проксей и вроде-бы выбирать конечную прокси из списка, но не умеет в базе проксей хранить логины и пароли к ним, хотя вроде бы Socks5 поддерживает.

  1. Второй вариант - Программистский - либо написать свой модуль Perl-а, который основан либо на Not::Socks либо IO::Socket::Socks и заменяет какой-либо из модулей в цепочке используемой LWP либо можно просто подправить какой-то из модулей чтобы он вместо обычного соединения использовал соединение через Socks (такой хак всего перла меня устроит на данном этапе - "супер стройное" решение мне пока что не нужно).

В данном варианте тоже все не просто ибо там много чего друг от друга наследуется и я никак не могу врубиться что нужно отнаследовать и изменить и где подменить текущий класс на своей, но скорее всего это либо IO::Socket либо IO::Socket::INET.

Есть еще один способ - написать на чем-то отдельном такую Socks проксю с нуля и не мучаться или же изменить Privoxy чтобы она сама имела всю эту функциональность, но это уже туго.

Буду рад если кто-нибудь поможет мне решить проблему либо первым "Администраторским" путем, подсказав из какого софта составить систему либо вторым "Программистским" путем, подсказав какие модули перла и как поправить.

Заранее благодарен за любую помощь.

спустя 12 минут [обр] Сергей Чернышев(0/589)[досье]

Да, что я пытался изменить в LWP - я скопировал LWP::Protocol::http в LWP::Protocol::SOCKSHTTP и заменил в нем:

    my $sock = $self->socket_class->new(PeerAddr => $host,
               PeerPort => $port,
               Proto    => 'tcp',
               Timeout  => $timeout,
               KeepAlive => !!$conn_cache,
               SendTE    => 1,
               $self->_extra_sock_opts($host, $port),
             );

на

    my $sock =  $self->socket_class->(
                ProxyAddr=>'my.socks.proxy.com',
               ProxyPort=>1080,

               AuthType=>'userpass',
               Username=>'myuser',
               Password=>'mypass',

               ConnectAddr=>$host,
               ConnectPort=>$port
            );

А в скрипте пишу:

require LWP::Protocol::SOCKSHTTP;
LWP::Protocol::implementor('http', 'LWP::Protocol::SOCKSHTTP');

Но скрипт ругается на то что мой сокет не поддерживает метод format_request, который описан в модуле Net::HTTP

Отсюда я делаю вывод, что отпочковываться нужно от этого самого Net::HTTP, но не понимаю как это по человечески сделать.

спустя 1 час 45 минут [обр] Сергей Чернышев(0/589)[досье]

Видимо XPoint действительно чудесный форум ибо после 3-х дневнего гемороя над проблемой запостил сюда вопрос и как только запостил, нашел модуль LWP::Protocol::http::SocketUnix, который я скопировал в LWP::Protocol::http::SocksBalancer, упростил (ибо нужно всего лишь сокет другой создать, а все остальное работает также как IO::Socket::INET) и все заработало. Есть кое-какие недоработки с обработкой специфических ошибок, но это, в общем-то не страшно ибо задача стоит сделать модуль для себя а не универсальный.

Как доработаю до приемлимого состояния - запощу сюда.

спустя 20 часов [обр] Дмитрий Котеров(27/912)[досье]
Может, лучше на CPAN? Возни, правда, много, но зато сразу куча народу сможет пользоваться.
спустя 39 минут [обр] Сергей Чернышев(0/589)[досье]

Дмитрий Котеров[досье]
На CPAN тоже, но скорее всего позже... а может и нет - в конце концов "release early release often" важнее чем полировка торпеды.

Нужно еще разобраться как на CPAN постят - никогда этого не делал.

спустя 1 час 18 минут [обр] Дмитрий Котеров(27/912)[досье]
Нужно еще разобраться как на CPAN постят
Я про это выжимку писал, вот: Публикация модулей на CPAN.
Всего пара страниц. Может, пригодится...
спустя 1 день 4 часа [обр] Сергей Чернышев(0/589)[досье]

Дмитрий Котеров[досье]
Спасибо - прочел. Вот только не уверен в том стоит ли постить - в том виде в котором модуль сейчас работает не дает достаточной производительности ибо IO::Socket::Socks от которого он наследует не позволяет делать несколько соединений через одно Socks-соединение, что требует каждый раз открывать соединение с Socks-сервером. Модуль же Net::SOCKS позволяет это делать нормально, но интегрировать его с LWP очень непросто ибо LWP работает на основе IO::Socket::INET и почковать легче в ту сторону. Не уверен что я пойду путем переписывания IO::Socket::Socks или написания своего модуля на основе Net::SOCKS - оба пути требуют куда больших знаний и времени чем у меня есть.

Что посоветуете? лучше запостить медленный модуль?

спустя 10 часов [обр] Дмитрий Котеров(27/912)[досье]

В отличие от PHP-шного PEAR, на котором сидит кучка снобов, не желающая принимать ничего от людей вне их замкнутой компании, в CPAN подход очень либеральный: какой бы код ни был, хороший ли, плохой ли, - его можно публиковать. В этом сила, и в этом одновременно и слабость. (Правда, PEAR, несмотря на свою "строгость", все равно сильно захламлен - только там это захламление идет под эгидой "наукообразия".)

С моей точки зрения, силы тут все же значительно больше. И лично мне этот модуль очень приходился бы - тем более, что аналогов на CPAN нет. Наконец, каждый сможет при желании модуль взять и доработать. По сему мой совет - постить однозначно, тем более, что это займет от силы час-два (с непривычки), а опыт даст очень полезный.

спустя 5 часов [обр] Сергей Чернышев(0/589)[досье]
Дмитрий Котеров[досье]
Ок. Запостю as-is, а там посмотрим.
спустя 20 дней [обр] Константин[досье]
Сергей Чернышев[досье]
У меня таже проблема, необходимо совместить LWP и SOCKS. Мне понятно что переделать надо модуль LWP::Protocol::http, а затем подключить этот "переделанный" модуль с помощью LWP::Protocol::implementor('http', 'LWP::Protocol::my_new_http'), Но что именно необходимо изменить, какие процедуры? Если Вам не трудно приведите пожалуйста фрагменты кода.
спустя 1 день 18 часов [обр] Сергей Чернышев(0/589)[досье]

Похоже, что пора мне постить в CPAN. Вот что я сделал на данный момент.

Вот в БЗ запостил: Использование Socks при работе с LWP

спустя 4 дня [обр] Закиров Руслан(51/343)[досье]
Еще вариант использовать http://tsocks.sourceforge.net/, на счет паролей не знаю, но эта библотека нормально работает у меня с SOCKS5 сервером.
спустя 16 часов [обр] Сергей Чернышев(0/589)[досье]
Закиров Руслан[досье]
Она прямо в перле это делает? Или в LWP ее встраивать легко?
спустя 3 часа 43 минуты [обр] Закиров Руслан(51/343)[досье]
Нет, это внешнее решение из разряда административных. Библиотека использует перехват системного вызова connect. Есть конфиг, где можно указать локальную сеть и внешнюю и/или настроить соединения по конкретным портам. Затем можно использовать два решения: запуск через програму оболчку или прописать библиотеку в LD_PRELOAD. Второе решение позволяет прозрачно решить вопросы недоступности любых сервисов, но доступных черех SOCKS прокси.
спустя 18 часов [обр] Сергей Чернышев(0/589)[досье]
Закиров Руслан[досье]
Давайте подойдем с другой стороны... оно под винды работать будет? думаю, что нет...
спустя 11 часов [обр] Закиров Руслан(51/343)[досье]

Сергей Чернышев[досье] Нет, не будет. Решение на перле - это безусловно хорошо. Когда увидел материал в XpW, то решил дополнить список возможных решений. Аналогичные решения есть и под Windows - это SocksCap или http://www.freeproxy.ru/ru/programs/hummingbird_socks.htm и возможно еще несколько.

Я только хотел предложить альтернативы, а теперь удаляюсь.

Powered by POEM™ Engine Copyright © 2002-2005