¿Cómo crear un proxy simple en C #?

He descargado Privoxy hace unas semanas y, por diversión, tenía curiosidad por saber cómo se puede hacer una versión simple de la misma.

Entiendo que necesito configurar el navegador (cliente) para enviar la solicitud al proxy. El proxy envía la solicitud a la web (digamos que es un proxy HTTP). El proxy recibirá la respuesta … pero, ¿cómo puede el proxy devolver la solicitud al navegador (cliente)?

Tengo búsqueda en la web para C # y http proxy, pero no he encontrado algo que me permita entender cómo funciona detrás de la escena correctamente. (Creo que no quiero un proxy inverso, pero no estoy seguro).

¿Alguno de ustedes tiene alguna explicación o alguna información que me permita continuar este pequeño proyecto?

Actualizar

Esto es lo que entiendo (ver gráfico a continuación).

Paso 1 Configuro el cliente (navegador) para que todas las solicitudes se envíen a 127.0.0.1 en el puerto que escucha el Proxy. De esta forma, la solicitud no se enviará directamente a Internet, sino que será procesada por el proxy.

Paso 2 El proxy ve una nueva conexión, lee el encabezado HTTP y ve la solicitud que debe ejecutar. Él ejecuta la solicitud.

Paso 3 El proxy recibe una respuesta de la solicitud. Ahora debe enviar la respuesta desde la web al cliente, pero ¿cómo?

texto alternativo

Enlace útil

Proxy de Mentalis : He encontrado este proyecto que es un proxy (pero más de lo que me gustaría). Podría verificar la fuente, pero realmente quería algo básico para entender más el concepto.

Proxy ASP : es posible que también pueda obtener información aquí.

Reflector de solicitud : este es un ejemplo simple.

Aquí hay un repository Git Hub con un proxy Http simple .

Puede comstackr uno con la clase HttpListener para escuchar las solicitudes entrantes y la clase HttpWebRequest para retransmitir las solicitudes.

No usaría HttpListener ni nada de eso, de esa manera te encontrarás con tantos problemas.

Lo más importante será un gran dolor para apoyar:

  • Proxy Keep-Alives
  • SSL no funcionará (de manera correcta, obtendrá ventanas emergentes)
  • Las librerías .NET siguen estrictamente las RFC, lo que hace que algunas solicitudes fallen (aunque IE, FF y cualquier otro navegador del mundo funcionarán).

Lo que debes hacer es:

  • Escucha un puerto TCP
  • Analizar la solicitud del navegador
  • Extraer host se conecta a ese host en el nivel TCP
  • Reenvía todo de un lado a otro a menos que quieras agregar encabezados personalizados, etc.

Escribí 2 proxies HTTP diferentes en .NET con diferentes requisitos y puedo decirles que esta es la mejor manera de hacerlo.

Mentalis hace esto, pero su código es “espaghetti delegado”, peor que GoTo 🙂

Proxy puede funcionar de la siguiente manera.

Paso 1, configurar el cliente para usar proxyHost: proxyPort.

Proxy es un servidor TCP que está escuchando en proxyHost: proxyPort. El navegador abre la conexión con el Proxy y envía la solicitud Http. Proxy analiza esta solicitud e intenta detectar el encabezado “Host”. Este encabezado le indicará a Proxy dónde abrir la conexión.

Paso 2: Proxy abre la conexión a la dirección especificada en el encabezado “Host”. Luego envía una solicitud HTTP a ese servidor remoto. Lee la respuesta.

Paso 3: después de que se lee la respuesta del servidor HTTP remoto, Proxy envía la respuesta a través de una conexión TCP abierta anterior con el navegador.

Esquemáticamente se verá así:

 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 

Recientemente escribí un proxy ligero en c # .net usando TcpListener y TcpClient .

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

Admite HTTP seguro de la manera correcta, la máquina del cliente necesita confiar en el certificado raíz utilizado por el proxy. También es compatible con el relevo de WebSockets. Se admiten todas las características de HTTP 1.1, excepto la canalización. La canalización no es utilizada por la mayoría de los navegadores modernos de todos modos. También es compatible con la autenticación de Windows (simple, resumir).

Puede conectar su aplicación haciendo referencia al proyecto y luego ver y modificar todo el tráfico. (Solicitud y respuesta).

En cuanto a rendimiento, lo he probado en mi máquina y funciona sin ningún retraso notable.

Si solo busca interceptar el tráfico, puede usar el núcleo del violinista para crear un proxy …

http://fiddler.wikidot.com/fiddlercore

Ejecute primero el violín con la interfaz de usuario para ver qué hace, es un proxy que le permite depurar el tráfico http / https. Está escrito en c # y tiene un núcleo que puedes construir en tus propias aplicaciones.

Tenga en cuenta que FiddlerCore no es gratuito para aplicaciones comerciales.

Las cosas se han vuelto realmente fáciles con OWIN y WebAPI. En mi búsqueda de un servidor Proxy C #, también me encontré con esta publicación http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Este será el camino que tomaré.

Acepta dr evil si usas HTTPListener, tendrás muchos problemas, tendrás que analizar las solicitudes y te comprometerás con los encabezados y …

  1. Utilice el oyente tcp para escuchar las solicitudes del navegador
  2. analizar solo la primera línea de la solicitud y obtener el dominio de host y el puerto para conectarse
  3. envíe la solicitud cruda exacta al host encontrado en la primera línea de solicitud del navegador
  4. recibir los datos del sitio de destino (tengo un problema en esta sección)
  5. enviar los datos exactos recibidos del host al navegador

usted ve que no necesita ni siquiera saber qué hay en la solicitud del navegador y analizarlo, solo obtener la dirección del sitio de destino desde la primera línea, la primera línea generalmente le gusta este GET http://google.com HTTP1.1 o CONNECT facebook.com: 443 (esto es para solicitudes de SSL)

Socks4 es un protocolo muy simple de implementar. Escucha la conexión inicial, se conecta al host / puerto solicitado por el cliente, envía el código de éxito al cliente y luego reenvía los flujos entrantes y salientes a través de los sockets.

Si usa HTTP, tendrá que leer y, posiblemente, establecer / eliminar algunos encabezados HTTP, así que eso es un poco más de trabajo.

Si recuerdo correctamente, SSL funcionará a través de proxies HTTP y Socks. Para un proxy HTTP, implemente el verbo CONNECT, que funciona de manera similar a los calcetines4 como se describió anteriormente, luego el cliente abre la conexión SSL a través de la stream tcp con proxy.

El navegador está conectado al proxy, por lo que los datos que obtiene el proxy del servidor web solo se envían a través de la misma conexión que el navegador inició con el proxy.

También escribí un proxy inverso simple pero poderoso para asp.net / web api.

Puede encontrarlo aquí: https://github.com/SharpTools/SharpReverseProxy

Solo agregue a su proyecto a través de nuget y estará listo. Incluso puede modificar sobre la marcha la solicitud, la respuesta o denegar un reenvío debido a un error de autenticación.

Eche un vistazo al código fuente, es realmente fácil de implementar 🙂