如果我有IP,请使用Java跳过DNS查询

时间:2016-04-19 14:14:58

标签: java dns

如果我有域名列表及其IP地址,如何跳过DNS请求? scans.io提供了域名及其IP的列表,我想使用该列表而不是向DNS服务器发送查询。 有没有设置我自己的DNS服务器?

编辑: 原因是我有一个包含数百万个域名的大文件,我希望尽快抓取它们而不会被DNS服务器禁止。

3 个答案:

答案 0 :(得分:1)

如果您使用InetAddress.getByName(String)javadoc),则可以提供DNS名称或IP地址的字符串表示形式。在后一种情况下,该方法不会进行不必要的DNS查找。

  

当IP有多个网站时会发生什么?如果我没记错的话,这是可能的,只提供IP应该是不够的。

网站由网址标识,而不仅仅是DNS名称或IP地址。 URL为您提供主机名或IP地址,以及要使用的协议,端口号和路径。这些中的任何一个都可能导致您的HTTP请求被定向/重定向到不同的“站点”......无论这意味着什么。

基本上,连接到“网站”的过程如下:

  1. 主机名(或IP地址字符串)转换为地址
  2. 计算出端口号(来自协议和URL中的可选显式端口号。
  3. 客户端打开与上面确定的IP /端口的TCP连接
  4. 将URL发送到侦听HTTP起始行中IP /端口的服务器。
  5. 如果同一IP地址+端口上有多个“站点”(例如,因为多个主机名解析为同一个IP),那么服务器将根据起始线(可能还有其他“站点”)进行响应HTTP标头)。

    如果您的目标是减少HTTP交互的DNS查找,那么最好的办法是配置客户端DNS缓存。细节是特定于平台的。 Google可以帮助您查找详细信息。

    您还可以将DNS条目的大文件转换为“/ etc / hosts”语法,并将本地解析器指向它。

答案 1 :(得分:1)

有几种可能性。

如果不要求将DNS查找从数据文件限制到特定的Java进程,则可以将列表添加到系统的“hosts”文件中。在何处查找文件是特定于操作系统的,如果他们使用OS API调用从主机名解析IP,则必须考虑系统上运行的所有进程都将从hosts文件中获取匹配的IP。

如果Java VM支持,另一个选项是将主机名解析程序配置为使用除常规DNS查找之外的其他数据源。 Oracle的Java VM提供了这种可能性,您可以在网络属性文档的JNDI DNS service provider settings部分找到配置文档。也许有点过时,但this article还为您提供了一个完整的示例,说明如何使用sun.net.spi.nameservice中的API实现自己的NameService。

答案 2 :(得分:1)

您没有解释您希望如何处理您认为需要DNS查找的数据。如果您尝试在java中创建InetAddress对象,则可以调用InetAddress.getByAddress(host, addr)来构造InetAddress而不执行DNS查找。

请参阅https://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByAddress(java.lang.String,%20byte[])

要将地址转换为byte[],如果您知道地址是有效地址,请致电InetAddress.getByName(addr).getAddress()。它不会导致DNS查找。如果您不信任您的数据,您可能需要编写一个小函数来自己解析地址并构建一个字节数组。