【实验】 ARP协议抓包解析

一、实验需求

1.在本地电脑搭建环境进行ARP实验,要求能实现查看ARP请求与回应、ARP代理;
2.分析ARP请求与回应的报文结构;分析免费ARP的报文结构特征
3.实现ARP代理的配置。

二、拓扑搭建

实验环境:GNS3
抓包工具:Wireshark
配置:PC1:ip 172.16.0.1/24
           PC2:ip 172.16.0.2/24
拓扑图:

三、抓包分析

使用PC1 ping PC2,过程中产生了ARP报文,在PC1与SW的e1口抓到的ARP包如下:

1.分析ARP请求与回应的报文结构
首先分析序号7的ARP报文,报文结构如下:

    首先分析整体报文结构可看出ARP报文是跨四层封装的报文,没有四层报头。接下来分析应用层报文内容,首先可以看出这是一个ARP的request报文,二层类型为Ethernet,长度为6字节;三层类型为IPv4,长度为4字节。该报文是PC1-172.16.0.1发送出去请求目标IP-172.16.0.2的MAC地址的广播类型的报文。

接下来分析序号8的ARP报文,报文结构如下:


    可以看出该报文大部分结构与上一个报文相同,略微的不同之处在于这个报文是ARP的reply报文,是PC2单播向PC1发送的一个用于告知自己MAC地址的报文。

2.分析免费ARP的报文结构特征
依然分析上述抓包列表中的报文,分析序号1报文,结构如下:

    可以看出该报文与上面的ARP request报文更加类似,同样作为PC1发出的ARP请求报文,两者只有一点不同,上述报文是PC1为请求PC2的MAC广播发送的报文,而这个报文的请求目标IP是PC1本身-172.16.0.1,但是依然是一个目标MAC全F的广播报文。由此可以推断出,这是PC1发出的免费ARP报文,目的在于在网络中检测是否有其他IP地址与自己冲突。

3.实现ARP代理的配置
为实现ARP代理,需要重新搭建拓扑如下:(实验环境与抓包工具不变)

配置如下:
R1:f 0/0:IP 172.16.1.1/24
        f 0/1:IP 172.16.2.1/24
PC1:ip 172.16.1.2/24 网关:172.16.1.1
PC2:ip 172.16.2.2/24 网关:172.16.2.1

完成配置
再次使用PC1 ping PC2,过程中在PC1和R1的f 0/0口抓到ARP包如下:

经过查看这两个报文分别为PC1发出的ARP request报文和PC1收到的ARP reply报文:
请求报文:

回应报文:

    可以看出,在PC1 ping PC2的ping包发出前,PC1发出的ARP请求报文并没有直接向PC2请求(因为PC2和PC1不在同一网段),而是请求了网关R1-172.16.1.1的MAC地址,并且得到了网关的回应。

再查看此过程中PC2和R1的f 0/1口网段的抓包情况如下:

经查看可以确认是网关R1向PC2发出的ARP请求报文,和PC2向R1返回的ARP回复报文:
请求报文:

回复报文:

 

    可以看出,此次R1向PC2请求报文并不是普通的ARP请求广播报文,而是向PC2发送的单播报文请求MAC。

    综上分析可以发现,在PC1 ping PC2的过程中,路由器R1在其中起到了ARP代理的作用,它先是回复了PC1的ARP请求报文,又主动向PC2发送了ARP请求报文。在PC1和PC2的通信过程中,虽然PC1并没有直接请求到PC2的MAC地址,但是在二者共同的网关R1上已经同时有了两个PC的MAC,并且它还让两个PC有了自己与其对应的接口的MAC地址。从而使得PC1和PC2能够通过它的代理正常通信。ARP代理配置完成。

实验完毕。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinPcap是Windows平台下的网络封包捕获库,可以用来抓取网络数据包并进行分析处理,提供了对包括IP、TCP、UDP、ICMP等协议的支持,同时还支持ARP、RARP协议的抓取和解析。 在使用WinPcap进行ARP抓包解析时,需要先安装WinPcap库,并在代码中引入头文件pcap.h。接下来,可以使用pcap_open_live函数打开一个网络接口,并设置过滤规则进行抓包。在抓包的过程中,可以使用pcap_next_ex函数读取每一个数据包,并对其进行解析,获取ARP协议头部信息。 以下是一个简单的WinPcap编程实现ARP抓包解析的示例代码: ```c++ #include <stdio.h> #include <pcap.h> #include <arpa/inet.h> #include <netinet/in.h> #include <net/ethernet.h> #include <netinet/if_ether.h> #include <netinet/ip.h> #include <netinet/udp.h> #include <netinet/tcp.h> #include <netinet/ip_icmp.h> void arp_packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); int main(int argc, char *argv[]) { char *dev, errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct bpf_program fp; bpf_u_int32 mask; bpf_u_int32 net; // 获取第一个网络接口 dev = pcap_lookupdev(errbuf); if (dev == NULL) { printf("pcap_lookupdev failed: %s\n", errbuf); return 1; } // 获取网络接口的IP地址和子网掩码 if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { printf("pcap_lookupnet failed: %s\n", errbuf); return 1; } // 打开网络接口 handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { printf("pcap_open_live failed: %s\n", errbuf); return 1; } // 设置过滤规则,只抓取ARP数据包 if (pcap_compile(handle, &fp, "arp", 0, net) == -1) { printf("pcap_compile failed: %s\n", pcap_geterr(handle)); return 1; } if (pcap_setfilter(handle, &fp) == -1) { printf("pcap_setfilter failed: %s\n", pcap_geterr(handle)); return 1; } // 开始循环抓包,直到用户中断 pcap_loop(handle, -1, arp_packet_handler, NULL); // 关闭网络接口 pcap_close(handle); return 0; } void arp_packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { struct ether_header *eth_header; struct ether_arp *arp_header; char *src_mac, *dst_mac, *src_ip, *dst_ip; // 解析以太网头部 eth_header = (struct ether_header *) packet; src_mac = ether_ntoa((struct ether_addr *) eth_header->ether_shost); dst_mac = ether_ntoa((struct ether_addr *) eth_header->ether_dhost); // 解析ARP协议头部 arp_header = (struct ether_arp *) (packet + sizeof(struct ether_header)); src_ip = inet_ntoa(*(struct in_addr *) &arp_header->arp_spa); dst_ip = inet_ntoa(*(struct in_addr *) &arp_header->arp_tpa); // 打印ARP数据包信息 printf("ARP packet:\n"); printf("\tSource MAC: %s\n", src_mac); printf("\tDestination MAC: %s\n", dst_mac); printf("\tSource IP: %s\n", src_ip); printf("\tDestination IP: %s\n", dst_ip); } ``` 在以上代码中,先使用pcap_lookupdev函数获取第一个网络接口,并使用pcap_lookupnet函数获取该接口的IP地址和子网掩码。然后,使用pcap_open_live函数打开该接口,并使用pcap_compile和pcap_setfilter函数设置过滤规则,只抓取ARP数据包。 在抓包的过程中,使用pcap_loop函数循环处理每一个数据包,并调用arp_packet_handler函数进行解析和处理。在arp_packet_handler函数中,首先解析以太网头部和ARP协议头部,然后打印出这些信息。 需要注意的是,在解析ARP协议头部时,需要将ARP协议头部的地址转换为字符串形式,可以使用inet_ntoa函数将IP地址转换为字符串,使用ether_ntoa函数将MAC地址转换为字符串。 以上是一个简单的WinPcap编程实现ARP抓包解析的示例代码,可以根据实际需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值