Как создать простой прокси в C #? - PullRequest
134 голосов
/ 22 октября 2008

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

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

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

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

Обновление

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

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

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

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

alt text

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

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

ASP Proxy : Я мог бы также получить некоторую информацию здесь.

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

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

Ответы [ 9 ]

85 голосов
/ 30 апреля 2009

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

Самое главное, это будет огромная боль для поддержки:

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

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

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

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

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

33 голосов
/ 22 октября 2008

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

21 голосов
/ 06 января 2015

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

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

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

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

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

19 голосов
/ 30 апреля 2009

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

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

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

Шаг 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
13 голосов
/ 20 июня 2012

Если вы просто хотите перехватить трафик, вы можете использовать ядро ​​Fiddler для создания прокси ...

http://fiddler.wikidot.com/fiddlercore

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

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

6 голосов
/ 19 января 2015

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

5 голосов
/ 08 сентября 2010

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

  1. Используйте слушатель tcp для прослушивания запросов браузера
  2. парсит только первую строку запроса и получает домен хоста и порт для подключения
  3. отправить точный необработанный запрос найденному хосту в первой строке запроса браузера
  4. получить данные с целевого сайта (у меня проблема в этом разделе)
  5. отправляет точные данные, полученные от хоста, в браузер

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

4 голосов
/ 15 июня 2012

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

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

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

2 голосов
/ 03 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...