补—数据链路层
六、ARP协议
6.1 定义
ARP(地址解析协议)是一个比较特殊的协议——它介于数据链路层和网络层之间,既不是纯粹的数据链路层协议,也不是纯粹的网络层协议。
ARP的作用:建立主机IP地址和MAC地址的映射关系
为什么需要ARP?
网络通信时,源主机知道目的主机的IP地址和端口号,但不知道目的主机的硬件地址
数据包是先被网卡硬件接收,再交给上层协议处理的
因此,在通信之前,必须先获得目的主机的MAC地址
6.2 工作流程
可以概括为:广播请求,单播应答。
具体步骤:
1、主机A想和主机B通信,知道B的IP地址,但不知道B的MAC地址
2、主机A发送ARP请求包,以广播形式发送到整个局域网:
以太网帧目的MAC填 FF:FF:FF:FF:FF:FF
ARP请求中包含:发送端IP、发送端MAC、目标IP、目标MAC
请求内容:"IP地址是172.20.1.2的主机,你的MAC地址是多少?"
3、同一网段的所有主机都收到这个广播请求,但只有IP地址匹配的主机B会处理
4、主机B发送ARP应答包,以单播形式直接回给主机A:
以太网帧目的MAC填主机A的MAC地址
ARP应答中包含:发送端IP、发送端MAC
应答内容:"我就是172.20.1.2,我的MAC地址是08:00:20:74:CE:EC"
5、主机A收到应答后,就知道了主机B的MAC地址,可以正常通信了
6.3 缓存表
每次通信都发ARP请求?那也太低效了。实际上,每台主机都维护一个ARP缓存表,用来存放最近学到的IP-MAC映射关系。
查看ARP缓存表:
$ arp -a gateway (192.168.1.1) at 10:bd:18:08:af:62 [ether] on enp0s3 ? (192.168.1.107) at e4:f8:9c:be:af:41 [ether] on enp0s3两个问题:
Q1:为什么要有缓存表?
如果每次通信都发ARP请求,网络上会充斥大量ARP广播,效率很低。有了缓存表,大部分通信直接查表就能拿到MAC地址,不需要每次都请求。
Q2:为什么表项要有过期时间而不是一直有效?
因为网络环境是动态的——主机可能更换网卡、可能更换IP地址、可能下线了。如果缓存永久有效,就会出现"IP还对应着旧MAC"的问题,导致通信失败。
6.4 数据报格式
ARP报文封装在以太网帧中传输,其格式如下:
各字段含义:
| 字段 | 长度(字节) | 含义 |
|---|---|---|
| 硬件类型 | 2 | 链路层网络类型,1表示以太网 |
| 协议类型 | 2 | 要映射的协议地址类型,0x0800表示IP |
| 硬件地址长度 | 1 | 硬件地址长度,以太网为6 |
| 协议地址长度 | 1 | 协议地址长度,IPv4为4 |
| op | 2 | 操作类型:1=ARP请求,2=ARP应答 |
| 发送端以太网地址 | 6 | 发送方MAC地址 |
| 发送端IP地址 | 4 | 发送方IP地址 |
| 目的以太网地址 | 6 | 目标MAC地址 |
| 目的IP地址 | 4 | 目标IP地址 |
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求/应答报文中各出现了一次。对于以太网来说确实有些冗余,但ARP协议设计时考虑了通用性——如果链路层不是以太网,而是其他类型的网络,这两份地址就不一定相同了。
6.5 在局域网中的完整过程
场景说明:
局域网中有多台主机(A、B、C、D、E)和一台路由器(网关)
路由器连接外网和局域网
路由器的接口有IP地址和MAC地址
主机A想和外网通信,需要先把数据发给网关路由器,因此需要知道网关的MAC地址
主机A发送ARP广播请求"谁是网关IP?请告诉我你的MAC地址"
路由器收到后,以单播形式回复自己的MAC地址
主机A学到网关的MAC后,就可以把发往外网的数据先封装到目的MAC为网关MAC的帧中,交给路由器转发
七、欺骗原理
7.1 本质
ARP协议设计时没有任何认证机制——主机收到ARP应答后,不管这个应答是不是自己请求的,都会直接用应答中的IP-MAC映射更新自己的ARP缓存表。
这就是ARP欺骗得以实现的根本原因:攻击者可以伪造ARP应答包,让目标主机的ARP缓存中写入错误的IP-MAC映射,从而把流量劫持到攻击者的机器上。
7.2 三步骤
步骤一:正常通信状态
正常情况:
主机A的ARP缓存中:网关IP→ 网关MAC
网关R的ARP缓存中:主机A的IP→ 主机A的MAC
主机A和网关之间正常通信,流量直接走网关
步骤二:攻击者发送伪造ARP应答
攻击者主机M开始行动:
主机M向主机A大量发送伪造的ARP应答:"我是网关IP,我的MAC地址是macM"
主机M同时向网关R大量发送伪造的ARP应答:"我是主机A的IP,我的MAC地址是macM"
因为ARP没有认证,主机A和网关R都会更新自己的ARP缓存
更新后:
主机A认为:网关IP → macM
网关R认为:主机A的IP → macM
步骤三:中间人攻击形成
此时,主机M就成了中间人:
主机A发往网关的数据 → 目的MAC是macM → 数据先到了主机M
网关发往主机A的数据 → 目的MAC是macM → 数据也先到了主机M
主机M可以选择转发数据,也可以选择不转发
主机A和网关都以为在和对方直接通信,实际上所有流量都经过了攻击者
ARP欺骗的危害极大,攻击者可以:窃听敏感信息、篡改数据、植入恶意代码、进行DNS劫持等。这也是局域网安全中一个非常经典的攻击手段。
7.3 防御方案
针对ARP欺骗,常见的防御手段有以下几种:
方案一:静态ARP绑定
原理:手动在主机和网关设备上配置静态的IP-MAC映射,静态ARP表项不会被动态ARP应答更新。
配置示例:
# 查看当前ARP表 $ arp -a # 添加静态ARP绑定(网关IP和网关MAC) $ arp -s 192.168.1.1 10:bd:18:08:af:62 # 删除静态ARP绑定 $ arp -d 192.168.1.1优点:简单直接,效果可靠
缺点:大型网络中配置和维护成本高,设备更换网卡或IP时需要手动更新
适用场景:小型网络、关键服务器
方案二:交换机端口安全
原理:在交换机端口上配置允许接入的MAC地址数量,甚至绑定特定MAC地址,防止伪造MAC地址的设备通信。
配置示例:
[Switch] interface GigabitEthernet 0/0/1 [Switch-GigabitEthernet0/0/1] port-security enable [Switch-GigabitEthernet0/0/1] port-security max-mac-num 1 [Switch-GigabitEthernet0/0/1] port-security protect-action restrict适用场景:企业级网络,接入层交换机部署
方案三:DAI
原理:交换机结合DHCP Snooping绑定表,检查ARP报文中的源IP和源MAC是否匹配绑定表,不匹配则丢弃。
方案四:ARP防火墙软件
在主机上安装ARP防火墙,软件会主动检测ARP应答的合法性,拦截伪造的ARP包。
适用场景:个人用户、公共WiFi环境
各个方案对比
| 防御方案 | 部署位置 | 效果 | 维护成本 | 适用规模 |
|---|---|---|---|---|
| 静态ARP绑定 | 主机+网关 | 好 | 高 | 小型网络 |
| 端口安全 | 接入交换机 | 较好 | 中 | 企业网络 |
| DAI | 接入交换机 | 好 | 中 | 企业网络 |
| ARP防火墙 | 终端主机 | 一般 | 低 | 个人用户 |