SOCKS на PHP

Discussion in 'Избранное' started by ShAnKaR, 28 Dec 2009.

  1. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    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/

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

    Attached Files:

    #1 ShAnKaR, 28 Dec 2009
    Last edited: 21 Oct 2010
  2. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    да не одним локальным ip.

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

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    нет не конектится ) это данные где сокс поднимается только.

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

    на счет xor-шифрование - скорость уменьшается конечно значительно, но зато хоть какая-никакая защита от снифа.
     
    #3 ShAnKaR, 29 Dec 2009
    Last edited: 29 Dec 2009
  4. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    возможно у тебя папка /tmp/ не доступна для записи - к примеру если включен open_basedir, обновил скрипты, добавил проверку.
     
    #4 ShAnKaR, 2 Jan 2010
    Last edited: 8 Feb 2010
  5. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    у меня норм этот сайт, можно логи посмотреть что скрипт выдает?
     
  6. warwar

    warwar Banned

    Joined:
    26 May 2009
    Messages:
    0
    Likes Received:
    55
    Reputations:
    6
    Спасибо за скрипты, очень медленно обрабатывает запросы, гугл открывался секунд 5...
     
  7. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    у тебя проблема как мне кажется в том что на сервере фаервол не пускает исходящие, а на твоем компе фаер не играет роли.
    попробуй там такой скрипт к примеру:
    PHP:
    <?php
    $fp 
    fsockopen("ya.ru"80$errno$errstr30);
    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($fp128);
        }
        
    fclose($fp);
    }

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


    а тут еще если брать удаленный вебсервер то и еще меньше будет. но это все неизбежная плата за потенциал.
     
    #7 ShAnKaR, 6 Jan 2010
    Last edited: 17 Apr 2010
  8. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    скажи еще какая OS на сервере , и пхп 5 версии?
     
  9. yasya17

    yasya17 New Member

    Joined:
    25 Jan 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Никак не могу с этой прогой разобраться....
     
  10. hackmon

    hackmon Member

    Joined:
    16 Sep 2009
    Messages:
    58
    Likes Received:
    40
    Reputations:
    2
    для наглядности сними видео........чтоб было более понятно!!!!!!!!!
     
  11. GrAmOzEkA

    GrAmOzEkA Elder - Старейшина

    Joined:
    25 Jun 2006
    Messages:
    234
    Likes Received:
    76
    Reputations:
    29
    Такой же глюк как и у всех.
    При загрузке страницы выдает (в 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

    Все отлично работает. Но почему на том не хотело хз.
    Заметил еще один глюк, иногда не до конца загружает страницу, или вообще выводит пустую белую, иногда бывает что вообще разрывает соединение.
     
    #11 GrAmOzEkA, 16 Apr 2010
    Last edited: 16 Apr 2010
  12. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    обновил, что-то исправил
     
  13. mustang777

    mustang777 Elder - Старейшина

    Joined:
    16 May 2007
    Messages:
    15
    Likes Received:
    17
    Reputations:
    0
    А каким способом можно шифровать траффик используя этот сокс, кроме как юзать Tor ?
     
  14. r00nix

    r00nix Banned

    Joined:
    7 May 2009
    Messages:
    48
    Likes Received:
    20
    Reputations:
    0
    Шанкар, поясни плиз - если сервак находится за гейтвэем, на котором осуществляется прокидывание портов, а так же фильтрование траффика (то есть внутрь и наружу проходят пакеты только по 80 TCP порту), получится ли использовать скрипт, чтобы получить доступ к другим портам на сервере?
    В частности, интересует вопрос таймаутов - есть ли возможность с помощью этого скрипта прокинуть постоянное соединение? Если, например, нельзя изменить время выполнения PHP на сервере (запрещено политиками безопасности), то других вариантов я просто не вижу.
     
    #14 r00nix, 22 Apr 2010
    Last edited: 22 Apr 2010
  15. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    ну это зависит как фаервол настроен уже на сервере, но так локальный трафик нет смысла рубить.

    через промежуточный процесс можно сделать- тоесть запускаем к примеру perl скрипт на сервере делаем fork и он висит сколько надо либо уже руководствуясь другими ограничениями. общается по tcp с тем чем надо и паралельно с php скриптом
     
    #15 ShAnKaR, 28 Apr 2010
    Last edited: 28 Apr 2010
  16. r00nix

    r00nix Banned

    Joined:
    7 May 2009
    Messages:
    48
    Likes Received:
    20
    Reputations:
    0
    Понял твою идею, она хороша, но мне она, к сожалению, не подходит. Попробую объяснить, почему. Имеется такая схема:

    [​IMG]
    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 трафик (чего я и хочу первоначально добиться) - то это будет просто смешно.
    В общем, у меня такое впечатление, что кроме бэкконнекта в моем случае ничего сделать не получится. Может, я где-то заблуждаюсь, и все-таки можно что-то придумать, используя те идеи, которые реализованы в топике?
     
  17. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    бекконект возможно тоже не получится из за того что трафик будет обрабатыватся прокси сервером. можно попробовать использовать dns tunnel но тут тоже нужен сервер с белым ip и 53 портом.
    твой предложенный вариант в принципе можно попробовать реализовать, задержки конечно будут значительные как ты и сказал.

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

    это как с обычными сессиями php если тачка меняется то php уже не находит сессию. а если файлы сессий хранятся в общей папке то все работает.
     
    #17 ShAnKaR, 7 May 2010
    Last edited: 7 May 2010
  18. r00nix

    r00nix Banned

    Joined:
    7 May 2009
    Messages:
    48
    Likes Received:
    20
    Reputations:
    0
    Бэкконнект вполне возможен - транзитный трафик на 80 ТСР пропускается свободно и напрямую. Проверял tcpdump'ом на удаленном хосте. DNS-туннель не получится - UDP режется, резолвинга во внутренней сети нет вообще.
    А вот за идею с одним сокетом на нескольких машинах огромное спасибо.
     
  19. rap1t

    rap1t Member

    Joined:
    6 Jan 2009
    Messages:
    77
    Likes Received:
    32
    Reputations:
    1
    вопрос с разрывом соединения и перезапуском, кто-нить решил?
     
  20. $r00tkit$

    $r00tkit$ New Member

    Joined:
    23 Jun 2010
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    Юзай лучше всего через прогу proxifier, на много удобнее, да и DNS скрывает.