【问题标题】:DNS over proxy?通过代理的 DNS?
【发布时间】:2012-10-22 11:04:13
【问题描述】:

在过去的几天里,我一直在寻找一种好的解决方案来防止通过 socks4/5 代理的 DNS 泄漏。

我查看了 SocksiPy(-branch) 模块,并尝试包装了许多东西(urllib、urllib2、dnstools),但它们似乎仍然会泄漏 DNS 请求。 pyCurl 也是如此。

我知道 proxychains/proxyresolv 可以通过 socks4/5 代理抛出 DNS 请求,并且它使用一些 LD_PRELOAD 库来猴子补丁套接字的功能,就像 SocksiPy 一样,但我似乎无法想象找出为什么它不通过 socks4 或 socks5 代理发送 DNS。

我想对于 linux,我可以使用带有 libproxychains.so 的 CTypes 来解决问题,但我正在寻找多平台的东西,所以我认为猴子修补套接字模块是要走的路。

有没有人想出一个解决这个问题的好方法?为了可移植性,我想在代码中完成这一切,我不想求助于运行另一个代理服务器!

谢谢!

【问题讨论】:

    标签: python dns proxy


    【解决方案1】:

    嗯,我想通了。您需要在开始使用套接字之前设置默认代理(例如,在导入任何使用它的东西之前)。您还需要对套接字的 getaddrinfo 部分进行猴子补丁,然后一切正常。

    import socks
    import socket
    
    # Can be socks4/5
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,'127.0.0.1', 9050)
    socket.socket = socks.socksocket
    
    # Magic!
    def getaddrinfo(*args):
        return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]
    socket.getaddrinfo = getaddrinfo
    
    import urllib
    

    这可以通过您导入的任何模块代替 urllib 工作并代理所有 DNS 请求。希望它可以帮助那里的人!

    编辑:您可以在我的 blog 上找到更新的代码和内容

    【讨论】:

    • 感谢此代码。很高兴解释一下使 DNS 正常工作的神奇部分,因为您的博客已关闭。
    • 啊,好电话!对于那个很抱歉。它被忽略了,你激励我在星期六晚上做点什么。 fitblip.pub/2012/11/13/proxying-dns-with-python(请原谅任何将要发生的疯狂的 CSS 事情)
    • 感谢您的解决方案。由于某种原因,它对我不起作用。你能在这里检查我的问题吗:stackoverflow.com/questions/34517669/…
    • @Alexandr:我已经就你的问题发布了一个可能的解决方案:)
    猜你喜欢
    • 2011-07-05
    • 2018-06-21
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多