Вопрос

Я скачал Privoxy несколько недель назад, и ради развлечения мне было любопытно узнать, как можно сделать простую версию этого приложения.

Я понимаю, что мне нужно настроить браузер (клиент) для отправки запроса на прокси.Прокси-сервер отправляет запрос в Интернет (допустим, это http-прокси).Прокси-сервер получит ответ...но как прокси-сервер может отправить запрос обратно браузеру (клиенту)?

Я провел поиск в Интернете по C # и http-прокси, но не нашел ничего, что позволило бы мне понять, как это правильно работает за сценой.(Я полагаю, что мне не нужен обратный прокси, но я не уверен).

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

Обновить

Это то, что я понимаю (см. Рисунок ниже).

Шаг 1 Я настраиваю клиент (браузер) так, чтобы все запросы отправлялись на 127.0.0.1 через порт, который прослушивает прокси.Таким образом, запрос не будет отправлен в Интернет напрямую, а будет обработан прокси-сервером.

Шаг 2 Прокси-сервер видит новое соединение, читает HTTP-заголовок и видит запрос, который он должен выполнить.Он выполняет просьбу.

Шаг 3 Прокси-сервер получает ответ на запрос.Теперь он должен отправить ответ из Интернета клиенту, но как???

alt text

Полезная ссылка

Прокси - сервер Mentalis :Я нашел этот проект, который является прокси-сервером (но больше того, что я хотел бы).Я мог бы проверить источник, но мне действительно хотелось чего-то базового, чтобы лучше понять концепцию.

Прокси - сервер ASP :Возможно, я и здесь смогу получить кое-какую информацию.

Запросите отражатель :Это простой пример.

Вот такой Репозиторий Git Hub с простым Http-прокси.

Это было полезно?

Решение

Вы можете создать его с помощью HttpListener класс для прослушивания входящих запросов и < code> HttpWebRequest класс для ретрансляции запросов.

Другие советы

Я бы не стал использовать HttpListener или что-то в этом роде, таким образом, вы столкнетесь с таким количеством проблем.

Самое главное, что поддерживать его будет огромной болью:

  • Сохранение прокси-сервера-Alives
  • SSL не будет работать (при правильном использовании вы будете получать всплывающие окна)
  • Библиотеки .NET строго следуют RFC, что приводит к сбою некоторых запросов (хотя IE, FF и любой другой браузер в мире будут работать).

Что вам нужно сделать, это:

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

Я написал 2 разных HTTP-прокси в .NET с разными требованиями, и я могу сказать вам, что это лучший способ сделать это.

Mentalis делают это, но их код - "делегатские спагетти", хуже, чем GoTo :)

Недавно я написал облегченный прокси-сервер на c # .net, используя TcpListener и TcpClient .

https://github.com/titanium007/Titanium-Web-Proxy

Он поддерживает безопасный HTTP правильно, клиентскому компьютеру необходимо доверять корневому сертификату, используемому прокси. Также поддерживает ретрансляцию WebSockets. Поддерживаются все функции HTTP 1.1, кроме конвейерной. В любом случае конвейерная обработка не используется большинством современных браузеров. Также поддерживает проверку подлинности Windows (обычный, дайджест).

Вы можете подключить свое приложение, ссылаясь на проект, а затем просматривать и изменять весь трафик. (Запрос и ответ).

Что касается производительности, я проверил ее на своем компьютере и работает без заметной задержки.

Прокси может работать следующим образом.

Шаг 1, настройте клиент для использования proxyHost: proxyPort.

Прокси-сервер - это TCP-сервер, который прослушивает proxyHost: proxyPort. Браузер открывает соединение с прокси и отправляет Http-запрос. Прокси-сервер анализирует этот запрос и пытается обнаружить " хост " заголовок. Этот заголовок скажет Прокси, где открыть соединение.

Шаг 2. Прокси-сервер открывает соединение с адресом, указанным в " Хосте " заголовок. Затем он отправляет HTTP-запрос на этот удаленный сервер. Читает ответ.

Шаг 3. После считывания ответа с удаленного HTTP-сервера Прокси-сервер отправляет ответ через ранее открытое TCP-соединение с браузером.

Схематически это будет выглядеть так:

Browser                            Proxy                     HTTP server
  Open TCP connection  
  Send HTTP request  ----------->                       
                                 Read HTTP header
                                 detect Host header
                                 Send request to HTTP ----------->
                                 Server
                                                      <-----------
                                 Read response and send
                   <-----------  it back to the browser
Render content

Если вы просто хотите перехватить трафик, вы могли бы использовать ядро fiddler core для создания прокси-сервера...

http://fiddler.wikidot.com/fiddlercore

сначала запустите fiddler с пользовательским интерфейсом, чтобы посмотреть, что он делает, это прокси, который позволяет вам отлаживать трафик http / https.Он написан на c # и имеет ядро, которое вы можете встроить в свои собственные приложения.

Имейте в виду, что FiddlerCore не является бесплатным для коммерческих приложений.

С OWIN и WebAPI все стало очень просто. В моем поиске прокси-сервера C # я также наткнулся на этот пост http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Это будет дорога, по которой я иду.

Согласись с доктором злом если вы используете HTTPListener, у вас будет много проблем, вам придется анализировать запросы, и вы будете заняты заголовками и ...

<Ол>
  • Используйте слушатель tcp для прослушивания запросов браузера
  • проанализируйте только первую строку запроса и получите домен хоста и порт для подключения
  • отправьте точный необработанный запрос найденному хосту в первой строке запроса браузера
  • получить данные с целевого сайта (у меня есть проблемы в этом разделе)
  • отправлять точные данные, полученные от хоста, в браузер
  • вы видите, что вам даже не нужно знать, что находится в запросе браузера, и анализировать его, только получить адрес целевого сайта из первой строки первая строка обычно любит это ПОЛУЧИТЕ http://google.com HTTP1.1 или же ПОДКЛЮЧИТЕ facebook.com:443 (это для запросов ssl)

    Socks4 - очень простой для реализации протокол. Вы прослушиваете начальное соединение, подключаетесь к хосту / порту, запрошенному клиентом, отправляете клиенту код успеха, а затем пересылаете исходящий и входящий потоки через сокеты.

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

    Если я правильно помню, SSL будет работать через HTTP и Socks прокси. Для HTTP-прокси вы реализуете глагол CONNECT, который работает так же, как socks4, как описано выше, затем клиент открывает SSL-соединение через прокси-поток tcp.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top