DNS传输协议解析!pcap报文中的域名获取

回想一下,当我们想访问谷歌的时候,通常输入域名(网址):https://www.google.com,其实这就是一个域名。

DNS 解析过程涉及将主机名(例如 https://www.google.com)转换为计算机友好的 IP 地址(例如 172.217.27.142)。Internet 上的每个设备都被分配了一个 IP 地址,必须有该地址才能找到相应的 Internet 设备 。就像使用街道地址来查找特定住所一样。

我们今天主要做的就是解析DNS协议中的域名。

域名系统(DNS)

IP地址是计算机识别Internet上其他计算机的方式。IP地址并不是特别友好。谁想记住一个地址为 34.25.19.8?或者更长的IPV6地址:2401:8954:3291:26a4:7830:8c12:78ce:95c1?

该域名系统(DNS)给了我们人类一种简单的方法来找出我们想要去访问的互联网。我们只需输入“ www.google.com”之类的域名。

一个域名是人类友好的地址,一个网站,东西很容易让我们记住。

DNS传输协议

DNS使用端口53上的用户数据报协议(UDP)来服务DNS查询。首选UDP协议,因为它速度快且开销低。DNS查询是来自DNS客户端的单个UDP请求,然后是来自服务器的单个UDP答复。

/* 用于DNS的端口。  */
#define DEFAULT_DNS_PORT_RANGE   "53"
#define DEFAULT_DNS_TCP_PORT_RANGE   "53,5353" /*包括mDNS  */
#define SCTP_PORT_DNS             53
#define UDP_PORT_MDNS           5353
#define UDP_PORT_LLMNR          5355
#define TCP_PORT_DNS_TLS         853
#define UDP_PORT_DNS_DTLS        853

如果DNS响应大于512字节,或者DNS服务器正在管理区域传输之类的任务,则使用传输控制协议(TCP)代替UDP,以实现数据完整性检查。

DNS报文结构
DNS通信通过两种消息发生:查询和响应。DNS查询格式和响应格式都具有以下结构

在这里插入图片描述

Header部分 包含标识、查询数量、响应数量、和其他资源记录数。
Flags字段 包含1位或4位的部分,指示消息的类型,名称服务器是否权威;查询是否是递归的,请求是否被截断以及状态。
Questions部分包含 要解析的域名和记录类型(A,AAAA,MX,TXT等)。域名中的每个标签都以其长度为前缀。
Answer 具有查询名称的资源记录。

DNS Questions

DNS Questions的格式为:

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
| QNAME |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

QNAME以标签序列表示的域名,其中每个标签由一个长度组成八位位组,后跟该八位位组的数量。域名以零长度结尾八位位组,表示根的空标签。

QTYPE一个两个八位字节的代码,用于指定查询的类型。您应该为此项目使用0x0001 ,代表A记录(主机地址)。如果您要完成此项目的研究生版本,您还需要将0x000f用于邮件服务器(MX)记录,并将0x0002用于名称服务器(NS)记录。

QCLASS一个两个八位字节的代码,用于指定查询的类。您应该为此始终使用0x0001项目,代表Internet地址。

Wireshark抓包报文查询格式:
在这里插入图片描述

DNS Answers

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
| |
| NAME |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
| RDATA |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

NAME查询的域名,与Questions中的QNAME格式相同。TYPE包含第一个类型代码的两个八位位组。此字段指定数据的含义RDATA字段。您应该准备好解释类型0x0001 ( A记录)和类型0x0005( CNAME )。

如果您要完成此项目的研究生版本,则还应该准备接受类型0x0002 (名称服务器)和0x000f (邮件服务器)。

CLASS两个八位字节,用于指定RDATA字段中数据的类别。您应该期望0x0001该项目的Internet地址。

TTL可缓存结果的秒数。

RDLENGTH RDATA字段的长度。

RDATA响应的数据。格式取决于TYPE字段

Wireshark抓包报文响应格式:
在这里插入图片描述

DNS协议解析主要代码实现:

int main(int argc, char* argv[])
{
    char errbuf[1024];
    pcap_t *desc = 0;

    char *filename = argv[1];
    if (argc != 2)
    {
        printf("usage: ./dissect_dns [pcap file]\n");
        return -1;
    }

    return 0;
}


输出结果:

在这里插入图片描述

总结

DNS协议可帮助Internet用户和网络设备使用人提供可读的主机名,而不是数字IP地址来发现网站。
对于,深入的理解DNS协议,大家可以看看RFC官方文档。

参考:https://www.rfc-editor.org/info/rfc1035

欢迎关注微信公众号【程序猿编码】,需要DNS源码和报文的添加本人微信号(17865354792)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值