【问题标题】:sending a reverse dns request using socket on 53 of localhost or a given dns server使用 localhost 的 53 或给定 dns 服务器上的套接字发送反向 dns 请求
【发布时间】:2013-06-23 20:49:37
【问题描述】:

我正在尝试获取 IPV4 地址的反向 DNS 结果。通过挖掘很简单dig -x 1.2.3.4。但是我必须在 Linux C 环境中使用套接字来获得相同的结果。最终我应该在recv* 函数中获得授权。我尝试通过将 IP 1.2.3.4 更改为 4.3.2.1.in-addr.arpa 将其在套接字中的缓冲区中发送到 DNS 服务器。首先,我为简单的 DNS 做的,我得到了正确的 DNS 响应(与dig foobar.com 相同)。我认为我的主要问题是在dig -x 1.2.3.4 中发送-x,因为dig foobar.com 是我能够做的事情......

【问题讨论】:

  • 你在说什么你把ip地址倒过来了? DNS 服务器有一个协议,这取决于您使用的 DNS 服务器架构。如果您知道拱门是什么,则可以通过查看规范来形成正确的请求。
  • 在进行反向查找时,您是否使用PTR 查询类型而不是A?这是dig -x 所做的一部分。
  • @Magn3s1um 谢谢,是的,我颠倒了 IP 地址,因为我在发送 dig -x 时看到问题部分转换为与我提到的相同的部分。实际上我是 DNS 服务器的新手,即使对于这项任务,它也不应该打扰我。我不知道拱门,但我只知道如何搜索 soa 记录,但仅供参考,我能够获得 PTR 记录将进一步移动以获取其他记录.
  • @ColinDBennett 谢谢,您的评论对我很有帮助,我正在搜索 4.3.2.1.in-addr.arpa 的记录,这是错误的。我尝试了 PTR,它再次工作,谢谢......
  • 好的,很高兴你成功了。我会将其作为答案发布,以供将来参考。

标签: c linux sockets dns


【解决方案1】:

在进行“反向”查找时(给定 IP 地址,查找域名),您需要使用 PTR 查询类型而不是 A。这是dig -x 所做的一部分。

【讨论】:

    【解决方案2】:

    您需要将其发送到特定的名称服务器,还是只使用正常的系统名称解析行为?如果是后者,则其标准接口为getnameinfo。它不是普通 C 的一部分(普通 C 实际上没有网络概念),但它在 POSIX 和 IETF RFC 中已标准化。如果您已经有一个struct sockaddr 指的是地址:

    char buf[256];
    getnameinfo(sa, sa_len, buf, sizeof buf, 0, 0, 0);
    

    是基本用法。如果您还没有sockaddr 格式的地址,请使用:

    struct addrinfo ai;
    char buf[256];
    getaddrinfo(ip_string, 0, 0, &ai);
    getnameinfo(ai->ai_addr, ai->ai_addrlen, buf, sizeof buf, 0, 0, 0);
    freeaddrinfo(ai);
    

    当然,您还应该检查返回值是否有错误。

    【讨论】:

    • 谢谢@R..,我必须把它寄给两个。我对那些标准接口不太熟悉。我读了它们,它们很好,会帮助我。目前,我能够从指定的名称服务器以及本地获取 dns 响应(PTR,A)。并尝试根据我的需要对其进行解析.. 再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2019-04-27
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多