Как создать простой прокси в C#?



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



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



У меня есть поиск в интернете для C# и HTTP-прокси, но не нашли что-то, что позволит мне понять, как это работает за кулисами правильно. (Я считаю, что я не хочу обратного прокси, но я не уверен).



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



обновление



Это, насколько я понимаю (см. рисунок ниже).



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



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



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



alt text



Полезные ссылки



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



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



Request reflector : это простой пример.



здесь репозиторий Git Hub с простым HTTP прокси.

1231   10  

10 ответов:

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

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

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

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

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

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

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

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

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

Шаг 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

недавно я написал легкий прокси-сервер в c# .net с помощью TcpListener и TcpClient.

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

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

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

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

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

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 у вас будет много проблем, вам придется разбирать запросы и заниматься заголовками И...

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

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

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

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

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

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

Я также написал простой, но мощный обратный прокси для asp.net / web api.

вы можете найти его здесь: https://github.com/SharpTools/SharpReverseProxy

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

взгляните на исходный код, это очень легко реализовать :)

Comments

    Ничего не найдено.