2016-05-23 10 views
0

私はDNS用のPythonプロキシを持っています。 DNSリクエストを受け取ったら、元のソースに代わってdansguardianにhttpリクエストを渡す必要があります。リクエストに何が起きたのかを判断し、結果を得て、dansguardianからの応答に基づいてクライアントを別の場所にリダイレクトします。Python proxy - > dansguardian:元のソースIPを送信するには?

網状骨格はこのようなものです:、

Client -> DNS Proxy -> DG -> Privoxy -> Web. 

クライアントがAを要求DNSプロキシインターセプト、の答えを取得、クライアントの代わりにDGを尋ねる:1. DGがそれをフィルタ処理した場合、プロキシはローカルIPアドレスを送信A質問の実際のIPの代わりに。 2. DGがフィルタリングしなかった場合、DNSプロキシはクライアントのネットが自然に流れるようにします。ここで

は、私が試したサンプルPythonコードです:

 data,addr = sock.recvfrom(1024) 
     OriginalDNSPacket = data 
     # I get OriginalDNSPacket from a socket 
     # to which iptables redirected all port 53 packets 
     UDPanswer = sendQues(OriginalDNSPacket, '8.8.8.8') 
     proxies = {'http': 'http://127.0.0.1:8080'} # DG Port 
     s = requests.Session() 

     d = DNSRecord.parse(UDPanswer) 
     print d 
     ques_domain = str(d.questions[0].get_qname())[:-1] 
     ques_tld = tldextract.extract(ques_domain) 
     ques_tld = "{}.{}".format(ques_tld.domain, ques_tld.suffix) 
     print ques_tld 
     for rr in d.rr: 
      try: 
       s.mount("http://"+ques_tld, SourceAddressAdapter(addr[0])) # This was a silly try, I know. 
       s.proxies.update(proxies) 
       response = s.get("http://"+ques_tld) 
       print dir(response.content) 
       print response.content 
       if "Access Denied" in response.content: 
        d.rr = [] 
        d.add_answer(*RR.fromZone(ques_domain + " A " + SERVER_IP)) 
        d.add_answer(*RR.fromZone(ques_domain + " AAAA fe80::a00:27ff:fe4a:c8ec")) 
        print d 
        socket.sendto(d.pack(), addr) 
        return 
       else: 
        socket.sendto(UDPanswer, addr) 
        return 
      except Exception, e: 
       print e 
       pass 

REQはクライアントから来ている、のような質問は、私はDGに​​要求を送信する方法であり、それをだましますか?

+0

http://stackoverflow.com/help/mcve – boardrider

+0

ありがとうございます。@ボードライダーがそれを指摘してくれてありがとうございます。これまでに試したことのコードを少し追加しました。この質問は主にdansguardianとプロキシに関するものです。そのため、ここにコードを投稿する必要はないと思います。なぜなら、どうにか関係がなくなるからです。 – mtndesign

+0

いくつかのHTTPヘッダー(クライアントを識別する)を追加して、サーバーを欺くことはできませんか? – boardrider

答えて

0

dansguardian.confでは、有効にするにはusexforwardedforが必要です。

だから、confには次のようになります。

:私はちょうど私はそれが機能しなかったため、DG confのではなく前に試してみました、以下を追加する必要が

... 
# if on it adds an X-Forwarded-For: <clientip> to the HTTP request 
# header. This may help solve some problem sites that need to know the 
# source ip. on | off 
forwardedfor = on 


# if on it uses the X-Forwarded-For: <clientip> to determine the client 
# IP. This is for when you have squid between the clients and DansGuardian. 
# Warning - headers are easily spoofed. on | off 
usexforwardedfor = on 
... 

およびプロキシサーバー上の

response = s.get("http://"+ques_tld, headers={'X-Forwarded-For': addr[0]}) 

それは魅力的に機能しました。

ありがとう@boardrider。

関連する問題