PDA

Просмотр полной версии : pproxy - прокси на PHP


bons
24.11.2008, 20:54
Однажды мне понадобился прокси-сервер, работающий не как демон/служба а в контексте процесса веб-сервера. Подходящего не нашел поэтому написал свой, очень простой и достаточно юзабельный.

Описание

Состоит из двух частей. На удаленный веб-сервер заливается первая часть прокси, написанная на PHP - скрипт pproxy.php. На локалхосте запускается вторая часть прокси, реализованная на Perl (скрипт plocal.pl), которая прослушивает порт как HTTP-прокси. На этот локальный HTTP прокси настраивается, например, браузер.

Скрипты

pproxy.php - первая, удаленная часть прокси, на PHP:


<?php

//$secret = 'pproxypass';

if(isset($_POST['query']) && isset($_POST['host']))
{
if(isset($secret) && ($_POST['secret'] != $secret))exit;
header('Content-type: application/octet-stream');
@set_time_limit(0);
$query = base64_decode(str_replace(' ', '+', $_POST['query']));
list($host, $port) = explode(':', base64_decode($_POST['host']));
if(!$port)$port = 80;
$ip = gethostbyname($host);
if($fp = @fsockopen($ip, $port, $errno, $errstr, 20))
{
fwrite($fp, $query);
while(!feof($fp))
{
$answer = fread($fp, 1024);
echo $answer;
}
fclose($fp);
}
exit;
}
?>


plocal.pl - вторая, локальная часть прокси, на Perl:

use HTTP::Daemon;
use MIME::Base64 ();
use Getopt::Long;
use POSIX ":sys_wait_h";
use strict;

my $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';

my $errheader = "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 = $errheader . 'Could not connect to server';
my $errmsg2 = $errheader . 'Could not connect to pproxy';

my ($pproxyhost, $pproxyport, $pproxyurl);
my ($tunnelhost, $tunnelport);
my ($pproxy, $bindport, $tunnel, $secret);
my ($destaddr, $destport, $desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
"px=s" => \$pproxy,
"bp=s" => \$bindport,
"tpx=s" => \$tunnel,
"pwd=s" => \$secret
);
die "need pproxy.php url" unless $pproxy;


#Получение параметров
$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
$pproxyhost = $1; $pproxyport = substr($2, 1); $pproxyurl = '/' . $3;

defined($pproxyport) || ($pproxyport = 80);
defined($bindport) || ($bindport = 8008);

if(defined($tunnel))
{
$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
$tunnelhost = $1; $tunnelport = $2;

$destaddr = $tunnelhost;
$destport = $tunnelport;
$desturl = $pproxy;

print "# tunnelhost = $tunnelhost\n";
print "# tunnelport = $tunnelport\n";
}else{
$destaddr = $pproxyhost;
$destport = $pproxyport;
$desturl = $pproxyurl;
}

print "# pproxyhost = $pproxyhost\n";
print "# pproxyport = $pproxyport\n";
print "# pproxyurl = $pproxyurl\n";
print "# bindport = $bindport\n\n";

$|=1;
my %children;
my $slave;

#Прием подключений
my $master = HTTP::Daemon->new( LocalPort => $bindport,
LocalAddr => 'localhost',
Reuse=>1)
|| die "Can't start server ($@)";
&MainProc($slave) while $slave = $master->accept;

sub MainProc
{
my $conn = shift;

#Прием HTTP-запроса
my $request = $conn->get_request();

#Ответвление процесса(потока)
my $pid = fork();
unless(defined($pid))
{
print "# Erorr couldn't fork\n";
close $conn;
return;
}

if($pid)
{
close $conn;
$children{$pid}++;
foreach(keys %children )
{
my $kid = waitpid($_, &WNOHANG);
delete $children{$_} if($kid == -1 || $kid == $_);
}
return;
}

#Преобразование HTTP заголовка
$request -> remove_header('Proxy-Connection');
$request -> remove_header('Keep-Alive');
$request -> header(Connection=>'close');
my $host = $request -> header('Host');
my $http = $request -> as_string();
my $head_end = index ($http, "\x0A\x0A") + 2;
my $head = substr ($http, 0, $head_end);
my $post = substr ($http, $head_end);
$head =~ s/\x0A/\x0D\x0A/g;
$http = $head . $post;
$http =~ s/http:\/\/$host//;
my $time_start = time;

#Отправка запроса прокси и прием результата
SendToPProxy( MIME::Base64::encode($host),
MIME::Base64::encode($http),
$conn
);

my $time_end = time;

#Лог
print &TranslateTimeHour($time_end), " ", $host,
" (", &TranslateTime($time_end - $time_start),
")\n";

close $conn;
exit;
}

sub SendToPProxy
{
my $dest_host = shift;
my $query_content = shift;
my $clientsock = shift;

my $proxysock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);
unless($proxysock)
{
syswrite($clientsock, $errmsg2, length($errmsg2));
return;
}

my $post_query;
$post_query = 'secret=' . $secret . '&' if defined($secret);
$post_query .= 'host=' . $dest_host . '&query=' . $query_content;
my $postlen = length($post_query);

my $request = "POST $desturl HTTP/1.0\x0D\x0A".
"Host: $pproxyhost:$pproxyport\x0D\x0A".
"Accept: */*\x0D\x0A".
"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
"Content-Length: $postlen\x0D\x0A".
"User-Agent: $user_agent\x0D\x0A".
"Connection: close\x0D\x0A\x0D\x0A" . $post_query;

syswrite($proxysock, $request, length($request));
my ($result, $buffer, $response);
my $contentstart = -1;
my $count = 0;
while(1)
{
$result = sysread($proxysock, $buffer, 1024);
last if !defined($result) || !$result;

if($contentstart == -1)
{
$response .= $buffer;
last if length($response)>65535;
$contentstart = index($response,"\x0D\x0A\x0D\x0A");
next if $contentstart == -1;
$buffer = substr($response, $contentstart+4);
}
$count += length($buffer);
syswrite($clientsock, $buffer, length($buffer));
}
syswrite($clientsock, $errmsg1, length($errmsg1)) if $count == 0;
close $proxysock;
}

sub TranslateTime
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u", $min, $sec;
}

sub TranslateTimeHour
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u:%02u", $hour, $min, $sec;
}

sub Usage
{
print "Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret]\n";
print "Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
print " $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
print " $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
print "\nDefault bind port - 8008\n";
exit;
}


Использование прокси

Допустим адрес pproxy.php будет http://site.com/proxy/pproxy.php
Тогда локальный скрипт запускается так:
perl plocal.pl -px http://site.com/proxy/pproxy.php
По умолчанию открывается порт 8008


Построение цепочки прокси

Для примера случай с двумя элементами цепочки.
Есть два веб-сервера с двумя скриптами pproxy:
http://site1.com/proxy/pproxy.php и
http://site2.com/proxy/pproxy.php

Локальный скрипт запускается два раза с такими параметрами:

perl plocal.pl -px http://site1.com/proxy/pproxy.php
perl plocal.pl -px http://site2.com/proxy/pproxy.php -tpx http://localhost:8008 -bp 8009

Браузер следует настроить на 8009 порт и трафик пойдет по такой цепочке:
localhost -> site1.com -> site2.com -> target

Думаю, несложно будет настроить и на более длинную цепочку.

Запуск через Tor

Если вы используете Tor вместе с Privoxy (по умолчанию на порту 8118)
тогда прокси запускается так:
perl plocal.pl -px http://site.com/proxy/pproxy.php -tpx http://localhost:8118
Соответственно http://site.com/proxy/pproxy.php - адрес PHP-прокси
К сожалению, через Tor некоторые сайты могут загружаться некорректно,
причины пока неизвестны.

Установка пароля

В pproxy.php раскомментировать строчку,
написать там свой пароль

$secret = 'pproxypass';

в параметрах запуска plocal.pl указать его же.
perl plocal.pl -px http://site.com/proxy/pproxy.php -pwd pproxypass

Примечания

1. Если вы хотите в качестве элемента цепочки узел SOCKS, то Privoxy поможет вам (см пример с Tor)
2. pproxy.php очень компактен и легко может быть внедрен в код сайта,
Возможно это немного повысит ваш уровень анонимности.
3. Не стоит забывать что веб-серверы ведут логи и восстановить истинный источник нетрудно даже по цепочке;)
4. Альтернативный клиент(Delphi/Pascal) с открытым исходным кодом доступен тут http://dump.ru/file/3320224

Спасибо за совет: b3, AkyHa_MaTaTa

DVD_RW
27.11.2008, 13:36
эм...а прокси хттп\с или сокс?

nerezus
27.11.2008, 14:11
http
Перенес в избранное. кстати.

KemSucks
27.11.2008, 23:50
может как нить на https прикрутить можно?

bons
28.11.2008, 15:46
нет, HTTPS тут реализовать почти невозможно. HTTPS прокси - он как и сокс основан на постоянном соединении и непрерывном обмене данными. А здесь, как видишь, обмен данными сводится к отсылке HTTP-запроса браузера и получению результата.

jumperby
28.11.2008, 22:57
А оградить это дело от чужих глаз можно как-то? логин:пасс какой-нибудь.
Связка ActivePerl + Opera 9.62 + Proxy, дает в результате тормоза, не в курсе как это можно исправить?
хттпс идет как я понял не через проксик, а через впн?

b3
29.11.2008, 05:32
1. Понятно, что время соединения через такой прокси ограничено максимальным временем выполнения скрипта.
Обычно 30 секунд или 1 минута, это зависит от настроек в php.ini
допиши в начало кода РНР, строки:
set_time_limit(0);
ignore_user_abort();
Время выполнения - неограничено. Скрипт не останавливаеться после дисконекта клиента.

bons
29.11.2008, 16:10
дописал set_time_limit(0);
добавил авторизацию в самом простом виде.

jumperby
30.11.2008, 01:26
Подскажите пожалуйста, почему ActivePerl 5.10 так жестко начинает жрать память через минуту юзания проксика, заодно начинает жрать и браузер (опера и файрфокс, ведут себя одинаково). Как это исправить?
п.с. выкиньте с фиксом версию (сет тайм лимит + авторизация)

bons
30.11.2008, 14:58
да, память и процессорное время оно ест немилосердно, это расплата за небольшой размер скрипта.
Если слабая машина то могу предложить
1. Снизь приоритет выполнения процесса, это можно сделать в диспетчере задач. (процесс perl.exe)
2. Отключи многопоточность, тогда запросы будут выполняться последовательно и не так загружать процессор.

закомментируй эти строчки
...
#my $pid = fork();
#unless(defined($pid))
#{
# print "# Erorr couldn't fork\n";
# close $conn;
# return;
#}

#if($pid)
#{
# close $conn;
# $children{$pid}++;
# foreach(keys %children )
# {
# my $kid = waitpid($_, &WNOHANG);
# delete $children{$_} if($kid == -1 || $kid == $_);
# }
# return;
#}
...

и еще команду exit:

...
close $conn;
#exit;
}
...

c0m
12.12.2008, 22:35
так, а если залью скрипт в индекс сайта, по идее тяжело будет отпределить кто через них лазел и куда заходил?

bons
13.12.2008, 14:03
в логах апача будет сохранен факт обращения к скрипту с твоего айпи и скорее всего User_Agent перла (User-Agent впрочем можно сменить)
То, куда ты обращался через этот скрипт возможно будет сохранено в логах файрволла сервера, это зависит от его настроек.

jumperby
13.12.2008, 14:27
Нашел себе счастье, спешу поделиться.
HTTPTunnel
Enables tunneling of network connections through restrictive HTTP proxies. Features: Portmapping, SOCKS4, SOCKS5, web-based admin interface, possibility to use standalone server (perl) or hosted server (PHP), optional authorization from LDAP or MySQL
На машине должен быть перл, на серваке можно через перл и обычный пхп. Все очень шустро работает, кучи возможностей:
Portmapping, SOCKS4, SOCKS5, веб-админка, авторизация с мускула или ldap.
http://sourceforge.net/projects/http-tunnel/
Все шустро работает и носки есть :) После ппрокси как-будто в летающую тарелку сел...
п.с. искал в чем трабл этого скрипта (ппрокси), вроде как в том что use много используется

i-Worm.Fizzer
13.12.2008, 15:22
Хостинг провайдер может как-то запалить, что я использую проксик, через него ?

Shaitan-Devil
13.12.2008, 18:08
Хостинг провайдер может как-то запалить, что я использую проксик, через него ?
Да.Большинство хостингов отключают внешние соеденения,а те которые разрешают все быстро палят.

DIAgen
13.12.2008, 18:49
Только есть маленький не достаток, пока perl не загрузит полность весь фаил он его не выдаст, и из-за этого такие тупки, кто знает к это можно исправить? (:

preda1or
13.12.2008, 18:52
DIAgen могу предположить, только, сорри если не прав
в php есть команда flush...
в перле нет аналогов?

bons
13.12.2008, 19:59
разве что переписать весь код, написаный с LWP на сокеты. Как время будет, может сделаю...

Isis
13.12.2008, 23:02
Почему ssl & socks нельзя?
Curl можно использовать

bons
14.12.2008, 00:55
SOCKS здесь вряд ли возможен исходя из самого механизма обращения к прокси.
То есть алгоритм такой:
1. perl-скрипт принимает HTTP-запрос и передает POST-параметром к php-скрипту
2. PHP-скрипт принимает POST-параметр и с помощью сокетов посылает целевому серверу, все что вернул ему сервер отправляет назад perl-скрипту

для реализации обычного HTTP-запроса этого достаточно. Но SOCKS предусматривает создание постоянного канала, то есть многократный прием и передачу данных. А как передавать данные скрипту второй раз? При таком подходе это невозможно!
HTTPS прокси или HTTP CONNECT прокси по сути тот же SOCKS-прокси, так как для подключения к HTTPS нужен сложный протокол - передача сертификатов и т.д.

Но если цель не создание полноценного HTTPS-прокси а например просто зайти через прокси на сайт, расположенный на https то все же можно например придумать следующий алгоритм:
1. perl-скрипт принимает запрос как HTTP-прокси (!) и передает его POST-параметром PHP-скрипту
2. PHP-скрипт с помощью curl посылает этот запрос целевому серверу и т.д.

в теории это возможно, но при этом возникает некоторые проблемы:
- как браузер будет сообщать perl-скрипту что целевой хост именно на https а не на http
- на сервере с PHP-прокси будет возникать проблемы c памятью - ведь PHP-скрипту необходмо сначала полностью принять результат и только потом он сможет передать результат и освободить занятую память. (подобно проблемам с памятью в текущей версии perl-скрипта)

Плюс еще не на каждом сервере curl доступен

P.S. Посмотрел исходник HTTPTunnel. Можно использовать IPC, тогда все проблемы сразу решаются...

nerezus
14.12.2008, 13:43
Да.Большинство хостингов отключают внешние соеденения Поправка: бесплатные хостинги.

Платные никогда не отключают, т.к. сабж нужен большинству пользователей, которых им не хотелось бы терять.

Shaitan-Devil
14.12.2008, 17:13
Поправка: бесплатные хостинги.

Платные никогда не отключают, т.к. сабж нужен большинству пользователей, которых им не хотелось бы терять.
Да.Но лучше всего ставить прокси на шелл.Т.к. в случае чего хостинги отдадут логи компетентным органам.

bons
14.12.2008, 17:35
обновил plocal.pl, теперь LWP не используется.
Файл отдается клиенту по мере загрузки, т.е. памяти расходуется меньше.
Старую версию можно найти здесь: http://slil.ru/26436538

zic
25.12.2008, 19:02
Здравствуйте, а не подскажете как можно оптимизировать клиентскую часть, а именно plocal.pl чтоб была возможность хождения через прокси?

Ситуация следующая на работе закрыты все порты кроме 80, 21, 443, Интернет раздаётся через ISA-2007.... вот и есть нужда её обойти... ранеше делали тунель через SSH но по некоторым причинам перестали использовать.... так вот ближе к теме как сделать так чтоб клиенская часть ходили через местную проксю? ибо хоть и есть default getwey но там только 21 порт открыт....

Очень расчитываю на вашу помощь.... за ранее спасибо!

bons
25.12.2008, 22:39
могу посоветовать NTLM Authorization Proxy Server (написан на python)
например если настроить его на порт 5865 локалхоста то plocal надо запускать так:
perl plocal.pl -px http://site.com/pproxy.php -tpx http://localhost:5865

скачать:
http://sourceforge.net/projects/ntlmaps/
мануал по его настройке тут:
http://www.linux.com/base/ldp/howto/Web-Browsing-Behind-ISA-Server-HOWTO-4.html

zic
26.12.2008, 12:29
могу посоветовать NTLM Authorization Proxy Server (написан на python)
например если настроить его на порт 5865 локалхоста то plocal надо запускать так:
perl plocal.pl -px http://site.com/pproxy.php -tpx http://localhost:5865

скачать:
http://sourceforge.net/projects/ntlmaps/
мануал по его настройке тут:
http://www.linux.com/base/ldp/howto/Web-Browsing-Behind-ISA-Server-HOWTO-4.html

Огромное тебе спасибо, за твои старания, перенёс всё это на linux(CentOS 5.2) единственное пришлось обновить Phyton, всё заработало..... ещё раз огромное спасибо!!!


P.S. А вот не мог бы ты ещё вот с какой вещью помоч, на linux'е реальзовал всё отлично работает, а вот как теперь сделать чтобы XP WORKSTATIONS могли ходить через linux по 8008 порту....

Ну грубо говоря чтоб была такая схема comp1(XP)->comp2(Linux, proxy 172.29.5.100:8008)->target

Или к примеру QIP настроенный на proxy HTTP 172.29.5.100:8008

Просто такое подозрение что никсовая машина не пускает к себе....

bons
26.12.2008, 20:02
Для того чтобы plocal.pl разрешал подключение к себе не только с локалхоста надо удалить в нем строчку, отмеченную красным:
...
my $master = HTTP::Daemon->new( LocalPort => $bindport,
LocalAddr => 'localhost',
Reuse=>1)
|| die "Can't start server ($@)";
...

Но QIP запустить через pproxy не получится так как для него необходим HTTPS прокси, поддержки которого пока нет.

m0Hze
28.12.2008, 04:40
Кто подскажет как заюзать HTTPTUnnel? Чтото ниразберусь я никак :)

m0Hze
30.12.2008, 04:01
В общем,смог запустить прокси,автору респектище гиганское!
Но вот вопрос: Я в уторренте прописываю прокси, localhost 8008бв порт для кача,че писать? Свой открытый порт,или порт сервера?Чтото совсем не качацо :(
Помогите пжалста..

Spyder
31.12.2008, 04:59
если есть возможность - лучше переписать локальный скрипт на использование потоков, а не форков, производительность повысится

bons
01.01.2009, 19:15
Но вот вопрос: Я в уторренте прописываю прокси, localhost 8008бв порт для кача,че писать? Свой открытый порт,или порт сервера?Чтото совсем не качацо
торрент-клиенту нужен HTTPS прокси

если есть возможность - лучше переписать локальный скрипт на использование потоков, а не форков, производительность повысится
для тестов делал версию с модулем threads но ощутимого прироста производительности это не дало плюс еще скрипт стал иногда вылетать. Тем более для windows например эмуляция fork сводится к созданию потока причем не факт что это медленнее или занимает больше ресурсов чем через threads
вот версия с потоками - http://slil.ru/26500515

DVD_RW
02.01.2009, 16:04
а у мну траблы с кодировкой... %)

bons
03.01.2009, 13:13
а у мну траблы с кодировкой... %)
попробуй дописать в pproxy.php строку:
<?php

//$secret = 'pproxypass';

if(isset($_POST['query']) && isset($_POST['host']))
{
header('Content-type: application/octet-stream');
...

если это не поможет то дай пожалуйста больше информации о проблеме: как выглядит заголовок ответа веб-сервера с pproxy, в какой кодировке приходит страница, каким браузером пользуешься

m0Hze
03.01.2009, 18:16
bons, можно тебя спросить,когда ты будеш свободен и смогеш сделать сокс4-5 сервер,или хттпс.В общем чтоб с торентов качать можно было 8) А то я убился уже весь..сам скрипт смтрел,но никогда не работал с проксями,поэтому боюсь чтонибудь намудитьтам....воть.

bons
03.01.2009, 22:56
когда будет время напишу версию pproxy для SOCKS.
Но m0Hze, ты уверен что в твоем случае нужно именно туннелирование через HTTP? Ведь это необходимо если файрволл запрещает открыть порт для прослушивания на сервере, а иначе подойдет обычный прокси, например 3proxy.

m0Hze
03.01.2009, 23:02
Знаеш в чем вся проблема?) Я не знаю как настроить этот гребаный 3прокси на Фряхе.Совсем не знаю.На офф сайте етсть инструкция для настройки под меломягкую,а про никсы - ни слова. :)
Если ты можеш объяснить как настроить - то я с удовольствием приму твои советы.
Но всеже для меня былобы безопаснее юхать тунелирование,так как меньшее палево на мой взгляд.Как никак,сервер Провайдера, :)))).....

bons
03.01.2009, 23:21
в Сети полно манов по по этому случаю
допустим 3proxy-0.5.3k.tgz - архив с 3proxy

распаковываешь и компилишь:
tar xvf 3proxy-0.5.3k.tgz
make -f Makefile.unix
cd src
создаешь папке src файл proxy.cfg с содержимым
socks -p55554
запускаешь 3proxy фоновым процессом:
./3proxy proxy.cfg >/dev/null &

все файлы кроме 3proxy и proxy.cfg можно удалить, а эти лучше бы назвать по-другому

m0Hze
03.01.2009, 23:37
Один глупый вопрос =)
Получиться сокс5 или 4? коннект по 55554 порту?

bons
03.01.2009, 23:44
3proxy будет принимать подключения клиентов и 4-ой и 5-ой версий. По 55554 порту

Joker-jar
05.01.2009, 18:25
Интересная тема. Тоже как-то делал такое. Прокси был на php, локальный туннель - на Delphi. Только у меня основной задачей было сжатие трафика. Использовал gzip. Для браузеров прозрачно, даже распаковывать не надо. В туннеле настраивалось качество картинок (если надо, прокси сжимал и их, понижая качество). Вместо swf подсовывалась заготовленная флэшка с надписью "BLOCKED BY PROXY". Да, еще прокси в хидерах передавал реальный и сжатый размер страницы, чтобы клиент мог вести статистику экономии. Это я так, может захочешь что-то подобное сделать

AkyHa_MaTaTa
09.01.2009, 14:53
Да, класная вешь, афтору респект, вот если бы была возможность запускать socks - вообше бы цены не было.

Nightmarе
09.01.2009, 15:16
И возможно ли локальный перловый скрипт перевести в код Delphi ???

geezer.code
09.01.2009, 15:18
И возможно ли локальный перловый скрипт перевести в код Delphi ???
в данный момент переношу на .NET

Nightmarе
10.01.2009, 02:06
perl plocal.pl -px http://site1.com/proxy/pproxy.php
perl plocal.pl -px http://site2.com/proxy/pproxy.php -tpx http://localhost:8008 -bp 8009

Ну тут кое у кого вопрос возник... Судя по этому коду коннект идёт на site1.com, а следом на site2.com, то есть наш локалхост выступает связывающим звеном этих двух сайтов, или это не так???
Поправьте меня если не прав, но кажется наш айпишник палится не только на site1.com как должно быть, а так-же и на site2.com

Второй вопрос, командную строку придётся дважды запускать? В одной первый запрос, а во второй другой запрос.

AkyHa_MaTaTa
10.01.2009, 02:13
perl plocal.pl -px http://site1.com/proxy/pproxy.php
perl plocal.pl -px http://site2.com/proxy/pproxy.php -tpx http://localhost:8008 -bp 8009

Ну тут кое у кого вопрос возник... Судя по этому коду коннект идёт на site1.com, а следом на site2.com, то есть наш локалхост выступает связывающим звеном этих двух сайтов, или это не так???
Поправьте меня если не прав, но кажется наш айпишник палится не только на site1.com как должно быть, а так-же и на site2.com

Самый тупой вариант - проснифать что куды идет.
Меня поразила одна вешь при отключеном js как то палиться мой USER AGENT, так и должно быть?

m0Hze
10.01.2009, 02:24
perl plocal.pl -px http://site1.com/proxy/pproxy.php
perl plocal.pl -px http://site2.com/proxy/pproxy.php -tpx http://localhost:8008 -bp 8009

Ну тут кое у кого вопрос возник... Судя по этому коду коннект идёт на site1.com, а следом на site2.com, то есть наш локалхост выступает связывающим звеном этих двух сайтов, или это не так???
Поправьте меня если не прав, но кажется наш айпишник палится не только на site1.com как должно быть, а так-же и на site2.com

Второй вопрос, командную строку придётся дважды запускать? В одной первый запрос, а во второй другой запрос.

Нет,твой ип палиться только на первом хосте,на 2 ип 1,на 3 ип 2, и т.д.
Цепочка.Да кстате,окошко не нужно 2 открывать.Ты в 1 окно вписывай сразу команду нужную,и всоооо

Nightmarе
10.01.2009, 03:10
Самый тупой вариант - проснифать что куды идет.
Меня поразила одна вешь при отключеном js как то палиться мой USER AGENT, так и должно быть?
Так я пожалуй и сделаю для проверки, посмотрю апачевые логи и выясню что к чему.

Насчёт USER AGENT в перловом скрипте сделанна штука подделный USER AGENT, которая лично у меня так-же не работает, но лично мне в ней всё равно смысла нету, так как я юзаю Proxymitron

Nightmarе
10.01.2009, 03:39
Таак проверил, действительно всё чисто, траффиг идёт как и положенно и + "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4" - это появляется исключительно в апачевых логах, при сёрфинге высвечивается реальный юзер агент...

AkyHa_MaTaTa
10.01.2009, 04:15
"Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4" - это появляется исключительно в апачевых логах, при сёрфинге высвечивается реальный юзер агент...
по всей видимости передаеться 2 user agenta последний из которых реальный, поэтому "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4" игнорируеться, хотя это только предположения.

AkyHa_MaTaTa
10.01.2009, 04:32
не, передаеться реальный USER AGENT:


print &TranslateTimeHour($time_end), " ", $host,
" (", &TranslateTime($time_end - $time_start),
")\n", $http;

bons
10.01.2009, 15:56
Таак проверил, действительно всё чисто, траффиг идёт как и положенно и + "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4" - это появляется исключительно в апачевых логах, при сёрфинге высвечивается реальный юзер агент...
да, в логах веб-сервера где лежит pproxy будет User-Agent указанный в перловом скрипте.
my $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';
В логах целевого веб-сервера, к которому идет запрос, останется User-Agent браузера без изменений. Изменить его можно например с помощью плагинa для firefox (Modify Headers).
Также легко изменить User-Agent браузера дописав в plocal.pl одну строчку после комментария "#Преобразование HTTP заголовка":
$request -> header('User-Agent' => 'Opera/9.62 (X11; Linux i686; U; ru) Presto/2.1.1');
в таком случае для веб-сервера который используется как прокси это будет firefox а для целевого веб-сервера - opera. Но если так сделать при использовании цепочки то это будет opera для всех элементов цепочки кроме первого.

AkyHa_MaTaTa
10.01.2009, 16:07
Сенкс, я уже догнал, еше бы подержку ssl(https) вообше было бы класс, для этого как я понял нужно включить поддержку носков, извините что повторяюсь :) .

Nightmarе
10.01.2009, 18:13
Насчёт юзер агента, ну лично для меня не проблема сменить.

Единственная проблемма - сильные тормоза, но судя по всему это из за самого перла, а не скрипта.
Скажем так, если бы нашлись интузиасты которые переписали бы клиент ну например под делфи, он будет лучше работать в плане производительности???

А насчёт скорости, у меня лично имеется 3 хоста в разных странах, через них идёт весь трафф, скорость нормальная, проблемм никаких тут нету.

bons
10.01.2009, 19:17
Напишу локальную часть скрипта на С или паскале но вряд ли смогу взяться за это раньше чем через пару недель. То же самое и про SOCKS версию.

Nightmarе
10.01.2009, 19:21
Замечательно, но если бы нашлись интузиасты, кто на делфи перегнал бы и выложил исходный код, вообще улёт был бы...

AkyHa_MaTaTa
11.01.2009, 01:11
кстати в пхп сервере можно и увеличить было бы время отводимое на конект, на некоторых серваках оно по дефолту так сказать не большое и связь просто режеться:



if($fp = fsockopen($ip, $port,$errno, $errstr, 30))

Nightmarе
11.01.2009, 10:43
Хотелось бы немного поговорить про конфиденциальность данных.
Можно ли сделать шифровку данных между перловым клиентом и phpшным сервером?
Ну, например что-то типа Base 64 с открытым ключом.

То есть, чтобы был такой алгоритм, клиент получает от пользователя запрос, шифрует его особым алгоритмом (лучший вариант это конечно открытый ключ), передаёт зашифрованный текст серверу, сервер расшифровывает текст и обрабатывает, затем обработанный запрос шифрует по тому-же алгоритму, и переправляет обратно клиенту.

Nightmarе
11.01.2009, 14:36
И ещё, по каким то причинам не пашут некоторые сайты, например vpleer.ru и мой shinobi.org.ru, вероятне всего это связанно с ява скриптом.... Тока суть проблеммы выяснить не удалось...

AkyHa_MaTaTa
11.01.2009, 17:14
Хотелось бы немного поговорить про конфиденциальность данных.
Можно ли сделать шифровку данных между перловым клиентом и phpшным сервером?
Ну, например что-то типа Base 64 с открытым ключом.

То есть, чтобы был такой алгоритм, клиент получает от пользователя запрос, шифрует его особым алгоритмом (лучший вариант это конечно открытый ключ), передаёт зашифрованный текст серверу, сервер расшифровывает текст и обрабатывает, затем обработанный запрос шифрует по тому-же алгоритму, и переправляет обратно клиенту.
Вроде ды передоваемые данные идут в base64_encode, если писать какой то алгоритм шифровки с помошью ключа то это соответсвенно уменьшит быстродействие.
По поводу vpleer.ru и мой shinobi.org.ru - то у меня они грузяться нормально(и работают), наверно какие то траблы у тебя с сервером где лежит скрипт-сервер на пхп.

Nightmarе
11.01.2009, 17:23
По поводу быстродействия ну это естественно, хотя честно говоря не должно быть так уж сложно, зашифровать\расшифровать много ресурсов не жрёт, а текст увеличится где то на 30%

По поводу этих 2 сайтов, у меня в общей сложности 8 хостов в разных местах, и всё одно и тоже... понять не могу в чём же дело...
Только сейчас на каждом из них тестировал.


ЗЫ: ещё частенько вылетает "504 Gateway Time-out" когда страница долго не грузится...

needDrivers
02.02.2009, 17:04
Напишу локальную часть скрипта на С или паскале но вряд ли смогу взяться за это раньше чем через пару недель.

Уже всё давно написано - proxy_rd.

needDrivers
03.02.2009, 17:52
Для работы с pproxy.php через proxy_rd вот такой конфигурационный скрипт подходит

function proxy_rd(...)
{
char *header;
char *header2;
char *temp;
char *temp2;
char *post;

header = NULL;
header2 = NULL;
post = NULL;

*rdhost = dup("localhost");
//*rdport = dup("3129");

add(&header2, "POST http://localhost/lab/pproxy.php HTTP/1.0\r\n");
add(&header2, "Host: localhost\r\n");
//add(&header2, "Proxy-Connection: close\r\n");
add(&header2, "Connection: close\r\n");
add(&header2, "Content-Type: application/x-www-form-urlencoded\r\n");

add(&header, method);
add(&header, " ");
add(&header, uri_relative);
add(&header, " ");
add(&header, protocol);
add(&header, "\r\n");

add(&header, "Connection: close\r\n");

if(!isempty(h_host_port))
{
add(&header, "Host: ");
add(&header, h_host_port);
add(&header, "\r\n");
}

if(!isempty(h_cache_control))
{
add(&header, "Cache-Control: ");
add(&header, h_cache_control);
add(&header, "\r\n");
}

if(!isempty(h_pragma))
{
add(&header, "Pragma: ");
add(&header, h_pragma);
add(&header, "\r\n");
}

if(!isempty(h_accept))
{
add(&header, "Accept: ");
add(&header, h_accept);
add(&header, "\r\n");
}

if(!isempty(h_accept_lang))
{
add(&header, "Accept-Language: ");
add(&header, h_accept_lang);
add(&header, "\r\n");
}

if(!isempty(h_accept_charset))
{
add(&header, "Accept-Charset: ");
add(&header, h_accept_charset);
add(&header, "\r\n");
}

if(!isempty(h_if_mod_since))
{
add(&header, "If-Modified-Since: ");
add(&header, h_if_mod_since);
add(&header, "\r\n");
}

if(!isempty(h_if_none_match))
{
add(&header, "If-None-Match: ");
add(&header, h_if_none_match);
add(&header, "\r\n");
}

if(!isempty(h_referer))
{
add(&header, "Referer: ");
add(&header, h_referer);
add(&header, "\r\n");
}

if(!isempty(h_user_agent))
{
add(&header, "User-Agent: ");
add(&header, h_user_agent);
add(&header, "\r\n");
}

if(!isempty(h_authorization))
{
add(&header, "Authorization: ");
add(&header, h_authorization);
add(&header, "\r\n");
}

if(!isempty(h_range))
{
add(&header, "Range: ");
add(&header, h_range);
add(&header, "\r\n");
}

if(!isempty(h_content_type))
{
add(&header, "Content-Type: ");
add(&header, h_content_type);
add(&header, "\r\n");
}

if(!isempty(h_content_length))
{
add(&header, "Content-Length: ");
add(&header, h_content_length);
add(&header, "\r\n");
}

if(!isempty(h_cookie))
{
add(&header, "Cookie: ");
add(&header, h_cookie);
add(&header, "\r\n");
}

add(&header, h_unknown);

add(&header, "\r\n");

add(&post, "host=");
temp = dup(host);
add(&temp, ":");
add(&temp, isempty(port)?"80":port);
temp2 = encode(temp);
add(&post, temp2);
free(temp);
free(temp2);
add(&post, "&query=");
temp = encode(header);
add(&post, temp);
free(header);
free(temp);

add(&header2, "Content-Length: ");
temp = dupn(strlen(post));
add(&header2, temp);
free(temp);
add(&header2, "\r\n\r\n");

add(&header2, post);

free(post);

//msg("debug message", header);

return header2;
}

Nightmarе
03.02.2009, 18:48
С нетерпением ждём, когда для работы с pproxy.php будут исходники на делфи!!!!!!!!!! :)

zic
03.02.2009, 19:52
жду поддержку https... очень жду....

vadim2
07.02.2009, 20:42
Bons, когда будет версия с поддержкой https ? Уже заждался :( . Напиши плиз.

needDrivers
07.02.2009, 21:14
Интересно, как ты себе представляешь HTTPS через HTTP?
Ты хотя бы понимаешь как работают данные протоколы?

needDrivers
07.02.2009, 21:29
Выложил последнюю версию proxy_rd.
Для скачивания будет доступна до 20 февраля.
http://www.pfzim.ru/download.php?id=9

bons
07.02.2009, 23:02
Bons, когда будет версия с поддержкой https ? Уже заждался :( . Напиши плиз.
про https ничего не могу сказать, т.к изначально писал SOCKS-версию, которая почти готова. Там надо исправить пару багов (не знаю сколько времени на это уйдет) и тщательно протестировать. Если сильно нужно могу скинуть альфу, которая более или менее работоспособна.
Почему бы тебе не заюзать альтернативы например HTTPTunnel, в любом случае функционала там больше.

pproxy, изменено:
увеличен таймаут коннекта к серверу (см тут (https://forum.antichat.ru/showpost.php?p=1050660&postcount=67))
тип данных от прокси теперь application/octet-stream (см тут (https://forum.antichat.ru/showpost.php?p=1032512&postcount=41l))
исправлен баг связанный с неправильным приемом данных в plocal.pl в случае фрагментации http заголовка ответа от pproxy

Banderos_Russia
08.02.2009, 11:05
у меня просто белые страницы отображаются, в чем может быть дело? в исходниках первого поста ничего не менял

vadim2
08.02.2009, 11:59
Я попутал, хотел написать socks :) . Извиняюсь что ввёл в заблуждение :) . Автор скинь альфу.

bons
08.02.2009, 12:17
у меня просто белые страницы отображаются, в чем может быть дело? в исходниках первого поста ничего не менял
значит pproxy.php не может установить соединение с сервером.

добавил в plocal.pl вывод сообщений об ошибках

Я попутал, хотел написать socks . Извиняюсь что ввёл в заблуждение . Автор скинь альфу.
скинул в личку

idTalis
09.02.2009, 20:39
Щас тестировал на трёх серваках
Залил на первый хост, действую по инструкции, в браузере ввожу полученный прокси, перехожу на любую ссылку и на дисплее пару картинок, предложение создать свой сайт, вообщем это сообщение от хостера на котором висит pproxy
Ну решил я что проблемма в хосте, залил pproxy на другой хост, включаю прокси, перехожу на любую страницу и открывается PHP info сайта на котором я повесил pproxy
Попытка номер 3, залил я pproxy на третий хост, включил прокси, перехожу на любую страницу и мне выдаёт:
Your IP Address: *сдесь написан мой IP*

Remote Host:
это происходит если конектюсь к 80 порту

а если к 8008, то белые страници, хотя plocal.pl ошибок не выдаёт

.AkeLLa
10.02.2009, 01:26
Плохое это прокси.. Ведь на хостинге логи сохраняються кто куда коннектился и что посылал.

AkyHa_MaTaTa
10.02.2009, 02:24
Все зависит от настроек сервака, но то что ты палешься когда обращаешься к скрипту это да(можно конечно испоьзовать цепочку, но все равно на 1 хосте палево), а насчет того куда уже скрипт конекты дает - это уже зависит от того как сервак настроен,есн под таким прокси никто и не собираеться ломать сайт пентагона.
Bons скинь плизь в ЛС эту версию с socks.

De-visible
10.02.2009, 02:52
Плохое это прокси.. Ведь на хостинге логи сохраняються кто куда коннектился и что посылал.
Да для взлома это не вариант...
Зато можно как пол ачата, через нее акки для вконтакте брутить, круто же!!1111

tipson
14.02.2009, 14:25
у мну вопрос непосредственно экспертам или тем, кто в этом шарит

Спасибо автору кстати за такой скрипт ( год искал)

наш пров дает интернет и оплата за потраченные трафик, но есть такие сайты (провайдерские), к которым доступ бесплатен
там есть большой форум (кажется на движке этого же форума)
есть почта, чат, много игровых серверов
так вот собственно и вопрос
можно ли ту удаленную часть, как то внедрить на удаленный сайт?
потом подключаться к нему и траф будет бесплатный
и еще как запустить ту часть на перле если у мя виндоус виста?
нада скачать какую то прогу для создания среды "перл"?


если кто поможет с решением этого вопроса в долгу не останусь
а если кто напишет подобную штуку индвидуально к нашему прову и покажет что действительно пашет
куплю за ххх сумму

C1RCA
14.02.2009, 14:30
можно ли ту удаленную часть, как то внедрить на удаленный сайт?
просто так ты ни как не внедришь, нужно искать баги на сайте
потом подключаться к нему и траф будет бесплатный
врятли трафф будет бесплатный, это ведь всего лишь прокси
и еще как запустить ту часть на перле если у мя виндоус виста?
Скачай ActivePerl, как запускать написано в первом посте
а если кто напишет подобную штуку индвидуально к нашему прову и покажет что действительно пашет куплю за ххх сумму
при чём тут твой пров? не будет у тебя бесплатного трафа, забей на это...

tipson
15.02.2009, 16:20
врятли трафф будет бесплатный, это ведь всего лишь прокси

это почему?
если я качаю с этого сайта то у мну траф бесплатный
а если я поставлю прокси эффект будет такой же как будто я качаю с этого же сайта

на счет внедрить
можно же с админом договориться

а за остальные поправки спс

Nightmarе
15.02.2009, 16:45
это почему?
если я качаю с этого сайта то у мну траф бесплатный
а если я поставлю прокси эффект будет такой же как будто я качаю с этого же сайта

на счет внедрить
можно же с админом договориться

а за остальные поправки спс
Случай очень типичный, тока вынужден тебя огорчить в 90% на этом сайте либо отсутствуют сокэты, либо закрыт доступ во внешку.
А внутренняя сеть есть практически у каждого, и я тебя прекрасно понимаю.

tipson
15.02.2009, 16:57
у нашего есть доступ во внешку
я это проверял
я ненаю че такое сокеты

C1RCA
15.02.2009, 18:53
Смысл спорить на эту тему, сайт в начале надо поломать, что врятли получится у типсона

tipson
15.02.2009, 20:57
там есть много чего
форум
чат
фтп
ну много чего
мб вариант под видом простого файла закинуть тот файл на сервер


ну например у некоторых пользователей есть право прикреплять вложения к сообщению и как вложение прикрепить тот файлик proxy.php

tipson
15.02.2009, 21:21
Ваши права в разделе
Вы не можете создавать темы
Вы можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете редактировать сообщения
BB-коды Вкл.
Смайлики Вкл.
[IMG] код Вкл.
HTML код Выкл.


как получить право на прикрепление вложений?

Zedi
16.02.2009, 02:38
На ачате вроде только начиная с МОА могут файлы прикреплять) там наверное так же, администраторы и т.п.

www@www
27.02.2009, 05:34
Спасибо за программу, прекрасная работа, с нетерпением ждем final-версию socks

ryfys
28.02.2009, 20:44
огромное спасибо :) выручил
Такой вопрос. Имеется прокся с авторизацией. Как бы сделать так
localhost->proxy->http://mysite/pproxy.php->target
В plocal.pl видел переменные tunnelhost, tunnelport, авторизации не наблюдал :(

needDrivers
05.03.2009, 17:23
Какой тип авторизации (Basic, NTLM)?
Если басик, то просто в заголовок надо добавлять имя и пароль.

ryfys
05.03.2009, 22:34
авторизация basic :) напишите подробней, как это будет выглядеть...

m0Hze
06.03.2009, 03:36
посулаеш в header('Auth Basic: base64encide(login:pass)'); Чтото вроде такого.

needDrivers
06.03.2009, 13:09
Ну не знаю как в plocal.pl это выглядит, а в proxy_rd будет примерно так:
...
add(&header, "Proxy-Authorization: Basic ");
temp_str = encode("username:password");
add(&header, temp_str);
free(temp_str);
add(&header, "\r\n");
...

Train
12.03.2009, 14:27
Большое спасибо за прокси, теперь за интернет плачу только 50 рублей за доступ к локалке.

[Dezzter]
12.03.2009, 17:13
Большое спасибо за прокси, теперь за интернет плачу только 50 рублей за доступ к локалке.
что за бред? :D уверен ты даже ещё не юзал этот прокси сервер...

needDrivers
12.03.2009, 17:47
Почему бред?
Я сам когда-то также пользовался!
Данная связка (локальный прокси + удаленный php) очень неплохо работает. Полноценная работа по протоколу HTTP (POST, GET запросы). К сожалению, соединения типа CONNECT через HTTP работать не будут.

[Dezzter]
12.03.2009, 19:15
бред в том что чел сидит бесплатно в инете и платит только за локалку, не может он бесплатно сидеть....
сам подумай, ты конектишься к серваку на котором висит прокси(пхп), конект что-ли бесплатный? далее. Потом через этот прокси передаются и принимаются данные, это тоже бесплатно?

Nightmarе
12.03.2009, 19:22
']бред в том что чел сидит бесплатно в инете и платит только за локалку, не может он бесплатно сидеть....
сам подумай, ты конектишься к серваку на котором висит прокси(пхп), конект что-ли бесплатный? далее. Потом через этот прокси передаются и принимаются данные, это тоже бесплатно?
Вполне. Это локальная сеть, она бесплатна, остальное - внешний инет.

Тока если он на сайт провайдера этот скрипт повесил, ему за это повесят срок 90%

[Dezzter]
12.03.2009, 19:39
Это локальная сеть, она бесплатна, остальное - внешний инет.
За локалку я молчу, но чел то говорит что он платит только за локалку, а по инету лазиет бесплатно! Как так он может бесплатно лазить? ога?

Nightmarе
13.03.2009, 09:11
']За локалку я молчу, но чел то говорит что он платит только за локалку, а по инету лазиет бесплатно! Как так он может бесплатно лазить? ога?
Да легко, взломать локальный сайт (их у прова может быть много) повесить туда этот скрипт, и если доступ у сайта во внешний инет открыт, то спокойно лазить по http протоколу.
По сути внешний инет будет иметь везде один IP адрес - взломанного сайта, который локален.
У меня знакомый так делал, а через неделю на 2 года на нагорную отправился, вот щас там лежит, книжки читает, и с суровыми санитарами беседы тихие ведёт...

HIVER
13.03.2009, 12:44
Да легко, взломать локальный сайт (их у прова может быть много) повесить туда этот скрипт, и если доступ у сайта во внешний инет открыт, то спокойно лазить по http протоколу.
По сути внешний инет будет иметь везде один IP адрес - взломанного сайта, который локален.
У меня знакомый так делал, а через неделю на 2 года на нагорную отправился, вот щас там лежит, книжки читает, и с суровыми санитарами беседы тихие ведёт...
Гигабайтам u0bHo качал?:) За мелкие то шалости никто заморачиваться не станет.

Ty3uK
29.03.2009, 04:34
Как возможно пустить через эту проксю торрент клиент? Пишет что не верный заголовок...

NAT_uu
29.03.2009, 15:26
https, socks прокси надо

HIVER
01.04.2009, 20:19
Чего-то в нем нехватало, на мой взгляд, добавил нормальные цепочки и ротатор с файла:)

Серверная часть.

<?php

//$secret = 'secret';

if (isset($_POST["transfer"]) && $_POST["transfer"] != "")
{
if(isset($secret) && ($_POST['secret'] != $secret))exit;
$transfer_hosts = explode("::", base64_decode($_POST["transfer"]));
$next_host = array_shift($transfer_hosts);
$postfields = array(
"query" => $_POST['query'],
"host" => $_POST['host'],
"secret" => $_POST['secret']
);
if ($transfer_hosts[0] != "") $postfields["transfer"] = base64_encode(implode("::", $transfer_hosts));
$ch = curl_init($next_host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
} else {
if(isset($_POST['query']) && isset($_POST['host']))
{
if(isset($secret) && ($_POST['secret'] != $secret))exit;
header('Content-type: application/octet-stream');
@set_time_limit(0);
$query = base64_decode(str_replace(" ", "+", $_POST['query']));
list($host, $port) = explode(':', base64_decode(str_replace(" ", "+", $_POST['host'])));
if(!$port)$port = 80;
$ip = gethostbyname($host);
if($fp = @fsockopen($ip, $port, $errno, $errstr, 20))
{
fwrite($fp, $query);
while(!feof($fp))
{
$answer = fread($fp, 1024);
echo $answer;
}
fclose($fp);
}
exit;
}
}
?>




Локальная часть с генерацией рандомно распределенной цепочки:

use HTTP::Daemon;
use MIME::Base64 ();
use Getopt::Long;
use POSIX ":sys_wait_h";
use strict;

my $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';

my $errheader = "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 = $errheader . 'Could not connect to server';
my $errmsg2 = $errheader . 'Could not connect to pproxy';

my ($pproxyhost, $pproxyport, $pproxyurl);
my ($tunnelhost, $tunnelport);
my ($pproxy, $pproxyfile, @pproxylist, $bindport, $tunnel, $secret);
my ($destaddr, $destport, $desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
"px=s" => \$pproxy,
"bp=s" => \$bindport,
"tpx=s" => \$tunnel,
"pwd=s" => \$secret,
"pf=s" => \$pproxyfile
);
die "need pproxy.php url or pproxy.php url filelist" unless $pproxy || $pproxyfile;


#Получение параметров
$pproxyfile =~ /(.+)/;

if ($pproxyfile)
{
open(file, "proxies.txt");
@pproxylist = <file>;
} else {
$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
$pproxyhost = $1; $pproxyport = substr($2, 1); $pproxyurl = '/' . $3;
}

defined($pproxyport) || ($pproxyport = 80);
defined($bindport) || ($bindport = 8008);

if(defined($tunnel))
{
$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
$tunnelhost = $1; $tunnelport = $2;

$destaddr = $tunnelhost;
$destport = $tunnelport;
$desturl = $pproxy;

print "# tunnelhost = $tunnelhost\n";
print "# tunnelport = $tunnelport\n";
}else{
if (!$pproxyfile)
{
$destaddr = $pproxyhost;
$desturl = $pproxyurl;
}
$destport = $pproxyport;
}

if (!$pproxyfile)
{
print "# pproxyhost = $pproxyhost\n";
print "# pproxyport = $pproxyport\n";
print "# pproxyurl = $pproxyurl\n";
} else {
print "# pproxyfile = $pproxyfile\n";
}

print "# bindport = $bindport\n\n";

$|=1;
my %children;
my $slave;

#Прием подключений
my $master = HTTP::Daemon->new( LocalPort => $bindport,
LocalAddr => 'localhost',
Reuse=>1)
|| die "Can't start server ($@)";
&MainProc($slave) while $slave = $master->accept;

sub MainProc
{
my $conn = shift;

#Прием HTTP-запроса
my $request = $conn->get_request();

#Ответвление процесса(потока)
my $pid = fork();
unless(defined($pid))
{
print "# Erorr couldn't fork\n";
close $conn;
return;
}

if($pid)
{
close $conn;
$children{$pid}++;
foreach(keys %children )
{
my $kid = waitpid($_, &WNOHANG);
delete $children{$_} if($kid == -1 || $kid == $_);
}
return;
}

#Преобразование HTTP заголовка
$request -> remove_header('Proxy-Connection');
$request -> remove_header('Keep-Alive');
$request -> header(Connection=>'close');
my $host = $request -> header('Host');
my $http = $request -> as_string();
my $head_end = index ($http, "\x0A\x0A") + 2;
my $head = substr ($http, 0, $head_end);
my $post = substr ($http, $head_end);
$head =~ s/\x0A/\x0D\x0A/g;
$http = $head . $post;
$http =~ s/http:\/\/$host//;
my $time_start = time;

#Отправка запроса прокси и прием результата
my $lastaddr = SendToPProxy( MIME::Base64::encode($host),
MIME::Base64::encode($http),
$conn
);

my $time_end = time;

#Лог
print &TranslateTimeHour($time_end), " ", $host, " <- ", $lastaddr,
" (", &TranslateTime($time_end - $time_start),
")\n";

close $conn;
exit;
}

sub SendToPProxy
{
my $dest_host = shift;
my $query_content = shift;
my $clientsock = shift;
my (@destaddr, $desturl, $proxytransfer, $desthost);

if ($pproxyfile)
{

my @pproxylist_shuffled = @pproxylist;
shuffle(\@pproxylist_shuffled);
chomp(@pproxylist_shuffled);
my $desthost = shift(@pproxylist_shuffled);
my @destaddr = split("//", $desthost);
my @destaddrhost = (@destaddr[0] != "http:") ? split("/", @destaddr[0]) : split("/", @destaddr[1]);
$destaddr = shift(@destaddrhost);
$proxytransfer = MIME::Base64::encode(join("::", @pproxylist_shuffled));
$desturl = $desthost;
}

my $proxysock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);

unless($proxysock)
{
syswrite($clientsock, $errmsg2, length($errmsg2));
return;
}

my $post_query;
#print "[!] <= $destaddr\n";
$post_query = 'secret=' . $secret . '&' if defined($secret);
$post_query .= 'transfer=' . $proxytransfer . '&' if defined($pproxyfile);
$post_query .= 'host=' . $dest_host . '&query=' . $query_content;

my $postlen = length($post_query);

my $request = "POST $desturl HTTP/1.0\x0D\x0A".
"Host: $pproxyhost:$pproxyport\x0D\x0A".
"Accept: */*\x0D\x0A".
"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
"Content-Length: $postlen\x0D\x0A".
"User-Agent: $user_agent\x0D\x0A".
"Connection: close\x0D\x0A\x0D\x0A" . $post_query;

syswrite($proxysock, $request, length($request));
my ($result, $buffer, $response);
my $contentstart = -1;
my $count = 0;
while(1)
{
$result = sysread($proxysock, $buffer, 1024);
last if !defined($result) || !$result;

if($contentstart == -1)
{
$response .= $buffer;
last if length($response)>65535;
$contentstart = index($response,"\x0D\x0A\x0D\x0A");
next if $contentstart == -1;
$buffer = substr($response, $contentstart+4);
}
$count += length($buffer);
syswrite($clientsock, $buffer, length($buffer));
}
syswrite($clientsock, $errmsg1, length($errmsg1)) if $count == 0;
close $proxysock;
return $destaddr;
}

sub TranslateTime
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u", $min, $sec;
}

sub TranslateTimeHour
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u:%02u", $hour, $min, $sec;
}

sub shuffle
{
my $deck = shift; # $deck — ссылка на массив
my $i = @$deck;
while (--$i) {
my $j = int rand ($i+1);
@$deck[$i,$j] = @$deck[$j,$i];
}
}

sub Usage
{
print "Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret] [-pf proxy filelist]\n";
print "Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
print " $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
print " $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
print " $0 -pf proxies.txt -bp 8080 -pwd pproxypass\n";
print "\nDefault bind port - 8008\n";
exit;
}


Либо с рандомной ротацией:

use HTTP::Daemon;
use MIME::Base64 ();
use Getopt::Long;
use POSIX ":sys_wait_h";
use strict;

my $user_agent = 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';

my $errheader = "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 = $errheader . 'Could not connect to server';
my $errmsg2 = $errheader . 'Could not connect to pproxy';

my ($pproxyhost, $pproxyport, $pproxyurl);
my ($tunnelhost, $tunnelport);
my ($pproxy, $pproxyfile, @pproxylist, $bindport, $tunnel, $secret);
my ($destaddr, $destport, $desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
"px=s" => \$pproxy,
"bp=s" => \$bindport,
"tpx=s" => \$tunnel,
"pwd=s" => \$secret,
"pf=s" => \$pproxyfile
);
die "need pproxy.php url or pproxy.php url filelist" unless $pproxy || $pproxyfile;


#Получение параметров
$pproxyfile =~ /(.+)/;

if ($pproxyfile)
{
open(file, "proxies.txt");
@pproxylist = <file>;
} else {
$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
$pproxyhost = $1; $pproxyport = substr($2, 1); $pproxyurl = '/' . $3;
}

defined($pproxyport) || ($pproxyport = 80);
defined($bindport) || ($bindport = 8008);

if(defined($tunnel))
{
$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
$tunnelhost = $1; $tunnelport = $2;

$destaddr = $tunnelhost;
$destport = $tunnelport;
$desturl = $pproxy;

print "# tunnelhost = $tunnelhost\n";
print "# tunnelport = $tunnelport\n";
}else{
if (!$pproxyfile)
{
$destaddr = $pproxyhost;
$desturl = $pproxyurl;
}
$destport = $pproxyport;
}

if (!$pproxyfile)
{
print "# pproxyhost = $pproxyhost\n";
print "# pproxyport = $pproxyport\n";
print "# pproxyurl = $pproxyurl\n";
} else {
print "# pproxyfile = $pproxyfile\n";
}

print "# bindport = $bindport\n\n";

$|=1;
my %children;
my $slave;

#Прием подключений
my $master = HTTP::Daemon->new( LocalPort => $bindport,
LocalAddr => 'localhost',
Reuse=>1)
|| die "Can't start server ($@)";
&MainProc($slave) while $slave = $master->accept;

sub MainProc
{
my $conn = shift;

#Прием HTTP-запроса
my $request = $conn->get_request();

#Ответвление процесса(потока)
my $pid = fork();
unless(defined($pid))
{
print "# Erorr couldn't fork\n";
close $conn;
return;
}

if($pid)
{
close $conn;
$children{$pid}++;
foreach(keys %children )
{
my $kid = waitpid($_, &WNOHANG);
delete $children{$_} if($kid == -1 || $kid == $_);
}
return;
}

#Преобразование HTTP заголовка
$request -> remove_header('Proxy-Connection');
$request -> remove_header('Keep-Alive');
$request -> header(Connection=>'close');
my $host = $request -> header('Host');
my $http = $request -> as_string();
my $head_end = index ($http, "\x0A\x0A") + 2;
my $head = substr ($http, 0, $head_end);
my $post = substr ($http, $head_end);
$head =~ s/\x0A/\x0D\x0A/g;
$http = $head . $post;
$http =~ s/http:\/\/$host//;
my $time_start = time;

#Отправка запроса прокси и прием результата
my $lastaddr = SendToPProxy( MIME::Base64::encode($host),
MIME::Base64::encode($http),
$conn
);

my $time_end = time;

#Лог
print &TranslateTimeHour($time_end), " ", $host, " <- ", $lastaddr,
" (", &TranslateTime($time_end - $time_start),
")\n";

close $conn;
exit;
}

sub SendToPProxy
{
my $dest_host = shift;
my $query_content = shift;
my $clientsock = shift;
my (@destaddr, $desturl, $proxytransfer, $desthost);

if ($pproxyfile)
{

my @pproxylist_shuffled = @pproxylist;
shuffle(\@pproxylist_shuffled);
chomp(@pproxylist_shuffled);
my $desthost = shift(@pproxylist_shuffled);
my @destaddr = split("//", $desthost);
my @destaddrhost = (@destaddr[0] != "http:") ? split("/", @destaddr[0]) : split("/", @destaddr[1]);
$destaddr = shift(@destaddrhost);
$proxytransfer = MIME::Base64::encode(join("::", @pproxylist_shuffled));
$desturl = $desthost;
}

my $proxysock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);

unless($proxysock)
{
syswrite($clientsock, $errmsg2, length($errmsg2));
return;
}

my $post_query;
#print "[!] <= $destaddr\n";
$post_query = 'secret=' . $secret . '&' if defined($secret);
#$post_query .= 'transfer=' . $proxytransfer . '&' if defined($pproxyfile);
$post_query .= 'host=' . $dest_host . '&query=' . $query_content;

my $postlen = length($post_query);

my $request = "POST $desturl HTTP/1.0\x0D\x0A".
"Host: $pproxyhost:$pproxyport\x0D\x0A".
"Accept: */*\x0D\x0A".
"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
"Content-Length: $postlen\x0D\x0A".
"User-Agent: $user_agent\x0D\x0A".
"Connection: close\x0D\x0A\x0D\x0A" . $post_query;

syswrite($proxysock, $request, length($request));
my ($result, $buffer, $response);
my $contentstart = -1;
my $count = 0;
while(1)
{
$result = sysread($proxysock, $buffer, 1024);
last if !defined($result) || !$result;

if($contentstart == -1)
{
$response .= $buffer;
last if length($response)>65535;
$contentstart = index($response,"\x0D\x0A\x0D\x0A");
next if $contentstart == -1;
$buffer = substr($response, $contentstart+4);
}
$count += length($buffer);
syswrite($clientsock, $buffer, length($buffer));
}
syswrite($clientsock, $errmsg1, length($errmsg1)) if $count == 0;
close $proxysock;
return $destaddr;
}

sub TranslateTime
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u", $min, $sec;
}

sub TranslateTimeHour
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u:%02u", $hour, $min, $sec;
}

sub shuffle
{
my $deck = shift; # $deck — ссылка на массив
my $i = @$deck;
while (--$i) {
my $j = int rand ($i+1);
@$deck[$i,$j] = @$deck[$j,$i];
}
}

sub Usage
{
print "Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret] [-pf proxy filelist]\n";
print "Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
print " $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
print " $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
print " $0 -pf proxies.txt -bp 8080 -pwd pproxypass\n";
print "\nDefault bind port - 8008\n";
exit;
}

Phoenixy
02.04.2009, 13:15
а вот например когда я пользуюсь wi-fi и ммне нужно другой ип поставить как сделать

djekxa
05.04.2009, 13:51
юзать виртуалку либо дед

bons
08.04.2009, 21:51
по поводу сокс-версии, думаю без помощи я не справлюсь. Недоработанная версия здесь: http://forum.antichat.ru/showthread.php?p=1214063
Большая просьба всем кто имеет знания в этой области посмотреть и исправить ошибки

InFlame
26.05.2009, 16:45
C Socks-версией всё понятно, а поддержка HTTPS когда-нибудь будет?

Ty3uK
01.06.2009, 16:48
Написал пару строчек кода к клиенту... Теперь работает строка для юзверь агента...

plocal.pl
use HTTP::Daemon;
use MIME::Base64 ();
use Getopt::Long;
use POSIX ":sys_wait_h";
use strict;

my $user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4';

my $errheader = "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 = $errheader . 'Could not connect to server';
my $errmsg2 = $errheader . 'Could not connect to pproxy';

my ($pproxyhost, $pproxyport, $pproxyurl);
my ($tunnelhost, $tunnelport);
my ($pproxy, $bindport, $tunnel, $secret);
my ($destaddr, $destport, $desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
"px=s" => \$pproxy,
"bp=s" => \$bindport,
"tpx=s" => \$tunnel,
"pwd=s" => \$secret
);
die "need pproxy.php url" unless $pproxy;


#Получение параметров
$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
$pproxyhost = $1; $pproxyport = substr($2, 1); $pproxyurl = '/' . $3;

defined($pproxyport) || ($pproxyport = 80);
defined($bindport) || ($bindport = 8008);

if(defined($tunnel))
{
$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
$tunnelhost = $1; $tunnelport = $2;

$destaddr = $tunnelhost;
$destport = $tunnelport;
$desturl = $pproxy;

print "# tunnelhost = $tunnelhost\n";
print "# tunnelport = $tunnelport\n";
}else{
$destaddr = $pproxyhost;
$destport = $pproxyport;
$desturl = $pproxyurl;
}

print "# pproxyhost = $pproxyhost\n";
print "# pproxyport = $pproxyport\n";
print "# pproxyurl = $pproxyurl\n";
print "# bindport = $bindport\n\n";

$|=1;
my %children;
my $slave;

#Прием подключений
my $master = HTTP::Daemon->new( LocalPort => $bindport,
LocalAddr => 'localhost',
Reuse=>1)
|| die "Can't start server ($@)";
&MainProc($slave) while $slave = $master->accept;

sub MainProc
{
my $conn = shift;

#Прием HTTP-запроса
my $request = $conn->get_request();

#Ответвление процесса(потока)
my $pid = fork();
unless(defined($pid))
{
print "# Erorr couldn't fork\n";
close $conn;
return;
}

if($pid)
{
close $conn;
$children{$pid}++;
foreach(keys %children )
{
my $kid = waitpid($_, &WNOHANG);
delete $children{$_} if($kid == -1 || $kid == $_);
}
return;
}

#Преобразование HTTP заголовка
$request -> remove_header('Proxy-Connection');
$request -> remove_header('Keep-Alive');
$request -> header(Connection=>'close');
$request -> remove_header('User-Agent');
$request -> header('User-Agent'=>$user_agent);
my $host = $request -> header('Host');
my $http = $request -> as_string();
my $head_end = index ($http, "\x0A\x0A") + 2;
my $head = substr ($http, 0, $head_end);
my $post = substr ($http, $head_end);
$head =~ s/\x0A/\x0D\x0A/g;
$http = $head . $post;
$http =~ s/http:\/\/$host//;
my $time_start = time;

#Отправка запроса прокси и прием результата
SendToPProxy( MIME::Base64::encode($host),
MIME::Base64::encode($http),
$conn
);

my $time_end = time;

#Лог
print &TranslateTimeHour($time_end), " ", $host,
" (", &TranslateTime($time_end - $time_start),
")\n";

close $conn;
exit;
}

sub SendToPProxy
{
my $dest_host = shift;
my $query_content = shift;
my $clientsock = shift;

my $proxysock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);
unless($proxysock)
{
syswrite($clientsock, $errmsg2, length($errmsg2));
return;
}

my $post_query;
$post_query = 'secret=' . $secret . '&' if defined($secret);
$post_query .= 'host=' . $dest_host . '&query=' . $query_content;
my $postlen = length($post_query);

my $request = "POST $desturl HTTP/1.1\x0D\x0A".
"Host: $pproxyhost:$pproxyport\x0D\x0A".
"Accept: */*\x0D\x0A".
"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
"Content-Length: $postlen\x0D\x0A".
"User-Agent: $user_agent\x0D\x0A".
"Connection: close\x0D\x0A\x0D\x0A" . $post_query;

syswrite($proxysock, $request, length($request));
my ($result, $buffer, $response);
my $contentstart = -1;
my $count = 0;
while(1)
{
$result = sysread($proxysock, $buffer, 1024);
last if !defined($result) || !$result;

if($contentstart == -1)
{
$response .= $buffer;
last if length($response)>65535;
$contentstart = index($response,"\x0D\x0A\x0D\x0A");
next if $contentstart == -1;
$buffer = substr($response, $contentstart+4);
}
$count += length($buffer);
syswrite($clientsock, $buffer, length($buffer));
}
syswrite($clientsock, $errmsg1, length($errmsg1)) if $count == 0;
close $proxysock;
}

sub TranslateTime
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u", $min, $sec;
}

sub TranslateTimeHour
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(shift);
return sprintf "%02u:%02u:%02u", $hour, $min, $sec;
}

sub Usage
{
print "Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret]\n";
print "Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
print " $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
print " $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
print "\nDefault bind port - 8008\n";
exit;
}

Серверная часть не изменялась...

Woolf89
02.06.2009, 12:41
Спасибо, то что нужно, как раз возникла необходимость.

Ty3uK
04.06.2009, 23:54
Нету за что! Надеюсь что ТС не обидится если я немного попробую переписать клиента под свои нужды))

HIVER
13.06.2009, 22:14
C Socks-версией всё понятно, а поддержка HTTPS когда-нибудь будет?


<?php

$secret = 'pwd';

if (isset($_POST["transfer"]) && $_POST["transfer"] != "")
{
if(isset($secret) && ($_POST['secret'] != $secret))exit;
$transfer_hosts = explode("::", base64_decode($_POST["transfer"]));
$next_host = array_shift($transfer_hosts);
$postfields = array(
"query" => $_POST['query'],
"host" => $_POST['host'],
"secret" => $_POST['secret']
);
if ($transfer_hosts[0] != "") $postfields["transfer"] = base64_encode(implode("::", $transfer_hosts));
$ch = curl_init($next_host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
} else {
if(isset($_POST['query']) && isset($_POST['host']))
{
if(isset($secret) && ($_POST['secret'] != $secret))exit;
header('Content-type: application/octet-stream');
@set_time_limit(0);
$query = base64_decode(str_replace(" ", "+", $_POST['query']));
list($host, $port) = explode(':', base64_decode(str_replace(" ", "+", $_POST['host'])));
if(!$port) {if (eregi("https:", $host) && !$port) {$port = 443;} else {$port = 80;}}
$ip = gethostbyname($host);
if($fp = @fsockopen($ip, $port, $errno, $errstr, 20))
{
fwrite($fp, $query);
while(!feof($fp))
{
$answer = fread($fp, 1024);
echo $answer;
}
fclose($fp);
}
exit;
}
}
?>

Изменения в строке

if (!$port) $port=80;

на

if(!$port) {if (eregi("https:", $host) && !$port) {$port = 443;} else {$port = 80;}}

и вуаля, https есть :)

HIVER
14.06.2009, 08:09
з.ы. пардон, в большом блоке очепятка с брекетами была, исправлено.

Nightmarе
15.06.2009, 00:16
httpS выдаёт в любом случае "400 Bad Request", обычный http так-же работает...
У кого нибудь ещё работает httpS ?

needDrivers
15.06.2009, 15:09
HIVER
На фига два раза на нот порт проверять? :D
И вообще непонятно почему это должно работать!?

Nightmarе
15.06.2009, 15:58
HIVER
На фига два раза на нот порт проверять? :D
И вообще непонятно почему это должно работать!?
А это и не работает, по крайней мере со стандартным клиентом от bons`a.

Но HIVER обещял выложить рабочий вариант, вот жду с нетерпением

zannussi
17.06.2009, 22:24
прочитал все 13 страниц
Автору респект!
Но пару раз или даже три раза проскачило прокси для делфи. В ближайшее время намечается?

Nightmarе
18.06.2009, 00:41
Исходник клиента на пассале тут уже толпа ждёт. там же и будет шифровка траффа ;)

Nightmarе
25.06.2009, 17:13
Вот, написал для себя небольшую утилиту для удобного взаимодействия с перловым скриптом Bons`a, решил выложить на паблик вместе с исходниками, может кому и пригодится, чтобы не мучиться с консольным окошком, да и собственно сделать автозапуск.
Скачать: http://www.bashare.ru/download/proxy.rar

Как пользоваться:
1) Разархивируем папку proxy на диск C (в программе прописаны конкретные пути)
2) В файле conf.txt проиисываем адрес прокси, пароль, ну и комментарий. Должно быть строго 3 параметра и на скриптах строго должны стоять пароли.
3) Запускаем программу. Визуально ничего не отобразится, но удерживая SHIFT нажимаем F11 появится интерфейс, выставляем нужную цепочку прокси в нужном порядке. Так-же имейте ввиду, что при запуске программы автоматически запустится самый первый прокси из списка conf.txt Какую бы вы цепочку не ставили, всё будет работать на порту 2245 (естественно localhost)
4) Для удобства вручную прописываем программу в реестре, при запуске системы у вас уже будет настроенный рабочий прокси
5) Программу писал под себя, что говорится на скорую руку, естественно куча недочётов, да и интерфейс можно сделать покрасивее, в архиве исходники программы на Delphi

Так-же с нетерпением ждём полностью переписанного перлового скрипта на пассале, вот тогда можно будет очень интересные темы мутить.

t4Nk
26.06.2009, 09:24
Так-же с нетерпением ждём полностью переписанного перлового скрипта на пассале, вот тогда можно будет очень интересные темы мутить.
именно на паскакале? а на сях не покатит?

needDrivers
26.06.2009, 12:23
t4Nk
В соседней ветке исходник на Си лежит... никто не берёт

bons
08.07.2009, 23:24
клиент на паскале:

- требует меньше ресурсов чем верcия на perl (неблокирующие сокеты, модель select)
- кроссплатформенный. Рекомендуемый компилятор Free Pascal. Также компилируется в Delphi (тестировал на Delphi 7).
- интерфейс такой же как и у программы на perl
- код достаточно хорошо прокомментирован на русском языке, кодировка комментариев Windows-1251
- ссылка http://dump.ru/file/3320224

[x26]VOLAND
10.08.2009, 20:23
Если добавить следующее, цены бы не было этому проксику.

- GZIP-сжатие траффика между pproxy.php и клиентом.
- Подробное логирование посещённых сайтов и кол-ва трафика (локальная exe версия).
- GUI версия.
- Шифрование трафика между pproxy.php и клиентом.

Ну или хотябы первые 3 пункта...

$Atlet$
10.08.2009, 22:05
GUI версия есть, но пока только для перловского клиента.

[x26]VOLAND
11.08.2009, 17:12
Маленькая хитрость для маскировки серверного скрипта проксика.
Закидываем скрипт в папку с картинками, переименовываем его под местность (например header.jpg) и создаём .htaccess с таким содержимым:
<Files ~ "^(header\.jpg)$">
AddType application/x-httpd-php .jpg
</Files>
Теперь этот файл будет интерпретироваться как php-скрипт, и в тоже время обращение к нему будет выглядеть в логах как обычное скачивание картинки.
В случае абузы на сайт администратору будет очень сложно определить по логам где спрятан проксик.

Zemin
13.08.2009, 18:54
Проблема с флешем или явой, не могу разобрать.
пример тому сайт speedtest.net, думаю вам и одного хватит.
Но автору плюсик и благодарность!

Nightmarе
14.08.2009, 02:13
Проблема с флешем или явой, не могу разобрать.
пример тому сайт speedtest.net, думаю вам и одного хватит.
Но автору плюсик и благодарность!
Наверняка юзаем оутпост?
Да, такие проблеммы и у меня были. с Оутпостом, там пришлось выключать веб контроль.
Если другой файрвол делает нечто подобное, то ковырять надо его. В любом случае сам по себе прокси ничего резать не может, флеш и ява выполняются на стороне клиента ;)

Zemin
14.08.2009, 10:31
Дело в том, что у меня нету ни антивируса, ни файрвола.

PS: Можно ли както нстроить ппрокси на качание с торрента?

Nightmarе
14.08.2009, 16:41
Дело в том, что у меня нету ни антивируса, ни файрвола.

PS: Можно ли както нстроить ппрокси на качание с торрента?
Нельзя, ибо pproxy это http, а для торрэнта как минимум нужен socks.

medical
26.09.2009, 20:15
Вообще мне кажется если через такую проксю открыть 50-100 соединений, то апач сдохнет и всё накроется медным тазиком, не так ли?

Nightmarе
26.09.2009, 20:40
Вообще мне кажется если через такую проксю открыть 50-100 соединений, то апач сдохнет и всё накроется медным тазиком, не так ли?
=)))
Это как раз у тебя на компе будет ограничение по потокам, а вот то что на сервере лежит, там хоть тыщщя соединений, всё зависит от сервака, ведь скрипт работает как обычный, и ничем по сути от других сценариев не отличается ;)

DzZzZzZzInN
27.09.2009, 18:13
=)))
Это как раз у тебя на компе будет ограничение по потокам, а вот то что на сервере лежит, там хоть тыщщя соединений, всё зависит от сервака, ведь скрипт работает как обычный, и ничем по сути от других сценариев не отличается ;)
+1

needDrivers
01.10.2009, 14:47
Отличается. Другие скрипты отрабатывают мгновенно, а у этого скорость выполнения сильно зависит от скорости канала и объёма скачиваемых данных с удалённого хоста.
Так что, если одновременно много пользователей подключится к скрипту, тогда процессы не мало памяти на серваке отъедят.

Artyr_006
27.10.2009, 22:08
Огромное тебе спасибо, за твои старания, перенёс всё это на linux(CentOS 5.2) единственное пришлось обновить Phyton, всё заработало..... ещё раз огромное спасибо!!!

DarkMist
29.10.2009, 10:58
Артрит 006 ! поподробней пожалйста!! мне тоже интересно...

zic
29.10.2009, 14:45
Огромное тебе спасибо, за твои старания, перенёс всё это на linux(CentOS 5.2) единственное пришлось обновить Phyton, всё заработало..... ещё раз огромное спасибо!!!
ХМ... зачем мои слова за ответ брать?

Zemin
06.11.2009, 10:27
Слушайте, а можно же поставить не порт 21, 80, 8080, а сделать код так чтобы он сам определял запрашиваемый порт?
надеюсь мысль моя ясна.

Deathdreams
06.11.2009, 14:17
-bp 8009

Сделай -bp 80 или -bp 666

Какой угодно, главное чтобы был свободен.

Qb1024
28.11.2009, 18:17
А можно перезалить клиен который на делфи, а то перла нету на компе.

$Atlet$
28.11.2009, 21:55
Держи http://www.sendspace.com/file/p2udrd, но учти что он в своей работе использует перл скрипт, так что установить интерпретатор все равно придется ;)

profviolet
18.12.2009, 03:32
Подскажите плиз. Я скачал паскалевский вариант клиента (ссылку давал ТС в начале). Запустил, всё пашет, в браузере установил 127.0.0.1:8008 по сайтам лазиет: и мэйл и гугл и яндекс, а вот на контакт тупо не заходит. В чём косяк может быть?

Nightmarе
18.12.2009, 06:03
Подскажите плиз. Я скачал паскалевский вариант клиента (ссылку давал ТС в начале). Запустил, всё пашет, в браузере установил 127.0.0.1:8008 по сайтам лазиет: и мэйл и гугл и яндекс, а вот на контакт тупо не заходит. В чём косяк может быть?
Косяк в том, что IP адрес сайта в бане контакта.

profviolet
18.12.2009, 14:29
Косяк в том, что IP адрес сайта в бане контакта.

Такое ощущение что дело не в этом, поскольку я тестил на разных сайтах (причём на платных хостах поставленых) и таже самая фигня, да ещё и к тому же когда пробую зайти на сайт скажем анонимайзера, он грузится наполовину и виснет. Таже самая фигня и с одноклассниками, грузятся только на половину (

profviolet
18.12.2009, 14:45
Может для нормальной работы с контактом нужнен https?

Nightmarе
18.12.2009, 15:34
Может для нормальной работы с контактом нужнен https?
не нужен.
Такое ощущение что дело не в этом, поскольку я тестил на разных сайтах (причём на платных хостах поставленых) и таже самая фигня, да ещё и к тому же когда пробую зайти на сайт скажем анонимайзера, он грузится наполовину и виснет. Таже самая фигня и с одноклассниками, грузятся только на половину (
А это означает что у тебя похоже файрвол стоит Outpost (именно с ним такая трабла), или другой какой фильтр интернет траффига

c0m
28.12.2009, 15:56
кто-нибудь настраивал скайп? и как это сделать

MAQUEEN
28.12.2009, 18:36
c0m, в скайпе настройки\дополнительно\со единения, и там настроиш проксю.

$Atlet$
29.12.2009, 13:57
c0m, данные прокси не подходят для использования в программах.
А вообще бери socks работающий + Freecap.

mbuaha
29.12.2009, 16:46
я что-то не пойму - чем это решение лучше опенсорсных пхп проксей?

phpdreamer
29.12.2009, 19:14
каких, например?
давай на конкретном примере...

.Life
30.12.2009, 17:21
C Socks-версией всё понятно, а поддержка HTTPS когда-нибудь будет?

jant
06.01.2010, 20:08
может как нить на https прикрутить можно?

zacod
23.01.2010, 17:06
http://webxakep.net/forum/showthread.php?t=5150
Посмотри)твою статью присвоили)

Nightmarе
23.01.2010, 17:21
webxakep.net известный ресурс.
Да уж, гнилые личности там сидят, а спец-статус это особенно подчёркивает.
Ну что-ж, каждый выражается как может, не может что то своё создать, присваивает чужое, и собирает аплодисменты.

zacod, спасибо что оперативно оповестил.

yasya17
03.02.2010, 18:40
А как насчёт прикрутить к этому прокси поддержку FTP?

yasya17
14.02.2010, 04:56
А у меня проблемка:
На сервере в логах ошибки идут:

[Sun Feb 14 02:50:23 2010] [error] PHP Notice: Undefined offset: 1 in /local/home/.../ppro.php on line 8

восьмая строка вот:

list($host, $port) = explode(':', base64_decode($_POST['host']));

что здесь вызывает ошибку? Логи сильно разрослись... ((

bons
16.02.2010, 21:09
можно поставить собаку перед функцией explode
list($host, $port) = @explode(':', base64_decode($_POST['host']));

UM9I
11.03.2010, 22:23
Здраствуите !

У меня такая проблемка :
есть шелл на web server, xampp, но - listen port стоит 9600 а не 80.
Пишу :

C:\Documents and Settings\Admin>C:\strawberry\perl\bin\perl.exe C:\plocal.pl -px http://remote-IP:9600/pproxy.php

и без результата.. . Как бы это поправить ?
Спасибо :)

$Atlet$
11.03.2010, 22:59
Ты похоже забыл дописать:
-pwd "твой пароль" -bp "порт для прокси"

UM9I
11.03.2010, 23:18
да нет.
Паролья нету, а порт по умалчанию 8080

UM9I
11.03.2010, 23:22
он кагбе подвисает и клваиши CTRL + C возврасчают : Terminating on signal SIGINT(2)

gluke
11.03.2010, 23:23
Попробуй
В pproxy.php
if(!$port)$port = 80; замени на 9600

В plocal.pl
defined($pproxyport) || ($pproxyport = 80); на 9600

UM9I
11.03.2010, 23:53
чтота незаметил етих строк до етого :)

Да теперь запустился :
# pproxyhost = remote-IP
# pproxyport = 9600
# pproxyurl = /xampp/pproxy.php
# bindport = 8008

теперь проблема с настройкой Brouser'a
localhost:8008 , 127.0.0.1:8008
не работает :/

djazatik
11.03.2010, 23:56
уфф, еле разобрался))
Очень пригодилось, спасибо автору)

gluke
12.03.2010, 00:08
UM9I
А конкретнее?
Файрвол? Не?
Сервер точно поддерживает исходящие соединения?

UM9I
12.03.2010, 00:18
Насчот удалённой машини незнаю.
удалось зальить шелл, и теперь питаюсь pproxy поставить . . . (think)

Bitman
12.03.2010, 15:25
Хотелось бы реализовать сжатие на стороне сервера и распаковку принятых данных в клиенте. На сервере сжимаю в gzip, но как потом сделать декомпресс в клиенте? Кто-нибудь пытался сделать подобное?

yasya17
13.03.2010, 15:51
можно поставить собаку перед функцией explode
list($host, $port) = @explode(':', base64_decode($_POST['host']));

Помогла следующая коррекрировка:
@list($host, $port) = @explode(':', base64_decode($_POST['host']));

Nek1t
13.03.2010, 18:53
А как насчёт прикрутить к этому прокси поддержку FTP?
Удваиваю, было бы отлично.

c0m
24.03.2010, 21:22
у меня такая проблема не могу сделать цепочку
в батнике:
perl D:\wamp\www\plocal.pl -px ссылка1 -pwd index perl D:\wamp\www\plocal.pl -px ссылка2 -pwd indexdirect -tpx http://localhost:8008 -bp 8009

в строке пишет

# tunnelhost = localhost
# tunnelport = 8008
# pproxyhost = ссылка2
# pproxyport = 80
# pproxyurl = соответственно путь к файлу2
# bindport = 8009

подключаюсь localhost:8009 пишет Could not connect to pproxy
по отдельности все работает

$Atlet$
28.03.2010, 16:31
Перезалейте плиз GUI от Nightmare с исходниками у кого осталось.

Ctacok
15.05.2010, 08:56
Заработало сразу, без проблем.
Спасибо.