<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ARP on My Blog</title><link>/tags/arp/</link><description>Recent content in ARP on My Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 13 May 2018 00:00:00 +0000</lastBuildDate><atom:link href="/tags/arp/index.xml" rel="self" type="application/rss+xml"/><item><title>ARP原理和ARP攻击</title><link>/2018/05/13/arp%E5%8E%9F%E7%90%86%E5%92%8Carp%E6%94%BB%E5%87%BB/</link><pubDate>Sun, 13 May 2018 00:00:00 +0000</pubDate><guid>/2018/05/13/arp%E5%8E%9F%E7%90%86%E5%92%8Carp%E6%94%BB%E5%87%BB/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;ARP（Address Resolution Protocol）地址解析协议，目的是实现IP地址到MAC地址的转换。&lt;/p&gt;
&lt;p&gt;在TCP/IP协议栈中，最不安全的协议莫过于ARP了，我们经常听到的网络扫描，内网渗透，流量欺骗等等，他们基本上都与ARP有关系，甚至可以说，他们的底层都是基于ARP实现的。但是ARP的是实现仅需一问一答的两个包即可，实现上很简单。&lt;/p&gt;
&lt;p&gt;目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ARP协议&lt;/li&gt;
&lt;li&gt;ARP数据包信息&lt;/li&gt;
&lt;li&gt;ARP攻击&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="一arp协议"&gt;一、ARP协议&lt;/h3&gt;
&lt;p&gt;ARP（Address Resolution Protocol）地址解析协议，目的是实现IP地址到MAC地址的转换。&lt;/p&gt;
&lt;p&gt;在计算机间通信的时候，计算机要知道目的计算机是谁（就像我们人交流一样，要知道对方是谁），这中间需要涉及到MAC地址，而MAC是真正的电脑的唯一标识符。&lt;/p&gt;
&lt;p&gt;为什么需要ARP协议呢？因为在OSI七层模型中，对数据从上到下进行封装发送出去，然后对数据从下到上解包接收，但是上层（网络层）关心的IP地址，下层关心的是MAC地址，这个时候就需要映射IP和MAC。&lt;/p&gt;
&lt;p&gt;ARP之简单请求应答&lt;/p&gt;
&lt;p&gt;​ 当两台计算机在同一个局域网通信，我们以ping命令为例，该命令使用的ICMP协议&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20211028215821598" loading="lazy" src="/2018/05/13/arp%E5%8E%9F%E7%90%86%E5%92%8Carp%E6%94%BB%E5%87%BB/image-20211028215821598.png"&gt;&lt;/p&gt;
&lt;p&gt;PC1依据OSI模型①依次从上至下对数据进行封装，包括对ICMP Date加IP包头的封装，但是到了封装MAC地址的时候，②PC1首先查询自己的ARP缓存表，发现没有IP2和他的MAC地址的映射，这个时候MAC数据帧封装失败。我们使用ping命令的时候，是指定PC2的IP2的，计算机是知道目的主机的IP地址，能够完成网络层的数据封装，因为设备通信还需要对方的MAC地址，但是PC1的缓存表里没有，所以在MAC封装的时候填入不了目的MAC地址。&lt;/p&gt;
&lt;p&gt;那么PC1为了获取PC2的MAC地址，③PC1要发送询问信息，询问PC2的MAC地址，询问信息包括PC1的IP和MAC地址、PC2的IP地址，这里我们想到一个问题，即使是询问信息，也是需要进行MAC数据帧的封装，那这个询问信息的目的MAC地址填什么呢，规定当目的MAC地址为ff-ff-ff-ff-ff-ff时，就代表这是一个询问信息，也即使后面我要说的广播。&lt;/p&gt;
&lt;p&gt;PC2收到这个询问信息后，将这里面的IP1和MAC1（PC1的IP和MAC）添加到本地的ARP缓存表中，然后④PC2发送应答信息，对数据进行IP和MAC的封装，发送给PC1，因为缓存表里已经有PC1的IP和MAC的映射了呢。这个应答信息包含PC2的IP2和MAC2。PC1收到这个应答信息，理所应当的就获取了PC2的MAC地址，并添加到自己的缓存表中。&lt;/p&gt;
&lt;p&gt;经过这样交互式的一问一答，PC1和PC2都获得了对方的MAC地址，值得注意的是，目的主机先完成ARP缓存，然后才是源主机完成ARP缓存。之后PC1和PC2就可以真正交流了。&lt;/p&gt;
&lt;p&gt;ARP之广播请求单播回应&lt;/p&gt;
&lt;p&gt;​ 上图面的图解是不完全的ARP协议，因为在局域网里边不会只有两台主机，这里就要考虑如何在局域网众多主机里获得目的主机的MAC。&lt;/p&gt;
&lt;p&gt;&lt;img alt="blob.png" loading="lazy" src="/2018/05/13/arp%E5%8E%9F%E7%90%86%E5%92%8Carp%E6%94%BB%E5%87%BB/1520254833289026.png"&gt;&lt;/p&gt;
&lt;p&gt;和上面的一样，刚开始PC1并不知道PC2的MAC地址，同样需要发送ARP请求，但是这个局域网里主机很多，怎么唯独获取PC2的MAC呢，①我们想到和一群陌生人交流一样，可以挨着询问一遍，这就是我们要说的广播，首先PC1广播发送询问信息（信息和上一张图介绍的一样），在这个普通交换机上连接的设备都会受到这个PC1发送的询问信息。&lt;/p&gt;
&lt;p&gt;接下来②需要做的是，所有在这个交换机上的设备需要判断此询问信息，如果各自的IP和要询问的IP不一致，则丢弃，如图PC3、Route均丢弃该询问信息，而对于PC2判断该询问信息发现满足一致的要求，则接受，同样的写入PC1的IP和MAC到自己的ARP映射表中。&lt;/p&gt;
&lt;p&gt;最后，③PC2单播发送应答信息给PC1，告诉PC1自己的IP和MAC地址。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="二arp数据包信息"&gt;二、ARP数据包信息&lt;/h3&gt;
&lt;p&gt;ARP数据的详细信息列表如下&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardware type&lt;/th&gt;
&lt;th&gt;硬件类型，标识链路层协议&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol type&lt;/td&gt;
&lt;td&gt;协议类型，标识网络层协议&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware size&lt;/td&gt;
&lt;td&gt;硬件地址大小，标识MAC地址长度，这里是6个字节（48bit）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol size&lt;/td&gt;
&lt;td&gt;协议地址大小，标识IP地址长度，这里是4个字节（32bit）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opcode&lt;/td&gt;
&lt;td&gt;操作代码，标识ARP数据包类型，1表示请求，2表示回应&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sender MAC address&lt;/td&gt;
&lt;td&gt;发送者MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sender IP address&lt;/td&gt;
&lt;td&gt;发送者IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target MAC address&lt;/td&gt;
&lt;td&gt;目标MAC，此处全0表示在请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target IP address&lt;/td&gt;
&lt;td&gt;目标IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ARP请求包&lt;/p&gt;
&lt;p&gt;&lt;img alt="blob.png" loading="lazy" src="/2018/05/13/arp%E5%8E%9F%E7%90%86%E5%92%8Carp%E6%94%BB%E5%87%BB/1520257991176324.png"&gt;&lt;/p&gt;
&lt;p&gt;ARP应答包&lt;/p&gt;
&lt;p&gt;内容格式和上图相似，不过会有目的地址对应的MAC地址，ARP数据包类型字段为2。&lt;/p&gt;</description></item></channel></rss>