博客
关于我
DNS传输协议解析!pcap报文中的域名获取
阅读量:96 次
发布时间:2019-02-26

本文共 3994 字,大约阅读时间需要 13 分钟。

DNS协议详解

DNS(Domain Name System,域名系统)是互联网中用于将易于记忆的域名(如www.google.com)转换为机器可理解的IP地址(如172.217.27.142)的系统。通过DNS,用户无需记住复杂的IP地址即可访问网站,这大大简化了网络通信过程。

DNS解析过程

DNS解析过程主要包括以下几个步骤:

  • 询问(Query):用户输入域名(如www.google.com),DNS客户端向DNS服务器发送查询请求。
  • 解答(Response):DNS服务器返回相应的记录,通常为A记录,包含目标IP地址。
  • 递归或迭代:如果DNS服务器无法直接回答查询,会返回另一个DNS服务器(递归)或继续查找(迭代)。
  • DNS系统的作用

    DNS系统的核心作用是将人类友好的域名映射到机器友好的IP地址。IP地址是网络中计算机识别的标识符,但其长难记。通过DNS,用户可以用更简洁的方式访问网站。

    DNS传输协议

    DNS使用UDP协议(端口53)进行通信,因为UDP速度快且开销低。然而,对于复杂的DNS查询(如区域传输),TCP协议也被用于确保数据完整性。

    DNS报文结构

    DNS报文包括以下几个部分:

  • 头部(Header):包含标识符、标志位、查询数量、响应数量等信息。
  • 标志位(Flags):1位或4位位组,表示消息类型、权威性、递归查询等。
  • 查询部分(Questions):包含要解析的域名和记录类型(如A、AAAA、MX等)。
  • 答案部分(Answers):包含查询结果,包括域名、记录类型、类别、生存时间(TTL)等。
  • DNS查询格式

    DNS查询格式如下:

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| || QNAME || |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| QTYPE |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| QCLASS |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    • QNAME:域名,由标签组成,每个标签以其长度前缀。
    • QTYPE:记录类型代码,0x0001表示A记录。
    • QCLASS:记录类别代码,0x0001表示Internet地址。

    DNS回答格式

    DNS回答格式如下:

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| || || NAME || |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| TYPE |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| CLASS |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| TTL || |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| RDLENGTH |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|| RDATA || |+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
    • NAME:查询的域名。
    • TYPE:记录类型代码,0x0001表示A记录。
    • CLASS:记录类别代码,0x0001表示Internet地址。
    • TTL:记录可缓存的秒数。
    • RDATA:记录数据,根据类型不同而不同。

    DNS协议实现

    以下是DNS协议的代码实现示例:

    struct dnshdr {    uint16_t id;    uint16_t flags;    uint16_t quest;    uint16_t ans;    uint16_t auth;    uint16_t add;};struct dnshdr_name {    const char *ns_name;    int ns_name_len;    unsigned int labels;};static unsigned int qname_labels_count(const char *name, int name_len) {    unsigned int labels = 0;    if (name_len > 1) {        for (int i = 0; i < name_len; ++i) {            if (name[i] == '.') {                labels++;            }        }        labels++;    }    return labels;}int get_dns_name(u_char *dns_data, int offset, int max_len, int dns_data_offset, const char **name, int *name_len) {    int len;    len = expand_dns_name(dns_data, offset, max_len, dns_data_offset, name, name_len);    if (name[0] == '\0' && len <= MIN_DNAME_LEN) {        *name = "
    "; *name_len = (int)strlen(*name); return len; } if ((len < MIN_DNAME_LEN) || (len > MIN_DNAME_LEN && name_len == 0)) { printf("ReportedBoundsError\n"); } return len;}static void dissect_dns(u_char *data_info, int payload_len) { int used_bytes = 0; dnshdr_name dns_domain; used_bytes = get_dns_name(data_info, DNS_HDRLEN, 0, 0, &dns_domain.ns_name, &dns_domain.ns_name_len); dns_domain.labels = qname_labels_count(dns_domain.ns_name, dns_domain.ns_name_len); printf("ns_name: %s\n", dns_domain.ns_name); printf("ns_name_len: %d\n", dns_domain.ns_name_len); printf("labels: %d\n", dns_domain.labels);}static void confirm_dns_packet(struct ip *pIp) { int iIpTotalLen = ntohs(pIp->ip_len); int offset = 0; int nFragSeq = 0; struct udphdr *pUdpHdr = (struct udphdr *)(char *)pIp + (pIp->ip_hl < 2); if (pIp->ip_p == IPPROTO_UDP && (ntohs(pUdpHdr->dest) == DEFAULT_DNS_PORT_RANGE || ntohs(pUdpHdr->source) == DEFAULT_DNS_PORT_RANGE)) { printf("\n"); printf("info udp\n"); int iPayloadLen = iIpTotalLen - (pIp->ip_hl < 2) - 8; printf("UDP Payload Len %d\n", iPayloadLen); u_char *pDnsHdr = (u_char *)(pUdpHdr + 1); dissect_dns(pDnsHdr, iPayloadLen); }}

    DNS抓包示例

    以下是DNS协议的实际抓包示例:

    DNS Query:- Domain Name: www.google.com- Query Type: A- Class: 1DNS Response:- Name: www.google.com- Type: 1 (A Record)- Class: 1- TTL: 60- RDATA: 172.217.27.142

    总结

    DNS协议通过将易于记忆的域名映射到机器友好的IP地址,为互联网用户和设备提供了便利。深入理解DNS协议,建议参考RFC官方文档。

    欢迎关注微信公众号【程序猿编码】,加入技术交流群,共同探讨技术奥秘!

    转载地址:http://yuiy.baihongyu.com/

    你可能感兴趣的文章
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    node exporter完整版
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>
    Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
    查看>>