当前位置: 首页 > news >正文

【Linux网络】ARP协议

ARP协议

虽然我们在这里介绍 ARP 协议,但是需要强调,ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。

ARP数据报的格式

在这里插入图片描述

字段长度(字节)说明
硬件类型2网络类型(如以太网为1)
协议类型2上层协议(如IP为0x0800)
硬件地址长度1MAC地址长度(以太网为6)
协议地址长度1IP地址长度(IPv4为4)
操作码21=请求,2=响应,3=反向请求(RARP),4=反向响应
发送方MAC地址6发送方物理地址
发送方IP地址4发送方IP地址
目标MAC地址6目标物理地址(请求时为全0或广播,响应时为目标主机MAC)
目标IP地址4目标IP地址
  • 注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
  • 硬件类型指链路层网络类型,1 为以太网;
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址;
  • 硬件地址长度对于以太网地址为 6 字节;
  • 协议地址长度对于和 IP 地址为 4 字节;
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。

ARP协议的作用

ARP 协议建立了主机 IP 地址和 MAC 地址的映射关系。

  • 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址;
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址。

ARP协议的工作流程

在这里插入图片描述

1. 发送ARP请求(广播阶段)

  • 触发条件:当主机A需要向主机B发送数据时,先检查自己的ARP缓存表(存储IP-MAC映射关系):
    • 若存在主机B的IP-MAC映射 → 直接使用MAC地址封装数据帧。
    • 若不存在映射 → 发起ARP请求。
  • 具体步骤
    • 构造ARP请求报文
      • 硬件类型:标识网络类型(如以太网为1)。
      • 协议类型:标识上层协议(如IP为0x0800)。
      • 发送方MAC地址:主机A的MAC地址(源物理地址)。
      • 发送方IP地址:主机A的IP地址(源IP)。
      • 目标MAC地址:全0(或FF-FF-FF-FF-FF-FF,广播地址)。
      • 目标IP地址:主机B的IP地址(待解析的IP)。
      • OP:设置为1
    • 广播发送:主机A将ARP请求以广播帧形式发送到局域网,所有主机均可接收。

2. 接收ARP请求并响应(单播阶段)

  • 首先判断OP字段,是否为请求MAC帧
  • 主机B的处理
    • 收到广播请求后,检查报文中的“目标IP地址”是否为自己的IP:
      • 若是 → 确认主机A的IP-MAC映射,将其存入自己的ARP缓存表。
      • 构造ARP响应报文(单播),包含自身的MAC地址,发送给主机A。
  • 其他主机的处理
    • 若目标IP不是自己的IP → 忽略该请求,不做响应。

3. 主机A更新ARP缓存表

  • 主机A收到主机B的单播响应后,解析出主机B的MAC地址,存入ARP缓存表,后续通信直接使用该MAC地址封装数据帧。

总结

  • 源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);
  • 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中;
  • 每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。
$ arp -a
_gateway (10.2.8.1) at fe:ee:7e:91:aa:82 [ether] on eth0

为什么要有缓存表?

  • 提高效率
  • 加快响应速度

为什么表项要有过期时间而不是一直有效?

  • 网络环境变化:网络中的设备可能会发生变动,如更换网卡、修改 IP 地址或更换设备等。
  • 安全性考虑:ARP 协议存在被攻击的风险,如 ARP 欺骗。

ARP缓存表的管理

  • 作用:存储IP地址与MAC地址的映射关系,避免重复发送ARP请求,提高通信效率。
  • 特性
    • 时效性:表项有生存周期(通常为几分钟,可通过arp -s手动设置),超时后自动删除,确保映射关系更新。
    • 手动操作
      • arp -a:查看本地ARP缓存表。
      • arp -d <IP>:删除指定IP的缓存项。
      • arp -s <IP> <MAC>:手动添加静态映射(用于网关或关键设备,避免动态解析失败)。

ARP协议的扩展与变种

1. 免费ARP(Gratuitous ARP)
  • 场景:主机主动发送ARP请求(即使不需要通信),用于:
    • 宣告自身存在(如服务器启动后)。
    • 检测IP地址冲突(主机发送自己IP的ARP请求,若收到响应则说明IP被占用)。
2. ARP代理(Proxy ARP)
  • 场景:当主机位于不同子网,但未配置路由器时,由中间设备(如路由器)代替目标主机回应ARP请求,使主机误以为对方在同一子网。
  • 风险:可能导致路由混乱,通常用于老旧网络环境。
3. ARP欺骗(ARP Poisoning)
  • 攻击原理:恶意主机伪造ARP响应,将错误的MAC地址注入其他主机的缓存表,导致数据流向攻击者而非目标主机(用于中间人攻击)。
  • 防御措施
    • 静态绑定关键设备的IP-MAC映射(如网关)。
    • 使用ARP检测工具(如arpwatch)监控异常ARP流量。
    • 启用交换机的端口安全或DHCP Snooping功能。

ARP协议与RARP的区别

  • ARP:已知IP地址,求MAC地址(正向解析)。
  • RARP(反向地址解析协议):已知MAC地址,求IP地址(已逐渐被DHCP取代)。

通过以上过程,ARP协议实现了IP地址到MAC地址的动态解析,是局域网通信的基础。理解其工作原理有助于排查网络连通性问题(如“arp -a”检查缓存是否正确),并防范ARP欺骗等安全威胁。

在这里插入图片描述

ARP欺骗原理

ARP欺骗的本质

ARP欺骗通过伪造ARP报文,篡改局域网内设备的ARP表,使目标设备错误地将数据包发送到攻击者控制的MAC地址,从而实现中间人攻击、流量窃取或阻断通信

ARP欺骗的常见类型与原理

1. 单向欺骗(欺骗目标主机)
  • 攻击方式
    攻击者(主机X)伪造ARP响应报文,向目标主机(如主机A)发送虚假的“IP地址Y对应的MAC地址是X的MAC”。
  • 结果
    主机A的ARP表被篡改,误以为主机Y的MAC地址是攻击者的MAC。当主机A向主机Y发送数据时,数据包会先发给攻击者,而非真实主机Y。
2. 双向欺骗(欺骗目标主机和网关)
  • 攻击方式
    • 攻击者向目标主机发送伪造的“网关IP对应的MAC是攻击者MAC”的ARP报文。
    • 同时向网关发送伪造的“目标主机IP对应的MAC是攻击者MAC”的ARP报文。
  • 结果
    • 目标主机与网关之间的流量全部经过攻击者中转,形成中间人攻击
    • 攻击者可窃取、篡改或阻断双方通信数据。
3. 泛洪攻击(ARP缓存污染)
  • 攻击方式
    攻击者向局域网内大量发送伪造的ARP报文,使所有主机的ARP表被无效的IP-MAC映射填满。
  • 结果
    设备无法建立正确的ARP表,导致网络瘫痪或通信中断。

四、ARP欺骗的攻击步骤(以双向欺骗为例)

  1. 获取目标信息
    攻击者通过扫描工具获取局域网内目标主机的IP地址和网关IP。
  2. 伪造ARP报文
    使用工具(如arpspoof)向目标主机和网关发送伪造的ARP响应,篡改双方的ARP表。
  3. 中转流量
    攻击者开启IP转发功能,使目标主机与网关的流量通过自己的设备中转,同时窃取或修改数据。
  4. 维持欺骗
    定期发送伪造ARP报文,防止目标设备因ARP缓存超时恢复正常映射。

五、ARP欺骗的危害

  1. 数据窃取:攻击者可捕获明文传输的账号密码、聊天内容等敏感信息。
  2. 流量篡改:篡改网页内容、植入恶意代码(如钓鱼页面)。
  3. 拒绝服务(DoS):通过ARP泛洪攻击导致网络瘫痪。
  4. 隐蔽攻击跳板:利用欺骗建立的中间人通道,进一步渗透内网其他设备。

在这里插入图片描述

http://www.xdnf.cn/news/505711.html

相关文章:

  • 使用Pinia持久化插件-persist解决刷新浏览器后数据丢失的问题
  • 使用python进行船舶轨迹跟踪
  • 编译原理7~9
  • 【Element UI】表单及其验证规则详细
  • python运算符
  • python训练营打卡第26天
  • Go语言 Gin框架 使用指南
  • js中不同循环的使用以及结束循环方法
  • 两个电机由同一个控制器控制,其中一个电机发生堵转时,另一个电机的电流会变大,是发生了倒灌现象吗?电流倒灌产生的机理是什么?
  • Gartner《How to Leverage Lakehouse Design in Your DataStrategy》学习心得
  • SAP HCM 0008数据存储逻辑
  • 《棒球万事通》球类运动有哪些项目·棒球1号位
  • c++ 运算符重载
  • 16 C 语言布尔类型与 sizeof 运算符详解:布尔类型的三种声明方式、执行时间、赋值规则
  • qt6 c++操作qtableview和yaml
  • 使用 CodeBuddy 开发一款富交互的屏幕录制与注释分享工具开发纪实
  • C语言查漏补缺
  • Codeforces Round 1024 (Div.2)
  • 【C/C++】C++返回值优化:RVO与NRVO全解析
  • 安全性(三):信息安全的五要素及其含义
  • Python-92:最大乘积区间问题
  • 从AI系统到伦理平台:技术治理的开放转向
  • docker部署第一个Go项目
  • 语音转文字并进行中英文翻译
  • 【JavaScript】 js 基础知识强化复习
  • 2025系统架构师---选择题知识点(押题)
  • JavaScript基础-作用域链
  • vue3: amap using typescript
  • 【2025 技术指南】如何创建和配置国际版 Apple ID
  • DeepSeek 赋能社会科学:解锁研究新范式