2012-10-27 2 views
3

투명 프록시 프록시를 만들려고합니다.입니다. 목적은 브라우저와 웹 서버 사이에 있고 보이지 않게하는 것입니다. 여기에 제가 사용하고있는 코드가 있습니다. 불행히도 그것은 잘 작동하지 않습니다. 웹 페이지 ($base_uri으로 참조)를 열면 브라우저 만 사용할지 또는 브라우저와 프록시 사용 여부에 따라 결과가 달라집니다. 나는 "transfer-encoding: chunked"을 포함하여 모든 종류의 응답을 반환하는 웹 사이트에서 시도하고 있습니다 (그래서 나는 거기에있을 수있는 문제가있을 것이라고 생각합니다!). 쿠키에 문제가있을 수 있다고 생각하지만 해결 방법을 모른다 (있는 경우 ...).Perl 투명 프록시

#!/usr/bin/perl 

use strict; 

use HTTP::Daemon; 
use LWP::UserAgent; 
use HTTP::Cookies; 

my $cookie_jar = HTTP::Cookies->new(); 

my $ua = LWP::UserAgent->new(max_redirect => 0, env_proxy => 0,keep_alive => 1, timeout => 30, agent => "Mozilla/4.76 [en] (Win98; U)"); 
my $d = HTTP::Daemon->new( 
    LocalHost => "localhost", # remove this to listen from other machines 
        # (i.e. open-relay... be careful of spammers!) 
    LocalPort => 33331 
) || die; 
print "[Proxy URL:", $d->url, "]\n"; 

fork(); fork(); fork(); # 2^3 = 8 processes 

$ua->cookie_jar($cookie_jar); 

my $base_uri = 'http://example.com/'; 

while (my $c = $d->accept) { 
     while (my $request = $c->get_request) { 
      my $uri = $base_uri . $request->uri->as_string(); 
      my $method = $request->method; 
      my $req = HTTP::Request->new($method, $uri); 

      $request->uri($uri); 

      print "[[ $method >> $uri ]]\n"; 
      my $response = $ua->simple_request($request); 
      $c->send_response($response); 
     } 
    $c->close; 
    undef($c); 
} 

감사합니다.

+0

정말 프록시가 필요합니까? 아니면 그냥 데이터를 기록하고 싶습니까? 마지막으로 wireshark와 같은 스니퍼를 사용하십시오 –

+3

[미리 정의 된 HTTP 프록시 모듈] (https://metacpan.org/search?q=http%20proxy) 중 일부를 고려해 보셨습니까? – Schwern

+0

예, 정말 필요합니다. –

답변

0

당신이 정말로 원하는 것이 분명하지 않습니다. 당신은 훨씬 더 잘 묘사해야합니다. 무엇이 왜 필요한지 설명하고 필요한 기능이 무엇인지 설명하면 도움이 훨씬 더 잘 될 수 있습니다. 그럼에도 불구하고 나는 시도 할 것이다.

현재 들어오는 연결을 취하고 URI와 호출 방법을 추출하여 원본에 전달하는 것입니다. HTTP는 훨씬 더 복잡합니다. 전송 된 데이터 (예 : POST 요청)와 모든 헤더 행 (쿠키, 로그인 데이터, 브라우저 식별, 언어 사양 등)을 제거합니다. 이는 중요한 정보를 전달합니다 . 또한 타이밍 동작을 많이 수정합니다. 그런 다음 프록시 대상으로 보냈습니다.

이제 서버 응답을 받고 관련된 모든 것을 제거하십시오. 또한 응답이 끝나면 답장을 보냅니다. 스트리밍 데이터의 경우에는 작동하지 않습니다 (이미 청크 분할 전송 모드에 대해 언급 했음). 또한 방법을 사용하면 대용량 파일 (예 : DVD 이미지 - 4GB)에 많은 메모리가 필요합니다. 응용 프로그램 실제 제안이 가능하지에 대한 자세한 내용없이

하지만, 몇 가지 아이디어 :

가) 코멘트에 말했듯이 가능 펄 모듈이 있습니다. 당신은 그것들을 시험하고 당신의 필요에 맞는지를 볼 수 있습니다.

b) 레벨을 낮출 수 있습니다. IO::Socket::INET 또는 INET6을 사용하고 소켓 레벨에서 직접 작업하십시오. 들어오는대로 각 패킷을 직접 출력으로 보냅니다. 거의 100 % 투명합니다 (IP 주소 및 TCP 패킷 크기 제외). 데이터를 변경하거나 검사하려는 경우 HTTP 자체를 직접 관리해야하므로 요즘은 (특히 전송 인코딩으로 인해) 실제로 복잡 할 수 있습니다.

c) 코드를 작성하지 않고 기존 프록시 (예 : Apache 웹 서버 또는 특정 프록시 프로그램)를 사용하십시오.