문제

나는 몇 주 전에 privoxy를 다운로드했으며 재미를 위해 간단한 버전이 어떻게 될 수 있는지 궁금했습니다.

프록시에 요청을 보내려면 브라우저 (클라이언트)를 구성해야한다는 것을 이해합니다. 프록시는 요청을 웹에 보냅니다 (HTTP 프록시라고 가정 해 봅시다). 프록시는 답을받을 것입니다 ... 그러나 프록시는 어떻게 브라우저 (클라이언트)에 요청을 다시 보낼 수 있습니까?

C# 및 HTTP 프록시에 대한 웹에서 검색했지만 장면 뒤에서 어떻게 작동하는지 이해할 수있는 것을 찾지 못했습니다. (나는 리버스 프록시를 원하지 않지만 확실하지 않습니다).

이 작은 프로젝트를 계속할 수있는 설명이나 정보가 있습니까?

업데이트

이것이 내가 이해하는 것입니다 (아래 그래픽 참조).

1 단계 프록시 청취 포트에서 모든 요청을 127.0.0.1로 보낼 수 있도록 클라이언트 (브라우저)를 구성합니다. 이런 식으로 요청은 인터넷으로 직접 전송되지 않지만 프록시에 의해 처리됩니다.

2 단계 프록시는 새로운 연결을보고, HTTP 헤더를 읽고 그가 실행 해야하는 요청을 참조하십시오. 그는 요청을 실행합니다.

STEP3 프록시는 요청으로부터 답변을받습니다. 이제 그는 웹에서 클라이언트에게 답을 보내야하지만 어떻게 ???

alt text

유용한 링크

Mentalis 프록시 : 나는이 프로젝트가 대리인을 발견했습니다 (그러나 내가 원하는 것이 더 많음). 소스를 확인할 수도 있지만 개념을 더 많이 이해하기 위해 기본적인 것을 원했습니다.

ASP 프록시 : 나도 여기에 정보를 얻을 수있을 것입니다.

리플렉터 요청 : 이것은 간단한 예입니다.

여기에 있습니다 간단한 HTTP 프록시가 장착 된 Git Hub 저장소.

도움이 되었습니까?

해결책

당신은 하나를 만들 수 있습니다 HttpListener 들어오는 요청과 HttpWebRequest 요청을 전달하는 클래스.

다른 팁

나는 httplistener 또는 그와 비슷한 것을 사용하지 않을 것입니다. 그런 식으로 당신은 많은 문제를 발견하게 될 것입니다.

가장 중요한 것은 지원하기가 큰 고통이 될 것입니다.

  • 프록시 유지 사유
  • SSL은 작동하지 않습니다 (올바른 방법으로 팝업을 얻을 수 있습니다)
  • .NET 라이브러리는 RFC를 엄격하게 따르면 일부 요청이 실패하게됩니다 (예 : 세계의 FF 및 기타 브라우저가 작동하더라도).

당신이해야 할 일은 다음과 같습니다.

  • TCP 포트를 들어보십시오
  • 브라우저 요청을 구문 분석하십시오
  • 추출 호스트는 TCP 수준에서 해당 호스트에 연결합니다
  • 사용자 정의 헤더를 추가하지 않는 한 모든 것을 앞뒤로 전달하십시오.

나는 다른 요구 사항을 가진 .NET에 2 개의 다른 HTTP 프록시를 썼으며 이것이 가장 좋은 방법이라고 말할 수 있습니다.

이 작업을 수행하지만 그들의 코드는 "대표 스파게티"이며, goto보다 나쁘다 :)

나는 최근 C# .net에서 가벼운 무게 프록시를 작성했습니다. tcplistener 그리고 tcpclient.

https://github.com/titanium007/titanium-web-proxy

보안 HTTP를 지원합니다. 올바른 방법으로 클라이언트 머신은 프록시에서 사용하는 루트 인증서를 신뢰해야합니다. 또한 WebSockets 릴레이도 지원합니다. 파이프 라인을 제외한 HTTP 1.1의 모든 기능은 지원됩니다. 파이프 링은 어쨌든 대부분의 최신 브라우저에서 사용되지 않습니다. 또한 Windows 인증 (일반, 다이제스트)을 지원합니다.

프로젝트를 참조하여 응용 프로그램을 연결 한 다음 모든 트래픽을보고 수정할 수 있습니다. (요청 및 응답).

성능에 관한 한, 나는 내 컴퓨터에서 테스트했으며 눈에 띄는 지연없이 작동합니다.

프록시는 다음과 같은 방식으로 작동 할 수 있습니다.

Step1, Client를 ProxyHost : Proxyport를 사용하도록 구성하십시오.

프록시는 proxyhost : proxyport에서 듣는 TCP 서버입니다. 브라우저는 프록시와의 연결을 열고 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

트래픽을 가로 채고 싶다면 피들러 코어를 사용하여 프록시를 만들 수 있습니다 ...

http://fiddler.wikidot.com/fiddlercore

UI로 Fiddler를 먼저 실행하여 그것이 무엇을하는지 확인하십시오. HTTP/HTTPS 트래픽을 디버깅 할 수있는 프록시입니다. C#로 작성되었으며 자신의 응용 프로그램으로 구축 할 수있는 핵심이 있습니다.

Fiddlercore는 상업용 응용 프로그램에 무료가 아닙니다.

Owin과 Webapi는 상황이 정말 쉬워졌습니다. C# 프록시 서버를 검색 할 때이 게시물도 발견했습니다. http://blog.kloud.com.au/2013/11/11/24/do-it-yourself-api-proxy/ . 이것은 내가받는 길이 될 것입니다.

httplistener를 사용하면 Dr Dr Evil에 동의합니다. 많은 문제가 생길 것입니다. 요청을 구문 분석해야하며 헤더에 참여하고 ...

  1. TCP 리스너를 사용하여 브라우저 요청을 듣습니다
  2. 요청의 첫 번째 줄만 구문 분석하고 호스트 도메인과 포트를 연결할 수 있습니다.
  3. 브라우저 요청의 첫 번째 줄에서 찾은 호스트에게 정확한 원시 요청을 보냅니다.
  4. 대상 사이트에서 데이터를 수신합니다 (이 섹션에서는 문제가 있습니다)
  5. 호스트에서 수신 된 정확한 데이터를 브라우저로 보냅니다.

브라우저 요청에 무엇이 있는지 알지 못하고 구문 분석 할 필요조차 없습니다. 첫 번째 줄에서 대상 사이트 주소 만 가져 오십시오. http://google.com http1.1 또는 Connect Facebook.com:443 (이것은 SSL 요청을위한 것입니다)

Socks4는 구현하기에 매우 간단한 프로토콜입니다. 초기 연결을 듣고 클라이언트가 요청한 호스트/포트에 연결하고 성공 코드를 클라이언트에게 보내고 소켓을 가로 질러 나가는 스트림을 전달하십시오.

HTTP를 사용하면 HTTP 헤더를 읽고 설정/제거하여 조금 더 작업 할 수 있습니다.

정확하게 기억한다면 SSL은 HTTP 및 양말 프록시에서 작동합니다. HTTP 프록시의 경우 위에서 설명한대로 SOCKS4와 매우 유사하게 작동하는 Connect Verb를 구현하면 클라이언트가 프록시 된 TCP 스트림에서 SSL 연결을 엽니 다.

브라우저는 프록시에 연결되므로 웹 서버에서 프록시가 가져온 데이터는 브라우저가 프록시에 시작한 것과 동일한 연결을 통해 전송됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top