2010-04-20 2 views
2

루비로 작성된 HTTP 인터셉트 프록시의 시작이 있습니다Ruby에서 HTTP 차단 프록시 사용에 대한 도움이 필요하십니까?

require 'socket'    # Get sockets from stdlib 

server = TCPServer.open(8080) # Socket to listen on port 8080 
loop {       # Servers run forever 
    Thread.start(server.accept) do |client| 
    puts "** Got connection!" 
    @output = "" 
    @host = "" 
    @port = 80 
    while line = client.gets 
     line.chomp! 
     if (line =~ /^(GET|CONNECT) .*(\.com|\.net):(.*) (HTTP\/1.1|HTTP\/1.0)$/) 
      @port = $3 
     elsif (line =~ /^Host: (.*)$/ && @host == "") 
      @host = $1 
     end 
     print line + "\n" 
     @output += line + "\n" 
     # This *may* cause problems with not getting full requests, 
     # but without this, the loop never returns. 
     break if line == "" 
    end 
    if (@host != "") 
     puts "** Got host! (#{@host}:#{@port})" 
     out = TCPSocket.open(@host, @port) 
     puts "** Got destination!" 
     out.print(@output) 
     while line = out.gets 
      line.chomp! 
      if (line =~ /^<proxyinfo>.*<\/proxyinfo>$/) 
       # Logic is done here. 
      end 
      print line + "\n" 
      client.print(line + "\n") 
     end 
     out.close 
    end 
    client.close 
    end 
} 

내가 HTTP 요청 중 대상은 다음 HTTP 응답을 읽고 특별한 HTML 태그를 기반으로 논리를 수행 구문 분석 만든이 간단한 프록시 . 프록시는 대부분 작동하지만 바이너리 데이터 및 HTTPS 연결을 처리하는 데 문제가있는 것 같습니다.

어떻게 이러한 문제를 해결할 수 있습니까?

답변

2

먼저 기존 Ruby HTTP 프록시 구현을 구축하는 것이 좋습니다. 하나는 이미 Ruby 표준 라이브러리에서 사용할 수 있습니다. 즉 WEBrick::HTTPProxyServer입니다. 예를 들어 동일한 클래스를 기반으로 구현 된 관련 질문 인 Webrick transparent proxy을 참조하십시오.

HTTPS 프록시와 관련하여 원시 바이트를 전달하는 것 외에는 많은 작업을 수행 할 수 없습니다. HTTPS는 암호로 보호되므로 HTTP 프로토콜 수준에서 내용을 검사 할 수 없습니다. 이것은 단지 불투명 한 바이트 스트림입니다.

1

WEBrick이 I/O를 차단하고 있습니다 ... 이것은 응답을 스트리밍 할 수 없음을 의미합니다. 예를 들어 YouTube 페이지를 방문하여 동영상을 볼 경우 프록시가 모든 동영상을 다운로드 할 때까지 브라우저에 스트림이 전달되지 않습니다. 다운로드하는 동안 브라우저에서 비디오를 재생하려면 EventMachine과 같은 I/O 솔루션이 아닌 블로킹을 찾아야합니다. HTTPS의 경우 중간 프록시에서 사람을 개발해야하기 때문에이 솔루션은 약간 복잡합니다.

0

이 질문은 오래된 질문 이었지만 여기서는 또 다른 답변을 전합니다.

Ruby에서 HTTP/HTTPS 차단 프록시를 구현했습니다. 프로젝트는 hosted in github입니다.

HTTP의 경우는 역방향 프록시로 작동하고 (HTTPS 서버를 통해 수행되고 TLS 핸드 셰이크를 처리하는) HTTPS 차단이 분명합니다. 나는.

Client(e.g. Browser) <--> Proxy1 <--> HTTPS Reverse Proxy <--> Target Server 

Valko가 언급 한 바와 같이

, 클라이언트가 프록시를 통해 HTTPS 서버에 연결할 때 (SSL은 엔드 - 투 - 엔드 암호화를 제공하기 때문에), 암호화 된 바이트 스트림을 볼 수 있습니다. 그러나 모든 것이 암호화되어있는 것은 아니며 프록시는 바이트 스트림을 전달할 대상을 알고 있어야하므로 클라이언트가 CONNECT host:port 요청 (요청의 본문 인 SSL 스트림)을 발행합니다.

여기서 중요한 점은 첫 번째 프록시가이 요청을 실제 대상 서버 대신 HTTPS Reverse Proxy으로 전달한다는 것입니다. 이 역방향 프록시는 클라이언트와의 SSL 협상을 처리하고 암호 해독 된 요청에 대한 액세스 권한을 가지며 일반 클라이언트로 작동하여 실제 대상 서버에 이러한 요청의 복사본 (선택적으로 변경된 버전)을 보냅니다. 대상 서버에서 응답을 가져오고 (선택적으로) 응답을 변경 한 다음 클라이언트로 다시 보냅니다.

관련 문제