避免RDNS查找HTTP请求

时间:2012-11-07 17:48:56

标签: python linux sockets reverse-dns

我尝试使用python设置HTTP连接,使用以下代码。我自己进行DNS解析,因为我无法更改相关计算机上的hostsresolv.conf文件。

class resolver(object):
    def __init__(self, server):
        self.server = server
    def __call__(self, host):
        res = check_output('host %s %s' % (host, self.server), shell = True)
        ips = findall('has address (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', res)
        return choice(ips)

class http_connection(httplib.HTTPConnection):
    dns_server = '8.8.8.8'
    def connect(self):
        resolv = resolver(http_connection.dns_server)
        self.sock = socket.create_connection((resolv(self.host), self.port), self.timeout)
...
x = http_connection('%s:%d' % (args.host, args.port))
x.request('GET','/start/')
rep = x.getresponse()
print rep.read()

一切正常,我从DNS获取IP,创建套接字(使用ip-port对,而不是主机名),我得到答案。唯一的问题是,它需要很长时间,最多5-6秒。经过调试后,我发现由于某种原因,对已解析的IP进行反向DNS查找,会超时。我通过在/ etc / hosts中添加一个条目来验证这是在另一台机器上再现它的问题,一切都按照我的预期运行。此外,对于它的价值:使用curl或wget也导致了RDNS。

我看到两种方法可以解决这个问题,但无法找到实际实现方法:

  1. 理想情况下,我确实需要反向查找来匹配默认行为 尽可能地,有一种方法可以强制执行此查找 我自己提供的dns_server(不在resolv.conf中)。
  2. 如果那是不可能的,我可以在某个地方禁用此RDNS吗?我可以去 达到setsockopt级别。

1 个答案:

答案 0 :(得分:1)

我终于找到了解决这个问题的方法。显然,当我没有自己明确提供源地址并让系统选择时会发生这种情况。我想Linux会做一些技巧来找出最适合使用的接口,而RDNS就是其中之一。

通过提供如下的source_address,一切正常:

class http_connection(httplib.HTTPConnection):
    def __init__(self, dns_server, *args, **kwargs):
        httplib.HTTPConnection.__init__(self, *args, **kwargs)
        self.resolv = resolver(dns_server, self.source_address)
    def connect(self):
        self.sock = socket.create_connection((self.resolv(self.host), self.port), self.timeout, self.source_address)
...
x = http_connection(args.dns_server, '%s:%d' % (args.host, args.port), source_address = (args.source_address, 0))