socks на php, в первую очередь планировался как вариант обхода фаервола, когда открыт только 80 порт а необходим доступ к сервисам на других портах. Скрипт может работать в двух режимах - как socks5 и просто как туннель. в комплект входят два скрипта : client.pl # используются стандартные библиотеки входящие по умолчанию в установочный пакет perl # IO::Socket::INET, MIME::Base64, Compress::Zlib server.php - загружается на сервер #для успешной работы требуется: #php5, папка доступная для записи ( строчка define('TMP','/tmp/'); ). Режим socks Клиент запускается у себя,примерно так ./client.pl 127.0.0.1:1081 http://localhost/server.php клиентский скрипт работает как sock5, пересылая трафик на загруженный серверный скрипт. Его удобно использовать в комлекте с соксификаторами такими как например proxychains. Режим туннеля Использование туннеля может применятся в случаях когда софт не поддается соксифицированию. Для работы в данном режиме client.pl запускается так: ./client.pl 127.0.0.1:12049( локальный адрес ) http://example.com/server.php 192.168.1.1:2049( целевой адрес ) написал по своему практически, использовав : http://sourceforge.net/projects/ssspl/ http://http-tunnel.sourceforge.net/ поделитесь пожалуйста что у кого не работает/обругайте код.
да не одним локальным ip. на счет проблемы- может не резольвятся хосты на серере?( как вариант обратится к http://77.88.21.8/ ) или фаервол исходящие не пускает? я попробую тоже в свою очередь в разных условиях потестить.
нет не конектится ) это данные где сокс поднимается только. на счет проблемы невозможности конекта- фидимо фаер рубит исходящий трафик, советую просто попробовать на другом сервере. на счет xor-шифрование - скорость уменьшается конечно значительно, но зато хоть какая-никакая защита от снифа.
возможно у тебя папка /tmp/ не доступна для записи - к примеру если включен open_basedir, обновил скрипты, добавил проверку.
у тебя проблема как мне кажется в том что на сервере фаервол не пускает исходящие, а на твоем компе фаер не играет роли. попробуй там такой скрипт к примеру: PHP: <?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% а тут еще если брать удаленный вебсервер то и еще меньше будет. но это все неизбежная плата за потенциал.
Такой же глюк как и у всех. При загрузке страницы выдает (в FF): "Время ожидания соединения истекло" Code: 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 Code: $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 Все отлично работает. Но почему на том не хотело хз. Заметил еще один глюк, иногда не до конца загружает страницу, или вообще выводит пустую белую, иногда бывает что вообще разрывает соединение.
Шанкар, поясни плиз - если сервак находится за гейтвэем, на котором осуществляется прокидывание портов, а так же фильтрование траффика (то есть внутрь и наружу проходят пакеты только по 80 TCP порту), получится ли использовать скрипт, чтобы получить доступ к другим портам на сервере? В частности, интересует вопрос таймаутов - есть ли возможность с помощью этого скрипта прокинуть постоянное соединение? Если, например, нельзя изменить время выполнения PHP на сервере (запрещено политиками безопасности), то других вариантов я просто не вижу.
ну это зависит как фаервол настроен уже на сервере, но так локальный трафик нет смысла рубить. через промежуточный процесс можно сделать- тоесть запускаем к примеру perl скрипт на сервере делаем fork и он висит сколько надо либо уже руководствуясь другими ограничениями. общается по tcp с тем чем надо и паралельно с php скриптом
Понял твою идею, она хороша, но мне она, к сожалению, не подходит. Попробую объяснить, почему. Имеется такая схема: 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 трафик (чего я и хочу первоначально добиться) - то это будет просто смешно. В общем, у меня такое впечатление, что кроме бэкконнекта в моем случае ничего сделать не получится. Может, я где-то заблуждаюсь, и все-таки можно что-то придумать, используя те идеи, которые реализованы в топике?
бекконект возможно тоже не получится из за того что трафик будет обрабатыватся прокси сервером. можно попробовать использовать dns tunnel но тут тоже нужен сервер с белым ip и 53 портом. твой предложенный вариант в принципе можно попробовать реализовать, задержки конечно будут значительные как ты и сказал. а так еще если я правильно все понял, проблема использования этого скрипта в том что машины меняются постоянно и постоянной сессии не получается из за этого. тут вариант - так как веб папка везде одна- на nfs находится, изменить настройки скрипта так чтоб unix сокет создавался в папке nfs а не /tmp/ тоесть на всех тачках он будет неизменен и один и ничто не помешает держать сессию я думаю. это как с обычными сессиями php если тачка меняется то php уже не находит сессию. а если файлы сессий хранятся в общей папке то все работает.
Бэкконнект вполне возможен - транзитный трафик на 80 ТСР пропускается свободно и напрямую. Проверял tcpdump'ом на удаленном хосте. DNS-туннель не получится - UDP режется, резолвинга во внутренней сети нет вообще. А вот за идею с одним сокетом на нескольких машинах огромное спасибо.