PDA

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


ShAnKaR
28.12.2009, 03:25
socks на php, в первую очередь планировался как вариант обхода фаервола, когда открыт только 80 порт а необходим доступ к сервисам на других портах. удобно использовать в комлекте с соксификаторами такими как например proxychains (http://proxychains.sourceforge.net/).

в комплект входят два скрипта :
client.pl клиент запускается у себя,примерно так
./client.pl 127.0.0.1:1081 http://localhost/server.php
# используются стандартные библиотеки входящие по умолчанию в установочный пакет perl
# IO::Socket::INET, MIME::Base64, Compress::Zlib

server.php - загружается на сервер
#для успешной работы требуется:
#php5, папка доступная для записи ( строчка $IPC_TMPDIR='/tmp/'; ), Registered Stream Socket Transports - unix

клиентский скрипт работает как sock5, пересылая трафик на загруженный серверный скрипт.
запуская с дополнительным третьим аргументом выводится дебаг информация.

написал по своему практически, использовав :
http://sourceforge.net/projects/ssspl/
http://http-tunnel.sourceforge.net/

поделитесь пожалуйста что у кого не работает/обругайте код.

Nightmarе
28.12.2009, 15:43
Во! Теперь пэрл без проблемм работает... перл, но не сам сокс.
Во первых мне не совсем понятно, зачем указывать sosk_ip:socks_port, разве не одним локальным портом можно воспользоваться?

Вот у меня такое выходит, запускаю с параметрами:
client.pl 127.0.0.1:51103 http://shinobi.net.ru/servak.php -d
В FireFox выставляю сокс 5, и локальный порт 51103, захожу на сайты - не пашет ни один, зато в консоли наблюдаю такое:

127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfer.com:
443127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfer.c
om:443127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfe
r.com:443127.0.0.1:51103 => ya.ru:80127.0.0.1:51103 => bar-navig.yandex.ru:80127
.0.0.1:51103 => bar.blogs.yandex.net:80 STATUS: OK
client DISCONNECTED
127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfer.com:
443

То есть заходы на все эти сайты есть, однако FF выдаёт ошибку "Время ожидания соединения истекло".

Да, на сервере рядом со скриптом лежит папка tmp с правами на запись.

ShAnKaR
29.12.2009, 13:40
Во первых мне не совсем понятно, зачем указывать sosk_ip:socks_port, разве не одним локальным портом можно воспользоваться?

да не одним локальным ip.

на счет проблемы- может не резольвятся хосты на серере?( как вариант обратится к http://77.88.21.8/ ) или фаервол исходящие не пускает? я попробую тоже в свою очередь в разных условиях потестить.

Nightmarе
29.12.2009, 18:47
Не пашут и IP адреса вместо обычных :(

Вместо sosk_ip вписывал как 127.0.0.1 так и свой домашний IP, всё равно ничего не пашет ;(
Или правильно ли я понимаю, php скрипт сам к тебе коннектится на этот порт чтоли? (Тогда в случае с NAT будет облом)

ShAnKaR
29.12.2009, 20:19
Или правильно ли я понимаю, php скрипт сам к тебе коннектится на этот порт чтоли? (Тогда в случае с NAT будет облом)

нет не конектится ) это данные где сокс поднимается только.

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

на счет xor-шифрование - скорость уменьшается конечно значительно, но зато хоть какая-никакая защита от снифа.

$Atlet$
29.12.2009, 21:28
Тоже не работает, ОС Windows.

127.0.0.1:51103 => 78.47.**.**:80Read error at C:\sss.pl line 106.
127.0.0.1:51103 => 78.47.**.**:80Read error at C:\sss.pl line 106.

ShAnKaR
02.01.2010, 19:52
Тоже не работает, ОС Windows.

127.0.0.1:51103 => 78.47.**.**:80Read error at C:\sss.pl line 106.
127.0.0.1:51103 => 78.47.**.**:80Read error at C:\sss.pl line 106.

возможно у тебя папка /tmp/ не доступна для записи - к примеру если включен open_basedir, обновил скрипты, добавил проверку.

Nightmarе
02.01.2010, 20:07
Протестировал.
Сначало при попытке зайти на какой нибудь сайт была белая страница, но и ошибку в консоли выдавало, что директория tmp не доступна на запись (хотя доступна).
Ладно, в php скрипте я указал полный путь до папки tmp и ошибка с записью пропала, но теперь выводит стандартную ошибку:
"Время ожидания соединения истекло"
Лог из консоли прилогаю в текстовом файле:
http://www.sendspace.com/file/iqsoul
Пользовался браузером FireFox ставя пятый сокс.

PS: Народ, почему никто не тестит и не пишет о результатах?

$Atlet$
05.01.2010, 00:11
Все заработало, только некоторые сайты (например http://www.archive.org/) не открываются, браузер(FireFox) выдаёт ошибку:

Ошибка в типе содержимого

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии.

ShAnKaR
05.01.2010, 19:05
Все заработало, только некоторые сайты (например http://www.archive.org/) не открываются, браузер(FireFox) выдаёт ошибку:

Ошибка в типе содержимого

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии.

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

Nightmarе
06.01.2010, 00:11
А у меня в чём может быть приблизительно причина?
Файрволы я отключал, но самое интересное, это то, что в консоли постоянно мелькают сообщения типа 200 OK, то есть я так понимаю, перловый скрипт, всё-таки получает информацию от скрипта, но почему-то до браузера она не доходит.
Пробовал использовать и FreeCap, запуская из под него все браузеры и прочий софт - безрезультатно ;(

warwar
06.01.2010, 01:30
Спасибо за скрипты, очень медленно обрабатывает запросы, гугл открывался секунд 5...

ShAnKaR
07.01.2010, 00:00
А у меня в чём может быть приблизительно причина?
Файрволы я отключал, но самое интересное, это то, что в консоли постоянно мелькают сообщения типа 200 OK, то есть я так понимаю, перловый скрипт, всё-таки получает информацию от скрипта, но почему-то до браузера она не доходит.
Пробовал использовать и FreeCap, запуская из под него все браузеры и прочий софт - безрезультатно ;(
у тебя проблема как мне кажется в том что на сервере фаервол не пускает исходящие, а на твоем компе фаер не играет роли.
попробуй там такой скрипт к примеру:

<?php
$fp = fsockopen("ya.ru", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: ya.ru\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}



warwar я тестил с вебсервером на своем же компе на speettest - получается :
без сокса 100% к примеру берем
с соксом 80%


а тут еще если брать удаленный вебсервер то и еще меньше будет. но это все неизбежная плата за потенциал.

Nightmarе
07.01.2010, 06:25
Да нет, у меня на серваке всё ок, сокэты работают.
Тем более что с Атлетом одни и те же скрипты тестили, у него работает на этом сервере, у меня - нет ;(

ShAnKaR
15.01.2010, 00:34
Да нет, у меня на серваке всё ок, сокэты работают.
Тем более что с Атлетом одни и те же скрипты тестили, у него работает на этом сервере, у меня - нет ;(
скажи еще какая OS на сервере , и пхп 5 версии?

Nightmarе
15.01.2010, 05:39
скажи еще какая OS на сервере , и пхп 5 версии?
На сервере:
Linux 2.6.18-128.4.1.el5PAE #1
PHP Version 5.2.11

Но опять таки, это у меня не работает, у атлета на ЭТОМ же сервере всё работает.

yasya17
03.02.2010, 19:42
Никак не могу с этой прогой разобраться....

$Atlet$
03.02.2010, 22:43
С чем именно? Стучи в асю помогу.

Nightmarе
30.03.2010, 15:44
Наконец-то, у меня всё заработало отлично.
Но только проблема точно такая-же как и с бекконнект соксом 4, то есть после успешного юзанья соединение рвётся где то через 1-2 минуты, и всё, скрипт надо только перезапускать, после чего снова работает нормально.
Если кто знает в чём примерно дело, буду очень рад

hackmon
16.04.2010, 13:07
для наглядности сними видео........чтоб было более понятно!!!!!!!!!

GrAmOzEkA
16.04.2010, 19:26
Такой же глюк как и у всех.
При загрузке страницы выдает (в FF):
"Время ожидания соединения истекло"


C:\Perl\bin>perl.exe C:\sss.pl 127.0.0.1:80 http://site.ru/about/photo/xx.php -d

127.0.0.1:80 => 209.85.229.104:80
127.0.0.1:80 => 216.239.59.104:80
127.0.0.1:80 => 74.125.77.104:80
В папке /tmp/ создаются сессии.

Система:
FreeBSD 7.1
Apache/1.3.41 (Unix)
FrontPage/5.0.2.2623
PHP/5.2.9
mod_ssl/2.8.31
OpenSSL/0.9.8e rus/PL30.22

$fp = fsockopen("ya.ru", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: ya.ru\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
Нормально обрабатывает.

---------------------------------
Добавлено:

Протестировал на другом сервере:
FreeBSD 6.4
PHP: 5.2.10

Все отлично работает. Но почему на том не хотело хз.
Заметил еще один глюк, иногда не до конца загружает страницу, или вообще выводит пустую белую, иногда бывает что вообще разрывает соединение.

Nightmarе
17.04.2010, 00:42
GrAmOzEkA, если есть KIS или Outpost, ковыряй ихние настройки, полностью исключив пЭрл из правил проверки.

ShAnKaR
22.04.2010, 05:18
обновил, что-то исправил

mustang777
22.04.2010, 17:12
А каким способом можно шифровать траффик используя этот сокс, кроме как юзать Tor ?

r00nix
22.04.2010, 18:03
Шанкар, поясни плиз - если сервак находится за гейтвэем, на котором осуществляется прокидывание портов, а так же фильтрование траффика (то есть внутрь и наружу проходят пакеты только по 80 TCP порту), получится ли использовать скрипт, чтобы получить доступ к другим портам на сервере?
В частности, интересует вопрос таймаутов - есть ли возможность с помощью этого скрипта прокинуть постоянное соединение? Если, например, нельзя изменить время выполнения PHP на сервере (запрещено политиками безопасности), то других вариантов я просто не вижу.

ShAnKaR
28.04.2010, 06:57
Шанкар, поясни плиз - если сервак находится за гейтвэем, на котором осуществляется прокидывание портов, а так же фильтрование траффика (то есть внутрь и наружу проходят пакеты только по 80 TCP порту), получится ли использовать скрипт, чтобы получить доступ к другим портам на сервере?

ну это зависит как фаервол настроен уже на сервере, но так локальный трафик нет смысла рубить.


В частности, интересует вопрос таймаутов - есть ли возможность с помощью этого скрипта прокинуть постоянное соединение? Если, например, нельзя изменить время выполнения PHP на сервере (запрещено политиками безопасности), то других вариантов я просто не вижу.
через промежуточный процесс можно сделать- тоесть запускаем к примеру perl скрипт на сервере делаем fork и он висит сколько надо либо уже руководствуясь другими ограничениями. общается по tcp с тем чем надо и паралельно с php скриптом

r00nix
07.05.2010, 09:30
через промежуточный процесс можно сделать- тоесть запускаем к примеру perl скрипт на сервере делаем fork и он висит сколько надо либо уже руководствуясь другими ограничениями. общается по tcp с тем чем надо и паралельно с php скриптом
Понял твою идею, она хороша, но мне она, к сожалению, не подходит. Попробую объяснить, почему. Имеется такая схема:

http://img340.imageshack.us/img340/2354/123co.png
A - клиентская машина.
B - файрволл.
C[1;n] - кластер веб-серверов (для снижения нагрузки).
Файрволл B является шлюзом для кластера C. К нему у меня доступа нет.
Пытаюсь рассужать логически, как идет трафик от А к С(n). Судя по всему, на В две сетевые карты, В1 и В2. В1 смотрит во внешку, а В2 - во внутреннюю сеть, в которой помимо кластера С находятся еще кластер с базой данных и NFS-серверы. Внутри сети трафик не фильтруется никак, при попытке обратиться во внешку - пакеты попадают на В2, на котором режется все, кроме транзитного трафика на 80 порт ТСР в обе стороны (видимо, админы недоглядели), который свободно уходит из внутренней сети во внешку. На файрволле стоит прокси (судя по всему - сквид), который смотрит во внешку на интерфейсе В1 на 80 порту и прозрачно форвардит запросы на случайно выбранный сервер из кластера С. Наличие прокси проверено опытным путем. На В1 фильтруется весь входящий трафик, кроме того, что идет на 80 ТСР. Также есть такая вероятность, что сквид стоит на одной из машин во внутренней сети, а с В1 на него трафик просто натится.
Итак, я с машины А браузером обращаюсь на В и вижу страницу с C(n), где n - случайным образом выбранная машина из кластера С. Все машины в кластере настроены одинаково, DocumentRoot на всех - это примонтированная директория одного NFS-сервера. У меня есть доступ к С через веб-шелл, с правами пользователя виртуального хостинга. Допустим, мне необходимо проксировать все свои запросы во внутреннюю сеть (к примеру, я хочу подключиться по ssh на одну из машин) - для этого мне нужна постоянная сессия. Почему я не могу при этом воспользоваться твоим советом - ты, думаю, понял. Поднимать демона на perl на каждом сервере из кластера для общения с ним через php скрипт, который будет доступен через веб-морду - это не вариант, так как для постоянной сессии придется реализовывать довольно непростой интерфейс для общения демонов на разных машинах в кластере между собой - что-то вроде RPC с блэкджеком и печеньками.
Можно, конечно, поступить совсем просто - сделать бэкконнект с одной из машин кластера на 80 порт ТСР своей тачки, но вся проблема в том, что под рукой нет машин с белым ипом и свободным 80 портом. Отсюда вытекает еще одна идея - грубо говоря, на третьей стороне на веб-интерфейсе будет php скрипт, на который периодически будет стучать демон с оного из серверов кластера, оставлять свой out и получать задания. Php скрипт, в свою очередь, при каждом выполнении будет транслировать out на прослушиваемый на моем компе порт и брать задания с этого же порта. Но эта идея обречена на провал - скорость каждого "пакета" в такой "сессии" будет измеряться десятками секунд, и если попробовать завернуть в такую RPC (а это именно она) обычный tcp трафик (чего я и хочу первоначально добиться) - то это будет просто смешно.
В общем, у меня такое впечатление, что кроме бэкконнекта в моем случае ничего сделать не получится. Может, я где-то заблуждаюсь, и все-таки можно что-то придумать, используя те идеи, которые реализованы в топике?

ShAnKaR
07.05.2010, 16:22
бекконект возможно тоже не получится из за того что трафик будет обрабатыватся прокси сервером. можно попробовать использовать dns tunnel но тут тоже нужен сервер с белым ip и 53 портом.
твой предложенный вариант в принципе можно попробовать реализовать, задержки конечно будут значительные как ты и сказал.

а так еще если я правильно все понял, проблема использования этого скрипта в том что машины меняются постоянно и постоянной сессии не получается из за этого.
тут вариант - так как веб папка везде одна- на nfs находится, изменить настройки скрипта так чтоб unix сокет создавался в папке nfs а не /tmp/ тоесть на всех тачках он будет неизменен и один и ничто не помешает держать сессию я думаю.

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

r00nix
07.05.2010, 20:15
бекконект возможно тоже не получится из за того что трафик будет обрабатыватся прокси сервером. можно попробовать использовать dns tunnel но тут тоже нужен сервер с белым ip и 53 портом.

Бэкконнект вполне возможен - транзитный трафик на 80 ТСР пропускается свободно и напрямую. Проверял tcpdump'ом на удаленном хосте. DNS-туннель не получится - UDP режется, резолвинга во внутренней сети нет вообще.
А вот за идею с одним сокетом на нескольких машинах огромное спасибо.

rap1t
20.05.2010, 15:53
вопрос с разрывом соединения и перезапуском, кто-нить решил?

Nightmarе
03.06.2010, 16:51
вопрос с разрывом соединения и перезапуском, кто-нить решил?
Поддерживаю, очень хотелось бы реализацию норм сокса, без постоянных разрывов связи, или хотя бы поясните, может быть на Stream Socket Transports такое попросту нереализуемо? или же дело в самом сервере? может на разрывы влияют какие нибудь параметры php настроенные не так?