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

Home Forums Discussions Support Перенаправление пакетов на локальный прокси сервер

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #5368
    Re9ent
    Participant

      Всем привет!
      Знаю, что тема неоднократно поднималась, но её логического завершения я так и не увидел.
      Необходимо реализовать на базе winpkfilter (пример passthru) редирект на заданный порт локального прокси-сервера. И также в обратную сторону при получении ответа.

      Друзья, очень прошу помощи! Если есть возможность, приведите пожалуйста подкрепляющий пример на си/си++.

      #7063
      Re9ent
      Participant

        Есть подозрение, что если прокси-сервер будет локальным, то не будет возможности перехватывать приходящие на него ответные пакеты.
        В таком случае, пусть прокси будет установлен где-нибудь на стороннем сервере (например, виртуальной машине).
        Всё ещё прошу Вашей помощи!

        #7064
        Vadim Smirnov
        Keymaster

          Требуется что-то подобное http://www.ntkernel.com/w&p.php?id=36 ?

          #7065
          Re9ent
          Participant

            Да, что-то вроде этого. Только интересует преимущественно протокол проксирования Socks.

            #7066
            Vadim Smirnov
            Keymaster

              То есть сделать прозрачный соксификатор? Вопрос очень общий, конкретики маловато…

              #7067
              Re9ent
              Participant

                Прошу прощения за неясность. Вот суть задачи:

                Имеем компьютер пользователя А, с которого будет осуществляться работа. Этот пользователь хочет запустить некоторое сетевое приложение (будь то браузер, мессенджер, или какой-нибудь самописный софт с выходом в интернет) через прокси сервер.
                Для этого предлагается организовать перехват исходящих (а впоследствии и некоторых входящих) пакетов на компьютере A на базе Winpkfilter и перенаправить данные пакеты на сервер B. На сервере B на порту X работает прокси-сервер Socks5, который полученные от А пакеты направлял бы дальше. Полученный ответный пакет сервер B должен возвращать компьютеру A.

                Есть желание реализовать решение этой задачи на основе примера PassThru.

                P.S. Видимо действительно это можно назвать соксификатором, хотя, насколько мне известно, бОльшая часть представленных в интернете соксификаторов работают совсем по другому принципу и они юзермодные.

                #7068
                Re9ent
                Participant

                  Уважаемый SerpentFly! Кажется, на Вас вся надежда…

                  #7069
                  Vadim Smirnov
                  Keymaster

                    Что касается части с редиректом, то ничего сложного нет. Видим исходящий TCP SYN пакет (попадающий под наш критерий, скажем идущий на HTTP порт 80) для этого пакета:
                    1) Аллокируем структуру в которой запоминаем данные для этой новой TCP сессии (адреса и порты).
                    2) Подменяем IP адрес назначения на адрес компьютера B, порт назначения на порт на котором слушает SOCKS.
                    3) Пересчитываем контрольные суммы пакета и отсылаем его в сеть.
                    4) Для пакета полученного от компьютера B проверяем принадлежит ли он одному из сохраненных в первом пункте.
                    5) Если да, то меняем адрес и порт порт источника на те что были в исходном TCP SYN пакете и посылаем вверх по стеку.

                    Но все бы хорошо, но каким образом SOCKS узнает IP адрес и порт которому изначально направлялось соединение? Мы то их подменили при редиректе. Каким-то образом эту информацию нужно передать от компьютера A компьютеру B. Это можно сделать по дополнительному каналу или добавить дополнительные данные в TCP пакет. Это уже на выбор. Ну а так в общем должно работать.

                    #7070
                    Re9ent
                    Participant

                      Большое спасибо, попробую этот вариант.
                      Ещё в догонку такой вопрос – если есть желание перенаправлять исходящие с компьютера A пакеты не на B, а на локальный прокси-клиент, работающий на порту X интерфейся 127.0.0.1? Насколько мне известно, NDIS физически не видит loopback, значит нужно каким-то образом приделывать драйвер другого уровня (наверно TDI).
                      Поэтому конкретизирую вопрос: есть ли у кого-нибудь готовые реализации проектов, шаблоны или хотя бы просто пожелания на тему, как можно надёжно и более-менее просто соединить две реализации: WinpkFilter и некий драйвер, работающий с loopback?

                      #7071
                      Vadim Smirnov
                      Keymaster

                        Для такого редиректа можно использовать не loopback, а реальный локальный адрес. То есть скажем если компьютер A имеет сетевой интерфейс с IP адресом 192.168.1.2 и пытается соединиться скажем с 64.251.25.36:80, то мы можем поступить следующим образом:

                        1) Для исходящего от клиента TCP SYN пакета меняем адрес назначения с 64.251.25.36 на 192.168.1.2, порт назначения меняем на тот на котором висит SOCKS. Адрес источника заменяем на некий реально неиспользуемый в LAN fake адрес, например это может быть 10.0.0.10. Пересчитываем контрольные суммы и вместо того чтобы послать пакет в сеть посылаем его вверх по стеку.
                        2) SOCKS сервер отвечает нам пакетом ACK-SYN c адреса 192.168.1.2:SOCKSPORT на 10.0.0.10. Для этого пакета мы меняем источник на 64.251.25.36:80, назначение на 192.168.1.2 и снова после пересчета контрольных сумм вместо того чтобы отправить пакет в сеть посылаем его вверх по стеку.
                        3) Клиент нам отвечает пакетом TCP ACK с которым мы поступаем аналогично пункту 1.

                        Проще всего совместить WinpkFilter редиректор в одном приложении с SOCKS сервером, проще будет понять куда какое соединение нужно реально направить.

                      Viewing 10 posts - 1 through 10 (of 10 total)
                      • You must be logged in to reply to this topic.