【问题标题】:Python proxy -> dansguardian: How to send original source ip?Python代理-> dansguardian:如何发送原始源IP?
【发布时间】:2016-09-20 08:41:55
【问题描述】:

我有一个用于 DNS 的 python 代理。当我收到一个 DNS 请求时,我需要代表原始源将一个 http 请求传递给 dansguardian,让它决定该请求会发生什么,获取结果并根据 dansguardian 的响应将客户端重定向到其他地方。

网络骨架是这样的:

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

客户端请求A,DNS Proxy 拦截,代表客户端询问DG,得到答案: 1. 如果DG 过滤,proxy 发送一个本地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

问题是我如何将请求发送给 DG,然后欺骗它,比如请求来自客户端?

【问题讨论】:

  • 感谢@boardrider 指出这一点。我添加了一些到目前为止我尝试过的代码。这个问题主要是关于 dansguardian 和一般代理的,这就是为什么我觉得没有必要在这里发布任何代码,因为无论如何它都会变得无关紧要。
  • 你不能添加一些 HTTP 标头(标识客户端)来“欺骗”服务器吗?
  • 这是我的初衷,但没有运气。我对 X-Forwarded-For 非常有希望,但也没有运气。
  • user-agent 呢?

标签: python filter proxy dns


【解决方案1】:

在 dansguardian.conf 中,usexforwardedfor 需要启用。

所以 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
...

在代理服务器上,我只需要添加以下内容,我之前尝试过,但由于 DG conf 它不起作用:

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

它就像一个魅力。

感谢@boardrider。

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 2016-07-23
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2012-08-09
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多