Linux 网络基础之数据链路层(十四)ARP协议及原理,ARP欺骗

发布时间:2026/5/26 3:54:09

Linux 网络基础之数据链路层(十四)ARP协议及原理,ARP欺骗 目录一、ARP协议ARP协议定位ARP基本原理ARP数据报格式二、ARP欺骗步骤一正常通信状态步骤二恶意主机发起双向步骤三恶意主机成为通信中间人三、总结上一篇文章我们详细讲解了以太网包括局域网和 MAC 地址的相关内容本片文章将讲解 ARP 协议完成网络通信的最后一个闭环。一、ARP协议所有跨网段的网络通信拆成每一段/每一跳到最后都是同一个局域网内的通信。在网络通信中数据需要从上到下逐层封装传输最终在数据链路层必须依靠 MAC 地址完成局域网内的交付而我们只能在网络层拿到 IP 地址这里就出现了一个关键缺口。第一种场景当通信目标主机 IP 和本机不在同一网段时我们没法直接发给目标主机只能先查路由表找到下一跳路由器的 IP。但即便知道了下一跳 IP要在局域网里把数据发过去还是必须拿到这台路由器的MAC 地址否则无法封装 MAC 帧、无法交付。第二种场景报文经过多跳路由终于到达目标主机所在的局域网此时路由器只知道目标主机的 IP却不知道它的 MAC 地址同样没法在局域网里精准找到这台主机、完成最后一跳交付。整条传输链路都是如此每经过一台路由器都要先查路由表得到下一跳 IP再确认双方是否在同一网段接着必须把 IP 转成 MAC才能封装数据继续转发。如果没有 IP 到 MAC 的转换数据链路层就无法识别接收方整个传输链条就会断掉。所以局域网内必须有一种协议专门负责把已知的 IP 地址解析成对应的 MAC 地址用来完成逐跳转发和最后交付这个协议就是ARP 地址解析协议。我们已经通过路由表查到了下一个路由器的 IP 地址为什么不能把报文直接发给路由器而是先要知道它的 MAC 地址呢原因很简单路由表管的是网络 IP 层真正在局域网里传送数据的是数据链路层 (以太网/MAC)两层分工不一样。路由表查到下一跳 IP只是告诉我们 “逻辑上要发给这个 IP”但报文最终要在局域网里传输必须封装成以太网帧而以太网帧只认 MAC 地址不认 IP 地址。同样数据链路层也看不懂 IP 地址它只能识别源 MAC、目的 MAC只能靠 MAC 地址判断这个帧该发给谁。所以就算我们知道了下一跳路由器的 IP 地址也没法直接发必须先通过 ARP 地址解析查到这个路由器 IP 地址对应的 MAC 地址把 MAC 填进帧头链路层才能把数据真正送到下一跳路由器的网卡上。我们再重新梳理一下 : 也就是最开始在网络 IP 层我们已经拿到数据报文了也通过当前主机的路由表查到了下一跳路由器的 IP 地址知道逻辑上要发给谁。但网络层往下交付必须交给数据链路层并封装成MAC 帧而以太网 MAC 帧只认 MAC 地址、不认 IP 地址因为它需要物理上的目标地址才能在局域网里传输。所以我们必须把我们已经知道的下一跳路由器的 IP 地址转化成对应 MAC 地址这个转换就是 ARP 协议做的事。拿到 MAC 地址后数据链路层把源 MAC、目的 MAC封装进帧头再把 IP 报文包在里面。这时我们就同时拥有网络层下一跳 IP用来路由选路数据链路层下一跳 MAC用来局域网实际投递之后就能把封装好的 MAC 帧在局域网里精准转发给下一跳路由器了。这里再补充一下路由表的相关知识:我们日常使用的电脑、手机等主机和路由器一样内部同样拥有路由表并不是只有路由器才具备路由功能。主机的路由表全程只记录网络层IP 地址相关的路由信息不会存储 MAC 地址它的核心任务就是判断收到的报文该从本机哪个网卡发出、下一跳该转发给哪个 IP 地址。主机判断目标主机是否与自己同网段、确定下一跳 IP 的逻辑是依靠本机 IP 地址 子网掩码进行计算比对当主机要发送报文时会先用子网掩码分别对自身 IP 和目标 IP 做运算判断二者是否处于同一局域网网段。如果目标主机和本机处于同一个网段路由表会匹配到直连路由报文直接在当前局域网内交付主机通过 ARP 查询目标 IP 对应的 MAC 地址封装成 MAC 帧后直接发给局域网内的目标主机。如果目标 IP不在同一网段主机路由表会匹配默认路由也就是当前发送主机所在局域网的出入口路由器网关。当本机路由表里所有网段规则都匹配不到目标 IP 时就会把报文统一发给这个默认网关(出入口路由器)由出入口路由器继续向外转发去外网寻找目标主机。因此这个默认路由里记录的 IP就是局域网网关、也就是出入口路由器的内网 IP。路由表只完成网络层的 IP 选路确定报文该交给哪一个 IP而不会处理数据链路层的地址。至于这个下一跳 IP 对应的物理 MAC 地址路由表并不负责记录会交给 ARP 协议完成 IP 到 MAC 的地址解析拿到 MAC 地址后主机再封装成完整以太网帧通过网卡真正把数据发送出去。电脑路由表里记录的是目标网段、下一跳 IP、本机出口网卡只处理网络层 IP 信息不存 MAC 地址。路由表来源分为三类第一直连路由电脑配置本机 IP 子网掩码后系统自动算出本机所在局域网网段生成直连路由表示该网段内所有 IP 都在本地局域网可直接发送。第二默认路由目标网段记为0.0.0.0/0代表所有路由表中匹配不到的目标 IP统一交给网关 (出入口路由器内网 IP) 转发由路由器去往其他网段寻找目标主机。第三手动静态路由或动态路由协议学习家用电脑很少用到。整个发包流程是主机先发数据包查询路由表确定下一跳 IP再通过ARP 协议把下一跳 IP 解析成 MAC 地址最后封装成 MAC 帧交给数据链路层发送。首先我们来明确一下路由表中 目标网段、下一跳 IP、本机出口网卡 这三个部分的作用:1. 目标网段的作用目标网段用来匹配你要发的目标 IP判断这条路由规则管不管它。比如你的直连路由目标网段是 192.168.2.0/24意思就是凡是目标 IP 属于这个网段都走这条规则直接在局域网发默认路由目标网段是 0.0.0.0/0意思是前面所有网段都匹配不上时所有剩下的 IP 都走这条规则发给网关。它就是路由表的「筛选条件」用来决定用哪一条路由。2. 下一跳 IP 怎么来的下一跳 IP不是拆报文现找是路由表规则里预先写死的直连路由没有下一跳 IP直接局域网投递默认路由下一跳 IP 固定写出入口路由器内网 IP如 192.168.2.1静态路由你手动填、或 DHCP / 动态协议下发好的。你发包时先拿目标 IP去匹配目标网段匹配成功后路由表直接告诉你下一跳发往这个 IP、从本机这个网卡出去。下一跳 IP 是规则自带的不是拆包现算。3. 本机出口网卡就是你电脑往外发数据走哪个硬件接口比如你电脑有有线网卡、无线网卡路由表会写明这条路由从有线网卡发或从无线网卡发。数据最终从这个网卡出去再封装 MAC 帧、发给下一跳 IP 对应的 MAC 地址。我们在来看这幅图用户 A192.168.2.2要给用户 B172.168.2.2发数据时会先查自己的路由表。它发现目标 IP 和自己不在同一网段于是匹配到默认路由下一跳就是局域网的出入口路由器192.168.2.1。接下来用户 A 通过 ARP 协议拿到出入口路由器左侧网口的 MAC 地址macLeft把数据封装成 MAC 帧源 MAC 是自己的 macA目的 MAC 是 macLeft再把这个帧发送给出入口路由器。出入口路由器收到数据帧后会先解封装拆掉 MAC 帧头拿到里面的 IP 数据包再读取其中的目标 IP172.168.2.2。出入口路由器再查自己的路由表判断目标 IP 不在左侧局域网需要转发到右侧网段。于是路由器通过 ARP 协议拿到下一跳设备或目标主机所在局域网的路由器的 MAC 地址这里就是右侧网口 macRight 对应的目标 MAC把 IP 数据包重新封装成新的 MAC 帧源 MAC 变成路由器右侧网口的 macRight目的 MAC 变成目标设备的 MAC再把这个新帧发往下一跳。这个过程会在每一台路由器上重复每到一台设备都先解封装 MAC 帧拿到 IP 报文中的目的 IP 地址再查路由表找到下一跳 IP然后通过 ARP 拿到对应的 MAC 地址重新封装 MAC 帧再发送一站一站接力传递。直到数据到达用户 B 所在局域网的最后一台出入口路由器。这台路由器查路由表发现目标 IP (172.168.2.2和自己的右侧网口172.168.2.1在同一网段于是它直接通过 ARP 协议查到用户 B 的 MAC 地址macB把 IP 数据包封装成源 MAC 为 macRight、目的 MAC 为 macB 的 MAC 帧直接发送给用户 B。用户 B 收到后逐层解封装最终把数据交付给应用层完成通信。真正的路由器拥有多个独立网口每个网口可以单独配置不同网段的 IP 地址分别对接不同的局域网这也是路由器能够实现跨网段转发的核心前提。路由器不会像交换机一样对未知数据向所有端口泛洪发送它的转发逻辑极其精准当数据包从某一个网口进入路由器后路由器会解封装数据帧读取报文的目标 IP 地址再查询自身路由表。路由表会明确匹配出该目标 IP 对应的唯一出口网口路由器只会在这个指定网口通过 ARP 解析对应设备的 MAC 地址、重新封装数据帧并转发数据绝对不会向自身其他闲置网口发送数据。简单来说路由器多个网口各司其职每个网口对应一个独立网段依靠路由表精准选路实现不同局域网之间的数据隔离与定向转发。ARP协议定位首先我们来明确一下 ARP 协议的定位:ARP协议是用于局域网通信的协议它不属于网络IP层而是属于数据链路层。虽然属于数据链路层但是是在MAC帧之上的那一层。因为在数据自上而下封装传输时我们需要先在网络层确定IP地址再通过ARP协议完成IP地址到MAC地址的解析转换拿到目标MAC地址后才能在数据链路层将其封装进MAC帧继续完成后续的发送流程。ARP基本原理我们用下面这个例子来说明 ARP 的基本原理假设此时主机 A 想知道主机 D 的 MAC 地址。此时主机 A 只知道主机 D 的 IP 地址想要获取主机 D 的 MAC 地址会先在整个以太网中进行广播全 FFF:FF:FF:FF:FF:FF代表广播地址。广播报文里源 MAC 地址是 macA目的 MAC 地址为全 F数据内容询问 “谁是 IP_D”类型字段为 0806代表 ARP 协议。这份报文从 macA 发出后主机 B、C、D 都能收到所有主机看到目的 MAC 是全 F识别为广播报文都会解包并向上交付到上层 ARP 协议处理。ARP 协议会比对报文中要查询的 IP_D 和本机 IP若不一致则直接丢弃报文只有主机 D 识别到查询的 IP_D 正是自己的 IP知道主机 A 在请求自己的 MAC 地址于是构建应答报文目的 MAC 设为 macA源 MAC 为 macD类型同样是 0806数据内容为 “我就是 IP_D我的 MAC 地址是 macD”。该应答报文在以太网中发送后其他主机发现目的 MAC 不是自身地址便直接丢弃只有主机 A 接收报文主机 A 解包后根据类型 0806 向上交付给 ARP 层提取数据里的 macD 地址至此主机 A 就获取到了主机 D 的 MAC 地址。因此 ARP 的基本过程就是在局域网中先广播查询、后单播应答的过程。ARP数据报格式ARP 数据包整体封装在以太网帧中最前面三个字段属于以太网帧头部分别是 6 字节以太网目的地址、6 字节以太网源地址、2 字节帧类型中间承载的是28 字节固定长度的 ARP 请求 / 应答报文ARP 报文整体作为 MAC 帧的数据有效载荷向下封装时需要完整加上 MAC 帧的头部与尾部。ARP 报文固定为 28 字节而以太网 MAC 帧对有效载荷的最小长度要求是 46 字节长度不足的部分会通过 PAD 填充补齐。设备识别报文是否为 ARP依靠以太网帧头部里2 字节的类型字段接收端分离有效载荷时依靠 MAC 帧固定的头部662 字节和尾部 4 字节 CRC 校验位完成拆分再根据帧类型判断协议类型如果识别为 ARP 协议就将报文交付给上层 ARP 协议处理。下面我们来看 28 字节 ARP 请求/应答报文的各个具体字段1. 第一个字段是 2 字节的硬件类型默认值为 1代表以太网2. 第二个字段是 2 字节的协议类型代表要转换的网络地址类型以太网中一般填 0x0800表示 IP 地址3. 第三个字段是 1 字节的硬件地址长度默认值为 6代表 MAC 地址的长度4. 第四个字段是 1 字节的协议地址长度默认值为 4代表 IP 地址的长度我们可以认为前四个字段是固定不变的。5. 第五个是 2 字节的 op 操作字段op 为 1 时代表 ARP 请求报文op 为 2 时代表 ARP 应答报文。6. 最后四个字段依次是发送端以太网地址6 字节、发送端 IP 地址4 字节、目的以太网地址6 字节、目的 IP 地址4 字节。其中前两个字段是发送方的 MAC 地址与 IP 地址在发送时就已经提前填写完成方便接收方应答时识别后两个是目标主机的 MAC 地址与 IP 地址发送方在发送 ARP 请求时只知道目标主机的 IP 地址还不知道它的 MAC 地址因此目的以太网地址默认填充为全 F。另外需要注意目的 MAC 地址在以太网首部和 ARP 报文中会各出现一次在以太网链路中存在冗余但适配其他类型网络时是必要的。现在我们把整个通信过程完整梳理主机 A 要和主机 E 进行通信但主机 A 只知道主机 E 的 IP 地址 IPE同时仅清楚自身的 IPA、macA局域网中每一台主机都具备完整协议栈并且都拥有独立的 ARP 层。构建ARP请求:通信的第一步是由主机 A 的 ARP 层发起 ARP 请求并构建对应的请求报文。首先按照规范固定填写 ARP 报文的前四个基础字段然后将 op 操作字段设置为 1用来标识这是一条 ARP 请求报文随后填写发送端以太网地址为 macA、发送端 IP 地址为 IPA由于主机 A 此时还不知道主机 E 的 MAC 地址因此目的以太网地址填充为全 F代表待查询最后将目的 IP 地址填写为主机 E 的 IPE至此 ARP 请求报文正式构建完成。虽然 ARP 协议和 MAC 帧同属于数据链路层但二者存在上下层级关系接下来需要将 ARP 请求向下交付进行 MAC 帧的封装。封装时要在 ARP 请求报文的前方依次添加以太网目的地址、以太网源地址、帧类型这三个字段在报文末尾添加 CRC 校验字段。其中以太网目的地址依旧填写全 F代表广播发送以太网源地址填写为主机 A 的 macA帧类型设置为 0806用来标识该帧的数据部分来自上层 ARP 协议。完成以上步骤后完整的 MAC 帧封装完毕主机 A 就会将这个 MAC 帧正式在整个局域网中广播发送以此查询主机 E 对应的 MAC 地址。进行广播:主机 A 广播发送的 MAC 帧在局域网中传输后会被包括主机 B、C、D、E 在内的所有主机接收。以主机 B 为例它收到 MAC 帧后会先分离帧的头尾提取出其中的 ARP 请求报文再根据帧类型字段 0806将报文交付给上层的 ARP 层处理。此时主机 B 的 ARP 层会检查 ARP 请求中的目的 IP 地址发现请求的是 IPE而非自身的 IPB便会直接丢弃该请求报文。同理主机 C、D 等所有非目标主机都会在自己的 ARP 层丢弃这条 ARP 请求。当主机 E 收到 MAC 帧时同样会先解析报头、提取出 ARP 请求并交付给自己的 ARP 层处理。主机 E 的 ARP 层拿到报文后首先会检查 op 字段确认这是一个 ARP 请求报文构建应答:主机 E 确认请求的 IP 与自身匹配后就会在自己的 ARP 层构建 ARP 应答报文。首先ARP 应答报文的前四个字段按规范固定填写op 字段设置为 2代表这是 ARP 应答报文接下来发送端以太网地址填写主机 E 自身的 macE发送端 IP 地址填写主机 E 自身的 IPE因为此时主机 E 是应答的发送方目的以太网地址填写主机 A 的 macA目的 IP 地址填写主机 A 的 IPA这两个信息主机 E 在收到 ARP 请求时已经从请求报文中获取到了。构建好 ARP 应答报文后主机 E 需要将其向下交付给数据链路层封装成完整的 MAC 帧。封装时在 ARP 应答报文的前方添加以太网目的地址、以太网源地址、帧类型字段在报文末尾添加 CRC 校验字段。其中以太网目的地址为主机 A 的 macA以太网源地址为主机 E 自身的 macE帧类型设置为 0806标识上层数据为 ARP 协议。完成封装后主机 E 将这个单播 MAC 帧发送到局域网中直接回复给主机 A。进行广播:主机 E 发送的 ARP 应答 MAC 帧在局域网中传输时局域网内的其他主机也会收到这个帧。当主机 B 收到该 MAC 帧时会解析帧头和有效载荷发现帧头中的以太网目的地址是 macA而不是自己的 macB便会判断出这不是发给自己的帧于是直接在 MAC 帧层丢弃这个数据帧不会再向上交付到 ARP 层。以此类推除主机 A 外的其他主机都会在 MAC 帧层直接丢弃该应答帧和之前 ARP 请求在 ARP 层丢弃的层级不同。当主机 A 收到这个 MAC 帧后会先分离报头和有效载荷发现以太网目的地址正是自己的 macA确认这是发给自己的帧接着通过帧类型字段 0806将数据交付给上层的 ARP 层处理。此时主机 A 的 ARP 层拿到报文后依旧会先查看 op 字段发现 op 值为 2便知道这是一个 ARP 应答报文对应自己之前发出的 ARP 请求随后读取 ARP 应答里的发送端以太网地址和发送端 IP 地址就成功获取到了主机 E 的 macE 和 IPE。至此主机 A 就完整拿到了主机 E 的 MAC 地址后续就可以封装普通数据的 MAC 帧正式向主机 E 发送数据了。首先局域网内的任何一台主机都可能面临两种 ARP 场景它既可能被其他主机发起 ARP 请求比如之前例子里被主机 A 查询的主机 E也可能主动向别人发起 ARP 请求 (比如发起查询的主机 A并在之后收到对应的 ARP 应答。无论是 ARP 请求还是 ARP 应答都可以通过报文中的op字段来明确区分op1代表请求op2代表应答。也正是因为这个原因主机收到 ARP 报文后会优先查看op字段以此判断这是一条请求报文还是应答报文再决定后续的处理逻辑。另外需要特别注意的是ARP 协议的工作对象不只是目标主机也可以是下一跳路由器。也就是说我们前面讲的 ARP 流程在网络传输的每一段局域网链路上都会重复执行 —— 主机和网关之间、路由器和路由器之间只要是需要跨网段转发数据就会通过 ARP 来解析下一跳设备的 MAC 地址这也是 ARP 协议在整个网络通信链路中无处不在的原因。ARP 的工作是不是在各自的局域网中是一直发生的?是的ARP 协议会在通信路径上的每一段局域网链路中反复执行每一次跨网段转发都需要重新解析下一跳设备的 MAC 地址如果每次通信都要完整走一遍 “广播请求 - 单播应答” 的流程会给整个网络带来不必要的开销降低传输效率。为了解决这个问题ARP 协议会将解析得到的 IP 与 MAC 地址映射关系缓存到主机本地的 ARP 缓存表中。这样后续需要通信时主机可以直接从缓存中读取对应的 MAC 地址无需再发起 ARP 请求大幅提升了通信效率。不过ARP 缓存条目并非永久有效它有固定的超时时间会定期更新这是因为 IP 地址和 MAC 地址的映射关系并非一成不变主机在不同时间、不同顺序接入网络时路由器分配的 IP 地址可能发生变化设备的网卡也可能更换因此需要定时刷新缓存避免使用过期的映射关系导致通信失败。不同操作系统的 ARP 缓存超时时间也存在差异且都不是固定值会采用动态调整或随机取值的机制Windows 系统默认超时时间在 15-45 秒之间且会根据使用频率动态调整频繁使用的条目可保留约 10 分钟不常用的条目约 2 分钟。Linux 系统默认基准超时时间为 30 秒实际超时时间会在 15-45 秒的范围内随机取值同时该超时时间支持手动配置修改。上图展示了 ARP 缓存表的实际查看方式同时引出了 RARP 协议的概念。在 Linux 和 Windows 系统中都可以通过arp -a命令查看本机的 ARP 缓存表表中记录了 IP 地址与对应 MAC 地址的映射关系还会标注该条目的类型是动态还是静态。其中动态条目是 ARP 协议自动学习并更新的会随着超时时间被刷新静态条目则是手动配置或系统预留的固定映射不会自动过期。而 ARP 协议的本质是通过 IP 地址查询对应的 MAC 地址如果反过来需要通过 MAC 地址查询对应的 IP 地址对应的就是逆地址解析协议 RARP。不过 RARP 协议现在已经几乎被淘汰很少在现代网络中使用只需要简单了解它的存在和作用即可。二、ARP欺骗ARP 欺骗的核心原理是利用ARP 缓存只会保留最新 IP-MAC 映射的漏洞由恶意主机伪造 ARP 应答报文篡改目标设备的 ARP 缓存表从而实现中间人攻击。结合图中主机 A、路由器 R、恶意主机 M 的场景完整过程分为三步步骤一正常通信状态正常通信状态在攻击发起前整个网络处于正常通信状态。主机 A 的 ARP 缓存中记录着网关路由器 R 的 IP 地址ipR与真实 MAC 地址macR的映射关系同时路由器 R 的 ARP 缓存中也正确记录着主机 A 的 IP 地址ipA与真实 MAC 地址macA的对应关系。此时主机 A 访问外部网络的所有流量都会正常发送给路由器 R路由器也会将回包正常转发给主机 A二者通信完全不受干扰。步骤二恶意主机发起双向伪造 ARP 应答恶意主机 M 开始执行攻击它向主机 A 和路由器 R大量伪造发送虚假 ARP 应答报文。一方面恶意主机 M 向主机 A 发送伪造 ARP 应答谎称 “我是网关 ipR我的 MAC 地址是 macM”另一方面它又向路由器 R 发送伪造 ARP 应答谎称 “我是主机 ipA我的 MAC 地址是 macM”。主机 A 收到虚假应答后会更新自身 ARP 缓存将网关 ipR 对应的 MAC 地址从真实的macR改为恶意主机的macM路由器 R 收到虚假应答后也同步更新 ARP 缓存将主机 ipA 对应的 MAC 地址从真实的macA改为macM。至此主机 A 和路由器 R 的 ARP 缓存均被篡改。步骤三恶意主机成为通信中间人完成缓存篡改后主机 A 发给路由器 R 的所有流量都会被错误发送至恶意主机 M而路由器 R 回传给主机 A 的所有流量也会被错误转发到恶意主机 M。恶意主机 M 会接收双方全部通信数据可查看、篡改流量内容再将数据转发给真实目标设备主机 A 与路由器 R 完全察觉不到异常。原本主机 A 与路由器 R 的直接通信全程被恶意主机 M 监听、控制恶意主机成功成为二者之间的中间人完成 ARP 欺骗攻击。三、总结ARP协议是解决IP地址到MAC地址转换的关键技术。当主机需要跨网段通信时路由表只能提供下一跳IP地址而实际数据传输需要MAC地址。ARP通过广播查询和单播应答机制完成地址解析发送方广播ARP请求目标主机单播回应从而建立IP-MAC映射关系。这个映射会被缓存以提高效率但会定期更新以防地址变更。值得注意的是ARP协议存在安全漏洞可能遭受ARP欺骗攻击恶意主机通过伪造ARP应答篡改ARP缓存实现中间人攻击。理解ARP协议的工作原理对网络通信和网络安全都至关重要。谢谢大家的观看!

相关新闻