【问题标题】:avoid RDNS lookup for an HTTP request避免对 HTTP 请求进行 RDNS 查找
【发布时间】:2012-10-27 20:06:32
【问题描述】:

我尝试使用以下代码使用 python 建立 HTTP 连接。我自己解析 DNS,因为我无法更改相关机器上的 hosts 和 resolv.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 级别。

【问题讨论】:

  • 你试过只用socket.connect()吗?
  • 是的,好主意,但我确实尝试自己设置套接字连接,而不是使用create_connection,因为我注意到那里有一个getaddrinfo。我得到了同样的结果。我找到了一种绕过它的方法,但是会发布答案。

标签: python linux sockets reverse-dns


【解决方案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))

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2014-12-01
    • 2011-04-17
    相关资源
    最近更新 更多