注:本文为陈鑫杰《图解 ARP 协议》系列的合集。
已重排,未全校。如有内容异常,请看原文(附后)。
图解 ARP 协议(一)ARP 原理
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 25 日 07:07
一、ARP 概述
在 TCP/IP 协议栈中,ARP 协议常被视作 “最不安全的协议”。诸如 “网络扫描”、“内网渗透”、“中间人拦截” 等安全术语,基本均与 ARP 协议相关。像 Cain、Ettercap、P2P 终结者等安全工具,底层实现均依赖 ARP 协议。
尽管 ARP 协议应用广泛,但其原理极为简单:完整交互仅需两个数据包(请求与应答)。不过,其衍生的代理 ARP、免费 ARP等类型,常让初学者感到困惑。在深入原理前,先明确三点核心认知:
- ARP(地址解析协议) 用于实现 IP 地址到 MAC 地址的映射,即查询目标 IP 对应的 MAC 地址。
- 局域网通信中,数据包需封装源目 IP 与 MAC 地址(遵循 OSI 模型封装顺序)。
- 上层应用更关注 IP 地址,需通过 ARP 协议获取 MAC 地址以完成数据封装。
二、ARP 原理之请求应答
数据封装与 ARP 介入流程
当同一局域网中的 PC1 向 PC2 发起通信时,数据封装过程如下:

以 ping PC2 为例,PC1 封装数据时出现失败(failed),原因是:
虽通过指令获取了目的 IP,但缺乏对应的 MAC 地址。这如同快递单仅填收件人姓名(IP),未填地址(MAC),导致数据无法发送。
此时 ARP 协议介入:

通过 ARP 请求与应答交互,PC1 成功获取 PC2 的 MAC 地址。
ARP 缓存表与通信实现
PC1 会将映射关系(如 IP2<->MAC2)存入本地 ARP 缓存表,随后重新封装数据并发起通信:

关键结论:
- ARP 通过"一问一答"获取 MAC 地址并存储至缓存表。
- 缓存表具有时效性,设备重启后清空,需重新请求。
在系统中可通过以下命令查看缓存表:
arp -a # Windows/macOS 查看 ARP 缓存表

三、ARP 原理之广播请求单播回应
多主机环境下的广播机制
上述场景假设局域网仅有两台主机,而实际环境中可能存在数十台设备。此时 ARP 请求如何精准送达目标主机?


ARP 协议通过以太网广播发送请求包:
- 广播包特征:二层 MAC 为
ffff.ffff.ffff,或三层 IP 为255.255.255.255。 - 交换机/路由器会将广播包转发至同一局域网内的所有主机。
单播应答的实现逻辑
当 PC1 发送广播请求后:
- PC3、PC4 等非目标主机会丢弃数据包;
- PC2 识别到请求中的目标 IP 为自身,生成应答包。
ARP 应答采用单播形式返回,原因在于:
请求包中包含发送方(PC1)的 IP 与 MAC 地址(“自我介绍”),PC2 可将该映射存入缓存表,直接通过单播回复。

核心要点:
- PC2 先于 PC1 生成对方的 ARP 映射;
- 单播应答仅目标主机(PC1)可接收。
四、ARP 数据包解读
通过 Wireshark 抓取真实网络中的 ARP 包,可深入理解协议结构。示例环境地址信息:
- 主机 1:
IP1 10.1.20.64,MAC1:00:08:ca:xx:xx:xx - 主机 2:
IP2 10.1.20.109,MAC2:44:6d:57:xx:xx:xx
数据包实例
ARP 请求包:

ARP 应答包:

协议字段解析
| 字段名称 | 含义说明 |
|---|---|
| Hardware type | 硬件类型(如以太网为 1) |
| Protocol type | 网络层协议(如 IPv4 为 0x0800) |
| Hardware size | MAC 地址长度(6 字节/48bit) |
| Protocol size | IP 地址长度(4 字节/32bit) |
| Opcode | 操作码(1=请求,2=应答) |
| Sender MAC address | 发送方 MAC 地址 |
| Sender IP address | 发送方 IP 地址 |
| Target MAC address | 目标 MAC 地址(请求包中全 0 表示未知) |
| Target IP address | 目标 IP 地址 |
五、ARP 协议的层次定位
ARP 属于链路层还是网络层?这一问题颇具争议,可从两个维度分析:
功能视角与封装视角对比
- 功能维度:ARP 服务于 MAC 地址获取,为链路层提供支持,归为链路层协议。
- 封装维度:ARP 与 IP 在以太网中有独立类型(ARP 为 0x0806,IP 为 0x0800),二者平级。因 IP 属于网络层,ARP 亦可视为网络层协议。

结论:
- 从功能看,ARP 是链路层协议;
- 从封装结构看,ARP 是网络层协议。
(该分析思路同样适用于 ICMP 协议的层次定位)
推荐实践:
初学者可通过 GNS3 搭建实验环境,配合 Wireshark 抓取 ARP 数据包,直观理解协议交互流程。
图解 ARP 协议(二)ARP 攻击篇
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 27 日 10:00
一、ARP 攻击概述
在前文已介绍 ARP 协议的基本原理(包括请求应答机制、数据包结构及协议分层),本文将深入探讨以下核心问题:
- ARP 攻击的技术原理
- 攻击可导致的安全风险(如账号窃取)
- 常见 ARP 渗透工具及实践场景
- ARP 扫描与攻击的底层数据包差异
以下通过图解方式解析 ARP 攻击的实现逻辑。
二、ARP 攻击原理
局域网中的中间人模型
当局域网存在 ARP 攻击时,必然存在 “中间人” 角色,其攻击模型如下:

拓扑说明:PC1、PC2、PC3 连接至交换机 SW1,假设 PC3 为攻击者(安装攻击软件或感染病毒)。
正常通信流程回顾

- ARP 请求广播:PC1 向 PC2 发送 ARP 请求(广播形式),交换机将包泛洪至所有接口。
- 单播应答:PC2 回复 ARP 应答(单播),PC3 处于监听状态。
- 缓存表生成:PC1/PC2 生成 IP-MAC 映射,存入 ARP 缓存表。
- 交换机学习:交换机记录 MAC 地址与接口的映射(CAM 缓存表)。
关键知识:
- 主机通信依赖 ARP 表(IP<->MAC),交换机依赖 CAM 表(MAC<->Port),路由器依赖路由表(Route<->Port)。
- 交换机基于源 MAC 学习,基于目的 MAC 转发。
- 攻击者可通过监听 ARP 广播获取网络信息(被动监听)。
ARP 欺骗攻击流程
1. 攻击者伪造 ARP 应答

PC3(攻击者)主动发送伪造的 ARP 应答包,声明:“我是 PC2(IP2-MAC3)”,其中 MAC3 为攻击者的真实 MAC 地址。
2. 目标主机的缓存覆盖机制

PC1 同时收到两个 ARP 应答:
- 正常应答:IP2-MAC2(PC2 发送)
- 欺骗应答:IP2-MAC3(PC3 发送)
缓存策略:ARP 表遵循 “后到优先” 原则,攻击者通过高并发发送欺骗包(如每秒数百个),确保欺骗应答覆盖正常应答。
3. 数据流劫持实现

PC1 的 ARP 表被篡改后,发送给 PC2 的数据包会携带错误的 MAC 地址(MAC3)。交换机根据 CAM 表将数据包转发至 PC3,导致:

4. 双向欺骗与中间人攻击
攻击者同时欺骗 PC1 和 PC2,形成完整的 “中间人攻击” 链路:

ARP 攻击的危害场景
- 断网攻击:攻击者丢弃目标数据流,导致通信中断(如切断主机与路由器的连接)。
- 流量限速:控制目标带宽(如宿舍、网吧网络突然卡顿)。
- 账号窃取:
- 原理:明文协议(HTTP、Telnet、FTP 等)的登录信息可被直接捕获。
- 风险应用:非 HTTPS 网站、邮箱(POP3/SMTP/IMAP)、远程登录(Telnet)等。
三、常见 ARP 渗透工具与底层原理分析
工具分类与功能
| 工具类型 | 代表工具 | 核心功能 |
|---|---|---|
| ARP 扫描工具 | Metasploit arping | 发现内网存活主机 |
| 扫描+流量控制 | P2P 终结者 | 限速、限制应用访问 |
| 扫描+账号窃取 | Cain、Ettercap | 捕获明文协议数据(账号密码等) |
ARP 扫描的底层实现
1. 网络扫描流程
攻击者接入网络(如 10.1.20.0/24 网段),需先探测网络内的主机信息:

2. 数据包级别的盲扫实现

盲扫原理:向网段内所有 IP 发送 ARP 请求(类似 “点名”),根据应答发现存活主机:

3. 扫描结果分析
通过 Wireshark 解析应答包的 OUI(MAC 地址前 24 位)可识别设备厂商:

扫描结果示例:

ARP 欺骗攻击的数据包特征
1. 伪造全主机欺骗
攻击者声明自己是局域网内所有主机,覆盖全网 ARP 表:

2. 网关欺骗攻击
攻击者伪造网关 IP-MAC 映射,劫持全网出口流量:
- 欺骗主机 Honhai:

- 欺骗主机 Apple:

四、ARP 攻击总结
- 缓存机制:ARP 表遵循 “后到优先”,攻击者可通过伪造应答覆盖正常映射。
- 攻击核心:通过 “ARP 毒化”(伪造 IP-MAC 映射)实现数据流劫持。
- 安全风险:明文协议通信的账号密码可被窃取,HTTPS 等加密协议可抵御此类攻击。
- 分析手段:借助 Wireshark 可捕获并解析 ARP 攻击的底层数据包,定位攻击源。
防御建议:
- 部署 ARP 防火墙;
- 静态绑定网关 ARP 映射(
arp -s 网关IP 网关MAC); - 优先使用 HTTPS 等加密协议通信。
图解 ARP 协议(三)ARP 防御篇:如何揪出 “内鬼” 并 “优雅的还手”?
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 29 日 06:10
一、ARP 防御概述
通过前两篇文章,我们已了解 ARP 攻击的核心原理与危害:黑客利用 ARP 欺骗包可实现断网攻击、流量限速及账号窃取。由于攻击门槛极低(普通用户掌握工具即可实施),公共网络、家庭网络等场景面临严峻威胁。
本文将围绕以下核心问题展开:
- 普通用户与网络管理员的 ARP 防御策略
- 主流 ARP 防御软件的技术原理
- 攻击溯源与反制的全流程实践
二、ARP 防御原理与解决方案
攻击场景回顾
ARP 攻击的核心在于伪造 ARP 应答包:

当 PC1 询问 PC2 的 MAC 地址时,攻击者 PC3 发送欺骗包(声明 IP2 对应 MAC3),导致 PC1 的 ARP 表被篡改,数据流被劫持。
防御体系架构
ARP 防御的核心思路是拦截或忽略欺骗包,实现方案分为两类:
- 网络设备层防御:在交换机/路由器上拦截欺骗包
- 用户终端防御:在主机端识别并丢弃欺骗包

网络设备层防御:动态 ARP 检测(DAI)
技术原理
- DAI(Dynamic ARP Inspection) 通过建立
Port<->MAC<->IP映射表,验证 ARP 包的合法性 - 交换机检测 ARP 应答包,若与表中记录冲突则丢弃

DAI 表生成方式
-
手工静态绑定
- 管理员手动绑定用户
IP-MAC-Port映射 - 缺点:大规模网络中运维成本高
- 管理员手动绑定用户
-
DHCP 侦听联动
- 交换机通过 DHCP 侦听自动记录用户
IP-MAC-Port - 主流方案,适用于动态分配 IP 的网络
- 交换机通过 DHCP 侦听自动记录用户

实施限制
- 设备要求:DAI 为企业级交换机功能,家用/基础交换机通常不支持
- 成本问题:具备 DAI 功能的设备价格较高,中小型网络普及度低
用户终端防御方案
1. ARP 防火墙软件
- 核心功能:
- 绑定正确的
IP-MAC映射,抵御欺骗包 - 识别 ARP 扫描/欺骗行为,定位攻击源
- 绑定正确的
- 常见工具:
- 综合安全软件:360 安全卫士、腾讯电脑管家
- 专业 ARP 工具:彩影 ARP、360 ARP 防火墙

2. ARP 双向静态绑定
- 原理:在通信双方手动绑定对方的
IP-MAC映射,静态条目优先级高于动态学习 - Windows 实现命令:
arp -s 目标IP 目标MAC # 示例:arp -s 192.168.1.1 00-11-22-a1-c6-09 - 拓扑示例:

- 缺点:
- 配置工作量大,需全网主机与网关互绑
- 不适用于动态变更的网络环境
三、ARP 攻击溯源与反制实践
实战案例:揪出局域网 “内鬼”
场景还原
2010 年,作者在出租屋遭遇夜间网络限速,疑似新租客 H 利用 ARP 工具实施流量控制。网络拓扑如下:

反制流程
第一步:安装防火墙脱离控制
- 部署 ARP 防火墙软件,阻断欺骗包影响
第二步:定位攻击源
- Wireshark 抓包分析:
过滤 ARP 协议,捕获高频扫描包,确定攻击源IP-MAC。

- 虚实关联技巧:
通过断网测试验证——禁用攻击源IP-MAC后,观察谁主动反馈网络故障。
第三步:夺取网络控制权
- 路由器密码破解:
使用 Hydra 结合房东信息(手机号、姓名拼音)生成字典,暴力破解路由器后台。 - 攻击源封禁:
在路由器中禁用攻击源IP-MAC,实现精准反制。
技术总结:攻击溯源核心手段
- 流量分析:
- Wireshark 过滤 ARP 协议,识别高频扫描包(每秒数十个 ARP 请求)
- 行为关联:
- 断网测试:禁用疑似 IP 后观察网络异常反馈
- 工具辅助:
- ARP 防火墙告警日志(攻击次数、源地址)
- 路由器 MAC 地址绑定列表对比
四、ARP 防御总结
-
攻击本质:
ARP 攻击利用协议缺陷,通过伪造IP-MAC映射实现流量劫持。 -
防御体系:
- 网络层:企业级设备部署 DAI、DHCP 侦听等技术
- 终端层:安装 ARP 防火墙或实施静态绑定
-
安全实践:
- 陌生网络谨慎接入,开启防火墙防护
- 企业网优先采用专业安全设备构建防御体系
- 遭遇攻击时,通过流量分析与断网测试定位源头
-
工程师素养:
反制攻击时应遵循 “技术溯源、证据优先” 原则,避免滥用权限造成误伤。
防御工具链推荐:
- 网络层:Cisco Catalyst 系列(DAI 支持)
- 终端层:ARP 防护模块、Wireshark(流量分析)
图解 ARP 协议(四)代理 ARP:善意的欺骗
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 30 日 23:59
一、代理 ARP 概述
场景对话:
- 我:电脑访问互联网服务器时,目标 MAC 是什么?
- 初学者:服务器的 MAC 地址!

- 我:那电脑如何获取服务器的 MAC 地址?
- 初学者:通过 ARP 协议交互!

- 我:再看下图,是否存在问题?

- 初学者:哦!路由器隔离广播域,ARP 广播包无法穿越互联网到达服务器!
核心疑问:
- 跨网段通信时,ARP 究竟在询问谁的 MAC 地址?
- 什么是代理 ARP?其应用场景是什么?
- 代理 ARP 与网关设置有何关联?
二、代理 ARP 原理
基本概念
当 ARP 请求的目标 IP 跨网段时,网关设备会用自身 MAC 地址响应请求,此机制称为 代理 ARP(Proxy ARP)。

原理说明:
- PC 发送 ARP 请求查询服务器 8.8.8.8 的 MAC 地址
- 路由器(网关)判断目标跨网段,返回自身接口 MAC(MAC254)
- PC 缓存映射
8.8.8.8<->MAC254,后续通信将目标 MAC 封装为网关 MAC
代理 ARP 的 “善意欺骗”
- 正常映射:
8.8.8.8<->MAC2(服务器真实 MAC) - 代理映射:
8.8.8.8<->MAC254(网关 MAC) - 效果:通过欺骗实现跨网段通信

执行条件
- 网关开启代理 ARP 功能
- 网关具备目标网络的路由信息

注意:若网关未开启代理 ARP,PC 将无法获取跨网段目标的 MAC 地址,导致通信失败。
实际应用场景
- 代理 ARP 非必需:正常网络环境中,用户通过 DHCP 或手动配置获取网关,使用普通 ARP 即可。
- 触发代理 ARP 的场景:PC 未配置网关,且需要跨网段通信时。
三、ARP 与代理 ARP:互补而非互斥
跨网段通信对比
场景 1:PC 无网关(代理 ARP)

场景 2:PC 有网关(正常 ARP)

通用结论
- 无网关时:ARP 直接询问跨网段目标的 MAC(代理 ARP)
- 有网关时:ARP 询问网关的 MAC(正常 ARP)
- 最终映射:两种方式获取的目标 MAC 均为网关 MAC
复杂拓扑验证
无网关(代理 ARP)

有网关(正常 ARP)

四、ARP 与代理 ARP 实战指南
(一)真实网络实验
网络环境
- PC 地址:192.168.199.177
- 网关:极路由(MAC:d4:ee:07:54:c1:9e)
- 目标:8.8.8.8、114.114.114.114
操作步骤
-
查看 IP 与网关
# MacOS 查看 IP ifconfig # Windows 查看 IP 与网关 ipconfig /all
-
查看路由表
netstat -rn # MacOS/Windows
-
Ping 外网地址
ping 8.8.8.8 ping 114.114.114.114
-
查看 ARP 表
arp -a # MacOS/Windows
实验结论
- 真实网络中普遍使用正常 ARP
- 有网关时,跨网段通信仅记录网关 MAC
- 首次获取网关 MAC 后,后续通信无需重复 ARP
(二)虚拟环境实验(GNS3)
拓扑搭建

配置步骤
-
设备 IP 配置
# PC 配置 PC (config)#int f0/0 PC (config-if)#no shutdown PC (config-if)#ip address 192.168.1.1 255.255.255.0 # 路由器配置 Router (config)#int f0/0 Router (config-if)#no shutdown Router (config-if)#ip address 192.168.1.254 255.255.255.0 Router (config-if)#int f1/0 Router (config-if)#no shutdown Router (config-if)#ip address 8.8.8.1 255.255.255.0 # 服务器配置 Server (config)#int f0/0 Server (config-if)#no shutdown Server (config-if)#ip address 8.8.8.8 255.255.255.0 -
路由配置
# PC 关闭路由功能(模拟无网关) PC (config)#no ip routing PC#show ip route # 无默认网关 # 路由器路由表(已含直连路由) Router#show ip route # 服务器添加回程路由 Server (config)#ip route 192.168.1.0 255.255.255.0 8.8.8.1 Server#show ip route -
查看 MAC 地址
PC#show int f0/0 # MAC: cc05.1f56.0000 Router#show int f0/0 # MAC: cc07.1f56.0000 Router#show int f1/0 # MAC: cc07.1f56.0010 Server#show int f0/0 # MAC: cc06.1f56.0000 -
无网关时的代理 ARP 验证
PC#ping 8.8.8.8 # 首次 ping 触发 ARP
PC#show arp # 代理 ARP 映射:8.8.8.8<->cc07.1f56.0000(路由器 MAC) -
关闭代理 ARP 验证
Router (config)#int f0/0 Router (config-if)#no ip proxy-arp # 关闭代理 ARP PC#clear arp # 清空 ARP 表 PC#ping 8.8.8.8 # 通信失败
PC#show arp # 目标 MAC 状态为 Incomplete -
配置网关后验证
PC (config)#ip default-gateway 192.168.1.254 # 设置网关 PC#ping 8.8.8.8 # 通信成功
五、代理 ARP 总结
- 核心纠正:跨网段通信并非必须使用代理 ARP,默认优先使用正常 ARP。
- 技术本质:代理 ARP 是网关用自身 MAC 响应跨网段 ARP 请求的 “善意欺骗”。
- 触发条件:PC 未配置网关时,通过代理 ARP 实现跨网段通信。
- 实践结论:真实网络中,配置网关后使用正常 ARP 更可靠,代理 ARP 受限于设备支持情况。
图解 ARP 协议(五)免费 ARP:地址冲突了怎么办?
陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 03 日 10:30
一、免费 ARP 概述
在网络环境中,除了恶意攻击外,地址冲突是一类看似微小却可能造成严重影响的问题:

- 场景 1:局域网中 PC2 和 PC3 的 IP 地址均为 192.168.1.2,导致 PC1 发送至该地址的数据包无法确定目标,通信混乱。
- 场景 2:企业服务器集群中 Server1 和 Server2 地址冲突(如 10.1.1.1),可能导致大规模服务中断。

地址冲突的成因:
- 运维疏忽或用户手动配置重复 IP
- 恶意攻击(如攻击者故意制造冲突导致服务中断)
核心问题:如何检测并解决地址冲突?
二、免费 ARP 原理
基本概念
免费 ARP(Gratuitous ARP) 用于检测局域网内的 IP 地址冲突,其特点是 “无故自问自答”(主动发送 ARP 包宣告自身 IP-MAC 映射,无需请求触发)。

技术特性:
- 无需额外软件或硬件支持,依赖设备内置的 TCP/IP 协议栈
- 通过广播形式发送 ARP Request 或 Reply 包
- 轻量级、无感知,自动运行
地址冲突检测流程
- 冲突发生:PC2 和 PC3 的 IP 地址均为 192.168.1.2
- 免费 ARP 介入:双方持续广播 ARP 包宣告自身 MAC 地址
- ARP 表混乱:其他主机的 ARP 表因频繁更新而混乱

关键机制:
- 免费 ARP 包的目标 IP 为自身 IP,用于检测是否有其他设备响应
- 系统通过弹框(如 Windows/MacOS)或日志(如路由器)提示冲突

% IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
- 冲突解决:修改其中一方的 IP 地址,恢复正常通信

三、免费 ARP 实战指南
(一)真实网络实验
环境搭建
- 拓扑:MacBook 与 Windows 电脑连接至同一无线路由器
- 目标:模拟 IP 地址冲突并观察免费 ARP 行为

操作步骤
-
查看局域网主机
无线路由器显示 Windows 电脑 IP 为 192.168.199.152。
-
设置冲突地址
将 MacBook 的 IP 手动设置为 192.168.199.152。
-
观察冲突告警
MacBook 弹出地址冲突提示,Wireshark 捕获免费 ARP 包。
-
冲突解决验证
- 断开 Windows 网络,MacBook 发送免费 ARP 确认地址可用。
- Windows 重新接入时通过 DHCP 自动获取新地址(192.168.199.153)。
# Windows 重新获取地址的 DHCP 交互 DHCP Discover → DHCP Offer → DHCP Request → DHCP ACK
(二)虚拟网络实验(GNS3)
拓扑搭建
3 台路由器连接至同一网段(192.168.1.0/24),模拟地址冲突。

操作步骤
-
基础配置
R1 (config)#int f0/0 R1 (config-if)#ip add 192.168.1.1 255.255.255.0 R2 (config)#int f0/0 R2 (config-if)#ip add 192.168.1.2 255.255.255.0 R3 (config)#int f0/0 R3 (config-if)#ip add 192.168.1.3 255.255.255.0 -
制造冲突
将 R3 的 IP 改为 192.168.1.2,与 R2 冲突。R3 (config-if)#ip add 192.168.1.2 255.255.255.0 -
观察日志与 ARP 表
- R2 和 R3 输出冲突日志:
% IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000 - R1 的 ARP 表中 192.168.1.2 的 MAC 地址频繁变更。

- R2 和 R3 输出冲突日志:
四、地址冲突解决方案总结
-
普通用户解决方案
- 重启路由器:通过 DHCP 重新分配 IP 地址(适用于家庭网络)。
- 手工修改 IP:在原地址基础上递增(如 192.168.1.1 → 192.168.1.11)。
-
运维人员解决方案
- 检查 DHCP 地址池规划,避免地址重叠。
- 部署 IP-MAC 绑定策略,防止用户手动设置冲突地址。
-
免费 ARP 技术要点
- 包类型:分为 “请求广播”(自己问自己)和 “应答广播”(自己答自己)。
- 检测机制:通过系统弹框或设备日志发现冲突。
- 跨平台差异:Windows/MacOS 通过弹框提示,网络设备通过日志告警。
核心价值:免费 ARP 作为轻量级地址冲突检测机制,虽无法自动解决冲突,但能及时告警,为人工干预提供依据,是网络基础防护的重要环节。
图解 ARP 协议(六)RARP 与 IARP:被遗忘的兄弟协议
原创 陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 05 日 17:11
一、概述
初次接触 ARP 协议时,会觉得其原理简单——“一去一回通过 IP 拿到 MAC 地址”,整个交互在 1 秒内即可完成。随后了解到 代理 ARP,发现其本质是一种 “欺骗” 变种;再接触 免费 ARP,又感叹协议设计者的巧思,竟能利用 ARP 实现 “地址检测”。而 ARP 嗅探与欺骗 则揭示了该协议在安全领域的另一面——简单的协议竟能被用于内网探测和攻击。
当以为已掌握 ARP 相关知识时,RARP 和 IARP 却带来了新的困惑:
- 应用场景稀缺:无论是学习还是工作中,这两个协议极少被使用;
- 命名易混淆:中文翻译中的 “翻转”“反向”“逆向” 极易混淆,英文原名
reverse和inverse仅差两个字母,记忆困难。
但深入思考会发现,ARP 协议通过字段微调衍生出 ARP、PARP、GARP、RARP、IARP 等变种,适用于多种场景,这正体现了其在 TCP/IP 协议栈中的独特地位。因此,深入理解这两个协议仍有必要。
二、RARP 原理与实践
基本概念
RARP(Reverse ARP,反向 ARP) 的功能与常规 ARP 相反:
- ARP:实现 IP 到 MAC 地址的映射;
- RARP:实现 MAC 到 IP 地址的映射。
应用场景
RARP 最初设计用于终端设备(如无盘工作站)获取 IP 地址,功能与 DHCP 类似:
- 设备接入网络时无 IP 地址,通过本地 MAC 发送 RARP Request 广播请求;
- 若局域网中存在 RARP Server,且其预存该 MAC 对应的 IP,则返回 RARP Reply 应答,设备由此获取 IP 地址。

局限性
- 静态绑定依赖:RARP Server 需提前静态绑定 MAC-IP 映射,否则无法响应;
- 信息单一:仅能分配 IP 地址,无法提供网关、DNS 等信息;
- 网段限制:基于二层封装,仅能在同一网段内运行,跨网段需部署多个 Server。
技术演进
- Bootp 协议:在 RARP 基础上增强,除 IP 外还能分配网关地址,支持跨网段通信;
- DHCP 协议:解决了静态绑定的痛点,通过动态分配和中继技术实现全网 IP 管理,逐渐替代 RARP。

数据包实践
RARP 数据包较难在常规环境中抓取,可通过 nmap 的 nping 工具 手动构造:
环境准备
- 开启 Wireshark 并过滤 ARP 协议;
- 模拟场景:MacBook 发起 RARP 请求,极路由返回应答。
命令示例
# 模拟 RARP 请求包(发送方 MAC 为 ac:bc:32:8b:56:df,目标 IP 为 0.0.0.0)
sudo nping --arp-type RARP --arp-sender-mac ac:bc:32:8b:56:df --arp-sender-ip 0.0.0.0 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 0.0.0.0 192.168.199.255
# 模拟 RARP 应答包(发送方为网关,分配 IP 为 192.168.199.153)
sudo nping --arp-type RARP-reply --arp-sender-mac d4:ee:07:54:c1:9e --arp-sender-ip 192.168.199.1 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 192.168.199.153 192.168.199.153
抓包结果


三、IARP 原理与实践
基本概念
IARP(Inverse ARP,逆向 ARP) 用于 帧中继网络(广域网) 中,实现 DLCI 到 IP 地址的映射。
技术背景
- DLCI(Data Link Connection Identifier):帧中继网络中的二层地址,用于标识虚拟专线,类似以太网中的 MAC 地址。

- 数据封装差异:
- 二层封装仅需本地 DLCI,无需目标 DLCI;
- 帧中继交换机会修改 DLCI 信息(如从 102 改为 201)。

核心功能
IARP 解决帧中继网络中 目标 IP 与本地 DLCI 的映射,生成 帧中继映射表(frame-relay map),类似 ARP 生成 ARP 表。

实验验证(GNS3 模拟)
拓扑搭建

配置步骤
-
接口与协议配置
# R1 配置 R1 (config)#int s0/0 R1 (config-if)#no shutdown R1 (config-if)#encapsulation frame-relay R1 (config-if)#ip address 10.1.1.1 255.255.255.0 # R2 配置 R2 (config)#int s0/0 R2 (config-if)#no shutdown R2 (config-if)#encapsulation frame-relay R2 (config-if)#ip address 10.1.1.2 255.255.255.0 -
抓包与映射表查看
- Wireshark 抓取 IARP 请求与应答包:


- 查看映射表:
R1#show frame-relay map # 输出:ip 10.1.1.2 dlci 102 (0x66,0x1860), dynamic,... R2#show frame-relay map # 输出:ip 10.1.1.1 dlci 201 (0xC9,0x3090), dynamic,...
- Wireshark 抓取 IARP 请求与应答包:
-
连通性测试
R1#ping 10.1.1.2 # 输出:!!!!!(5 个成功应答)
技术局限性
- 技术替代:帧中继作为广域网技术正逐渐被其他方案取代;
- 机制缺陷:IARP 周期性运行,若映射表丢失需等待重生成,且不同厂商设备兼容性存在差异;
- 实践建议:实际环境中常关闭 IARP,采用静态绑定生成映射表。
四、RARP 与 IARP 协议总结
-
RARP:
- 功能:MAC 到 IP 的映射,用于获取 IP 地址;
- 地位:Bootp 和 DHCP 的鼻祖,现仅在无盘工作站等场景使用。
-
IARP:
- 功能:帧中继网络中 DLCI 到 IP 的映射,生成帧中继映射表;
- 应用:随帧中继技术衰落而逐渐被遗忘。
-
共同命运:相比 ARP 系列的其他协议,RARP 和 IARP 因技术迭代成为 “被遗忘的兄弟协议”,但理解其原理有助于完整掌握 ARP 协议家族。
ARP 协议大总结
通过六篇文章,我们全面解析了 ARP 协议的应用场景、设计思想、数据包结构及实验验证。选择从 ARP 协议开篇,原因有二:
- 简单而不失深度:ARP 看似简单,但背后隐藏诸多细节(如请求广播/应答单播的例外情况),适合作为深入研究协议的切入点;
- 模型通用性:协议设计者通过操作码(opcode)变种(如 ARP:1/2,RARP:3/4,IARP:8/9)实现一处设计多处应用,体现了网络协议的精巧性。
原文如下
图解 ARP 协议(一)ARP 原理
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 25 日 07:07
一、ARP 概述
如果要在 TCP/IP 协议栈中选择一个 “最不安全的协议”,那么我会毫不犹豫把票投给 ARP 协议。我们经常听到的这些术语,包括 “网络扫描”、“内网渗透”、“中间人拦截”、“局域网流控”、“流量欺骗”,基本都跟 ARP 脱不了干系。大量的安全工具,例如大名鼎鼎的 Cain、功能完备的 Ettercap、操作傻瓜式的 P2P 终结者,底层都要基于 ARP 实现。
听上去这么 “逆天” 的协议,其实技术原理又简单的难以置信,例如 ARP 整个完整交互过程仅需要两个包,一问一答即可搞定!但是 ARP 协议也有它令初学者迷惑的地方,例如由它本身延伸出来的 “代理 ARP”、“免费 ARP”、“翻转 ARP”、“逆向 ARP”,而这些不同种类的 ARP,又应用于不同的场景。好吧,在深入到技术原理之前,作为初学者,我们先记住下面三句话:
① ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标 IP 对应的 MAC 地址。
② 在网络通信中,主机和主机通信的数据包需要依据 OSI 模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目 IP 地址的封装,也需要源目 MAC 的封装。
③ 一般情况下,上层应用程序更多关心 IP 地址而不关心 MAC 地址,所以需要通过 ARP 协议来获知目的主机的 MAC 地址,完成数据封装。
接下来,我们通过图解的方式来深入了解 ARP 协议是如何工作的。
二、ARP 原理之请求应答
同一个局域网里面,当 PC1 需要跟 PC2 进行通信时,此时 PC1 是如何处理的?

根据 OSI 数据封装顺序,发送方会自顶向下(从应用层到物理层)封装数据,然后发送出去,这里以 PC1 ping PC2 的过程举例 ==>

PC1 封装数据并且对外发送数据时,上图中出现了 “failed”,即数据封装失败了,为什么?
我们给 PC1 指令 -“ping ip2”,这就告知了目的 IP,此时 PC1 便有了通信需要的源目 IP 地址,但是 PC1 仍然没有通信需要的目的 MAC 地址。这就好比我们要寄一个快递,如果在快递单上仅仅写了收件人的姓名(IP),却没有写收件人的地址(MAC),那么这个快递就没法寄出,因为信息不完整。
那么,现在 PC1 已经有了 PC2 的 IP 地址信息,如何获取到 PC2 的 MAC 地址呢?此时,ARP 协议就派上用场了。我们接着上面这张图,继续 ==>

通过第三和第四步骤,我们看到 PC1 和 PC2 进行了一次 ARP 请求和回复过程,通过这个交互工程,PC1 便具备了 PC2 的 MAC 地址信息。
接下来 PC1 会怎么做呢?在真正进行通信之前,PC1 还会将 PC2 的 MAC 信息放入本地的【ARP 缓存表】,表里面放置了 IP 和 MAC 地址的映射信息,例如 IP2<->MAC2。接下来,PC1 再次进行数据封装,正式进入 PING 通信,如下 ==>

小结:经过上面 6 个步骤的处理,PC1 终于把数据包发送出去了,之后便可以进行正常的通信了。看到了吧,ARP 的功能和实现过程是如此的简单:它在发送方需要目标 MAC 地址的时及时出手,通过 “一问一答” 的方式获取到特定 IP 对应的 MAC 地址,然后存储到本地【ARP 缓存表】,后续需要的话,就到这里查找。
既然是 “缓存” 表,意味着它有时效性,并且如果电脑或者通信设备重启的话,这张表就会清空;也就是说,如果下次需要通信,又需要进行 ARP 请求。在我们的 windows/macos 系统下,可以通过命令行 “arp -a” 查看具体信息 =>

三、ARP 原理之广播请求单播回应
上面的图解过程看上去简单又纯粹,好像我们就已经把这个协议的精髓全部 get 到,但其实,我们只是刚揭开了它的面纱,接下来我们才真正进入正题。例如,上面的图解过程中,整个局域网(LAN)只有 PC1 和 PC2 两个主机,所以这个一问一答过程非常的顺畅。
而实际网络中,这个 LAN 可能有几十上百的主机,那么请问,PC1 如何将这个【ARP 请求包】顺利的交给 PC2,而 PC2 又如何顺利的把【ARP 回应包】返回给 PC1? 我们看下面的图:


为了营造出 “几十上百” 的效果,这里多添加了 2 个主机进来,并且增加了有线和无线的环境。那么,在多主机环境下,PC1 现在发出的 ARP 请求包,怎么交到 PC2 手里?
这时,ARP 协议就需要采用以太网的 “广播” 功能:将请求包以广播的形式发送,交换机或 WiFi 设备(无线路由器)收到广播包时,会将此数据发给同一局域网的其他所有主机。
那么,什么是广播?对于初学者而言,我们只需要知道,大部分的广播包,它们有一个共同特征:二层封装时目的 MAC 是全 f(ffff.ffff.ffff)或三层封装时目的 IP 是全 1(255.255.255.255)。
可以这样更方便的记住:目的地址最大的,就是广播。
注明:广播根据所在层次可分为二层广播和三层广播,根据发生范围可分为本地广播和定向广播,有兴趣可以自己去拓展下。
接下来我们来看下这个 ARP 广播请求包接下来是如何工作的?

根据上图我们看到,PC1 发送的请求广播包同时被其他主机收到,然后 PC3 和 PC4 收到之后(发现不是问自己)则丢弃。而 PC2 收到之后,根据请求包里面的信息(有自己的 IP 地址),判断是给自己的,所以不会做丢弃动作,而是返回 ARP 回应包。
ARP 请求是通过广播方式来实现的,那么,PC2 返回 ARP 回应包,是否也需要通过广播来实现呢?答案是否定的。大部分网络协议在设计的时候,都需要保持极度克制,不需要的交互就砍掉,能合并的信息就合并,能不用广播就用单播,以此让带宽变得更多让网络变得更快。
那么,ARP 回应包是如何处理的?这里需要特别关注 ARP 请求包的内容,在上面的图解里面,ARP 请求包的完整信息是:我的 IP 地址是 IP1,MAC 地址是 MAC1,请问谁是 PC2,你的 IP2 对应的 MAC 地址是多少?
简单来说,ARP 请求首先有 “自我介绍”,然后才是询问。这样的话,PC2 在收到请求之后,就可以将 PC1 的 IP 和 MAC 映射信息存储在本地的【ARP 缓存表】,既然知道 PC1 在哪里,就可以返回 ARP 单播回应包。

这张图我们需要得到两个信息:
① 被询问者 PC2 先生成了 ARP 映射信息,然后才是询问者 PC1;
② PC3 和 PC4 等其他主机,无法收到这个 ARP 回应包,因为是单播形式。
小结:ARP 协议通过 “一问一答” 实现交互,但是 “问” 和 “答” 都有讲究,“问” 是通过广播形式实现,“答” 是通过单播形式。
四、ARP 数据包解读
为了让大家更好的理解 ARP 协议以及广播和单播的概念,我们来看一下用 Wireshark 抓取到的真实网络中的 ARP 过程,通过数据包的方式来呈现,地址信息如下,部分 MAC 信息隐去。(建议初学者用 GNS3 配合 Wireshark 来抓取协议包进行分析,相比真实网络更加干净,方便分析)
主机 1 <—> 主机 2
主机 1: IP1 10.1.20.64 MAC1:00:08:ca:xx:xx:xx
主机 2: IP2 10.1.20.109 MAC2:44:6d:57:xx:xx:xx
【ARP 请求包】

【ARP 回应包】

【ARP 协议字段解读】
Hardware type :硬件类型,标识链路层协议
Protocol type: 协议类型,标识网络层协议
Hardware size :硬件地址大小,标识 MAC 地址长度,这里是 6 个字节(48bti)
Protocol size: 协议地址大小,标识 IP 地址长度,这里是 4 个字节(32bit)
Opcode: 操作代码,标识 ARP 数据包类型,1 表示请求,2 表示回应
Sender MAC address :发送者 MAC
Sender IP address :发送者 IP
Target MAC address :目标 MAC,此处全 0 表示在请求
Target IP address: 目标 IP
五、ARP 到底是链路层还是网络层?
这个问题的难度堪比另外一个世界级难题:世界上最好的编程语言是什么?
其实早在 20 世纪时,W.Richard Stevens 在《TCP/IP 详解卷一》里面就提到了这个难题。这里给出我个人的协议分层思路,给大家作为参考 =>
协议到底所属哪一层,可以从应用 / 功能来考虑,也可以从层次 / 包封装来考虑。
以 ARP 协议为例,它的功能最终是获取到 MAC 信息,服务于链路层,从这点考虑,ARP 是链路层协议;但是从层次来看,ARP 基于 Ethernet 协议,IP 协议基于 Ethernet 协议,它们在 Ethernet 协议里面有独立的 Type 类型,前者是 0x0806,后者是 0x0800,既然 ARP 和 IP 协议 “平起平坐”,那么 IP 是网络层,ARP 难道就不是网络层?

小结:基于功能来考虑,ARP 是链路层协议;基于分层 / 包封装来考虑,ARP 是网络层协议。(此方法对于 ICMP 协议同样管用)
图解 ARP 协议(二)ARP 攻击篇
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 27 日 10:00
一、ARP 攻击概述
在上篇文章里,我给大家普及了 ARP 协议的基本原理,包括 ARP 请求应答、数据包结构以及协议分层标准,我们继续讨论大家最感兴趣的话题:
ARP 攻击原理是什么?
通过 ARP 攻击可以做什么,账号是否可以被窃取?
有哪些常见的 ARP 渗透(攻击)工具可以用来练手?
ARP 扫描和攻击有什么区别,底层数据包特征是怎样的?
接下来,我们通过图解的方式来深入了解 ARP 攻击是如何实现的。
二、ARP 攻击原理
但凡局域网存在 ARP 攻击,都说明网络存在 “中间人”,我们可以用下图来解释。

在这个局域网里面,PC1、PC2、PC3 三台主机共同连接到交换机 SW1 上面,对应 3 个接口 port1/2/3。假设 PC3 这台主机安装了 ARP 攻击软件或遭受 ARP 病毒,成为这个网络的攻击者(hacker),接下来,PC3 是如何攻击的?
先不急,先来回顾下 PC1 和 PC2 是如何通信的。

①PC1 需要跟 PC2 通信,通过 ARP 请求包询问 PC2 的 MAC 地址,由于采用广播形式,所以交换机将 ARP 请求包从接口 P1 广播到 P2 和 PC3。(注:交换机收到广播 / 组播 / 未知帧都会其他接口泛洪)
②PC2 根据询问信息,返回 ARP 单播回应包;此时 PC3 作为攻击者,没有返回 ARP 包,但是处于 “监听” 状态,为后续攻击做准备。
③PC1 和 PC2 根据 ARP 问答,将各自的 ARP 映射信息(IP-MAC)存储在本地 ARP 缓存表。
④交换机根据其学习机制,记录 MAC 地址对应的接口信息,存储在CAM 缓存表(也称为 MAC 地址表)。交换机收到数据包时,会解封装数据包,根据目标 MAC字段进行转发。
关于上面的图解,我们要记住这些关键知识(敲黑板!):
① 主机通信需要查找 ARP 表,而交换机通信需要查找 CAM 表(路由器则查找 Route 表)。
注:ARP 表:ip<->mac CAM 表:mac<->port (Route 表:route<->port)
② 交换机基于源 MAC 地址学习,基于目的 MAC 地址转发。
③ 同一局域网内,攻击者可以根据主机的 ARP 广播请求监听其 IP 和 MAC 信息。
注:这里是 “被动监听”,跟后面要谈到的 “主动扫描”,原理上有区分,这里先埋个坑)
接下来是重点,我们来看看 PC3(Hacker)是如何发起 ARP 攻击的 =>

正常情况下,若收到的 ARP 请求不是给自己的,则直接丢弃;而这里 PC3(Hacker)在监听之后,发起了 ARP 回应包:我就是 PC2(IP2-MAC3)。
从拓扑可以出现,PC3 明明是 IP3 对应 MAC3,很显然这就是一个 ARP 欺骗行为。于此同时,PC2 正常的 ARP 回应包也交到了 PC1 手中,我们来看 PC1 接下来如何处理的:

PC1 收到两个 ARP 回应包,内容分别如下:
③ 我是 PC2,我的 IP 地址是IP2,我的 MAC 地址是MAC2;
③ 我是 PC2,我的 IP 地址是IP2,我的 MAC 地址是MAC3;
PC1 一脸懵:咋回事?还有这操作?不管了,我选最新的!(后到优先)
这里给大家顺便普及下网络协议里各种表在处理缓存信息的方式:
要么 “先到先得”,要么 “后到优先”。上面提到的 ARP 和 CAM 表,就是遵循 “后到优先” 原则,而后面章节我们会讲到的 DHCP 表,则遵循 “先到先得” 原则。
那么问题来了,上面两个 ARP 回应包到底哪个先到哪个后到呢?
作为初学者,可能还在纠结前后这种 naive 的问题;而作为 hacker,只要持续不停发出 ARP 欺骗包,就一定能够覆盖掉正常的 ARP 回应包。稳健的 ARP 嗅探 / 渗透工具,能在短时间内高并发做网络扫描(例如 1 秒钟成千上百的数据包),能够持续对外发送欺骗包。
无论如何,当 PC1 和 PC2 这种 “小白” 用户遇到 PC3(hacker)时,最终的结果一定是这样的:

小白 vs 黑客,很明显的较量,PC1 最终记录的是虚假的 ARP 映射:IP2<->MAC3,得到错误信息的 PC1,接下来会发生什么情况呢?(我们以 PC1 ping PC2 为例)

根据数据封装规则,当 PC1 要跟 PC2 进行通信时,无论是发生 PING 包还是发送其他数据,首先要查找 ARP 表,然后在网络层打上源目 IP,在链路层打上源目 MAC,然后将数据包发送给交换机。交换机收到之后对数据进行解封装,并且查看 CAM 表(基于目的 MAC 转发),由于目标 MAC3 对应 Port3,所以交换机自然而然将其转发给 PC3。
就这样,PC1 本来要发给 PC2 的数据包,落到了 PC3(Hacker)手里,这就完成了一次完整的 ARP 攻击。反过来,如果 PC2 要将数据包发送给 PC1,PC3 仍然可以以同样的 ARP 欺骗实现攻击,这就有了下面这张图(PC3 既欺骗了 PC1,也欺骗了 PC2)。

此时,PC1 和 PC2 的通信数据流被 PC3 拦截,形成了典型的 “中间人攻击”。那么,一旦被攻击并拦截,攻击者能做什么,普通用户又会遭受什么损失?这里给大家举几个常见的例子 =>
① 攻击者既然操控了数据流,那么直接断开通信是轻而易举的,即 “断网攻击”,例如,PC1 发给 PC2 的数据在 PC3 这里可以直接丢弃,而如果这里的 PC2 是一台出口路由器(无线路由器),那就意味着 PC1 直接无法连上互联网。
② “断网攻击” 显然容易被发现,而且比较 “残忍”,所以就有了更加常见的应用 -“限速”。例如,在宿舍上网突然很慢,在网吧上网突然打不开网页,如果这个网络没有安全防御,那么很有可能有 “内鬼”。
③ 其实无论是 “断网攻击” 还是 “限速”,整体还是比较 “善良”,因为这里流量里面的核心数据还没有被 “提取” 出来。如果攻击者是一名真正的黑客,他的目的一定不会这么无聊,因为内网流量对于黑客是没有太大价值的,而只有 “用户隐私”,例如常见网站的登录账号密码,这些才是最有价值的。
问:遭受 ARP 攻击之后,哪些账号可能被窃取?
答:任何基于明文传输的应用,都可以被窃取。 例如,如果一个网站不是 HTTPS 协议,而是基于 HTTP 明文传输,那么当你登录这个网站时,你的密码就会被窃取。除了 http(web 应用),常见的还有 telnet、ftp、pop3/smtp/imap(邮箱)等应用,都很容易泄露密码。
三、常见 ARP 渗透工具与底层原理分析
基于 ARP 欺骗原理设计出来的渗透 / 攻击工具非常多,而最终能实现什么功能则各有差异,简单举几个例子:
① 无毒无害型的仅具备 ARP 扫描功能,用来发现内网主机;例如 Metasploit 里面的 arping/arpscan 相关模块;
② ARP 扫描 + 流量控制(限速或限制能上哪些网站和应用);例如 Windows 下的 P2P 终结者;
③ ARP 扫描 + 账号窃取(网站、邮箱、各种);最强的莫过于 Windows 下的 Cain,当然还有跨平台的 Ettercap(需配合其他工具);
当然,如果攻击者足够强悍,也可以基于协议底层原理,编写自己的 ARP 工具。这里我通过 wirehshark 给大家还原真实网络中常见的 ARP 扫描和欺骗攻击(具体的软件使用这里暂时不出现,大家重点关注底层实现)。

在这张图里面,Hacker(就是我…)接入了一个 WiFi 网络,这个 10.1.20.0/24 便是所在的网段。刚进来一个陌生网络,Hacker 只知道自己的 IP 信息,例如 IP 地址是 10.1.20.253,网关地址是 10.1.20.254,而这个局域网的其他设备是什么?有多少台?地址分布是多少?Hacker 都不知道,接下来怎么办呢?是不是要直接发动 ARP 攻击了?
不用这么着急,咋们至少要先了解下这个网络,进行基本的扫描和踩点。这个时候通过 ARP 工具对这个 WiFi 网络进行扫描,具体的数据包截图如下:

上面的 ARP 扫描过程,大概的情况是这样的 =>

其实,这就是典型的 “盲扫” 或者 “暴力扫描”:反正我不知道网络到底有多少主机,那我就尝试一下把整个网段全部问一遍得了。好比老师上课点名,把每个学生的桌位号念一遍,谁举手就到勤,没举手就算逃课。
那么,这个实际网络里面,到底谁 “举手” 了呢?我们来看 Wireshark 抓包情况。

在 ARP 应答信息里面,除了 IP 地址和 MAC 信息,我们还能看到相关的设备厂商信息,例如 cisco、meizu、apple、xiaomi 等,这其实就是依靠 MAC 地址前面 24 位的 OUI(机构唯一标识符) 来识别的。
Wireshark 或扫描器能够帮我们将 OUI 转为对应的厂商(还有一些扫描器基于 Netbios 协议,还能找到电脑的主机名),所以,扫描之后可以得到下面这张图片 =>

通过扫描,我们已经知道了整个网络的主机信息,例如 20.254 对应 cisco,应该是路由器,20.248 对应 apple,是苹果手机,20.249 对应 xiaomi,是小米手机,以此类推…
接下来,如何进行 ARP 欺骗攻击呢?这里将最重点的数据包截取出来 =>

根据之前的信息,我们知道 00:08:ca:86:f8:0f 其实就是 hacker 的 mac 地址,并且对应的真正的 IP 地址应该是 10.1.20.253。而这里很明显是 hacker 在欺骗局域网其他主机,它对外声称:自己就是 “所有人”。尤其是上面标红的主机,我们已经知道是小米、思科、苹果等设备,但是 hacker 都声明是自己!这样做的意义在于覆盖掉其他主机的 ARP 缓存表信息,并生成错误的 ARP 映射,最终将通信流量交给 hacker。
当然,还有另外一种 ARP 欺骗的做法:hacker 告诉所有人,自己就是网关。因为其他主机访问互联网必经之路便是网关(出口路由器 / 无线路由器),通过这种方式,同样可以截取到用户数据流,这里给出另外一个网络的实现过程 =>
Hacker 欺骗主机 Honhai,告诉它:我就是网关(10.1.1.254)

Hacker 欺骗主机 Apple,告诉它:我就是网关(10.1.1.254)

依此类推,Hacker 会告诉局域网所有主机:自己就是网关,并且后续可以把数据都丢给我,我来转发到互联网。
四、ARP 攻击总结
① ARP 缓存表基于 “后到优先” 原则,IP 与 MAC 的映射信息能被覆盖;
② ARP 攻击基于伪造的 ARP 回应包,黑客通过构造 “错位” 的 IP 和 MAC 映射,覆盖主机的 ARP 表(也被称为 “ARP 毒化”),最终截取用户的数据流;
③ 一旦遭受 ARP 攻击,账号密码都可能被窃取(如果通信协议不是加密的);
④ 通过 Wireshark 数据包分析,我们掌握了真实网络中 ARP 底层攻击原理及数据包组成。
图解 ARP 协议(三)ARP 防御篇:如何揪出 “内鬼” 并 “优雅的还手”?
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 29 日 06:10
一、ARP 防御概述
通过之前的文章,我们已经了解了 ARP 攻击的危害,黑客采用 ARP 软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击、流量被限、账号被窃的危险。由于攻击门槛非常低,普通人只要拿到攻击软件就可以扰乱网络秩序,导致现在的公共网络、家庭网络、校园网、企业内网等变得脆弱无比。
所以,如何进行有效的 ARP 防御?作为普通用户怎么防御?
作为网络 / 安全管理员又怎么防御?有哪些 ARP 防御软件?
如果被 ARP 攻击了,如何揪出 “内鬼”,并 “优雅的还手”?
接下来,我们通过图解的方式来深入了解 ARP 防御原理与解决方案。
二、ARP 防御原理与解决方案
在讲解 ARP 防御之前,我们先回顾下 ARP 攻击最经典的一幕 =>

当 PC1 询问 PC2 的 MAC 地址时,攻击者 PC3 返回ARP 欺骗回应包:我的 IP 地址是 IP2,MAC 地址是 MAC3。一旦 PC1 记录了错误的 ARP 映射,则发给与 PC2 的数据,都会落到 PC3 手里。
也就是说,ARP 攻击的罪魁祸首便是这种 “欺骗包”,若针对欺骗包的处理是不相信或不接收的话,则不会出现问题。处理这种欺骗行为我们没法提前在黑客端做手脚,因为 “敌在暗处我在明处”。这样的话,我们就剩下两个解决方法:
① 保证电脑不接收欺骗包
② 保证电脑收到欺骗包之后不相信
目前网络安全行业现有的 ARP 防御方案,基本都是上面两个方法的具体实现。我们来看看这张防御图:

① 当黑客发起 ARP 欺骗包时,会途径局域网里面的交换机或无线路由器等网络设备;
② 如果网络设备能够识别这种欺骗包,并且提前丢弃掉,则电脑 / 手机端就不会被欺骗;
③ 如果网络设备没有拦截这种欺骗包,则电脑 / 手机端需要做安全防御,然后再丢弃。
简单来说,ARP 防御可以在网络设备上实现,也可以在用户端实现,更可以在网络设备和用户端同时实现。接下来,我们先来了解下网络设备(例如这里的交换机)的防御技术。

上面这张图,展现的是交换机的 ARP 防御能力,当 PC2 发送 ARP 回应包时,交换机将其转发给 PC1,而当 PC3 发送 ARP 回应包(欺骗)时,交换机直接丢弃。
但是,人家 PC3 上脸上又没有写着 “hacker”,凭什么交换机要丢弃它的 ARP 回应包? 凭什么判断它的包就是 “欺骗” 的呢?
接下来,我就要给大家介绍下局域网安全里比较常用的防御技术,这种防御技术被称为DAI(Dynamic ARP Inspection)- 动态 ARP 检测,原理可以用两句话简单概括:
① 交换机记录每个接口对应的 IP 地址和 MAC,即 port<->mac<->ip,生成 DAI 检测表;
② 交换机检测每个接口发送过来的 ARP 回应包,根据 DAI 表判断是否违规,若违规则丢弃此数据包并对接口进行惩罚。

我们知道,PC3 是在交换机的 Port3、MAC 地址是 MAC3,IP 地址是 IP3,所以本地 DAI 表项内容是 <port3-mac3-ip3> 。当交换机从接口 Port3 收到 ARP 回应包,内容却是 IP2 和 MAC3 映射,即 <port3-mac3-ip2>。
经判断,这个包就是虚假的欺骗包,交换机马上丢弃这个包,并且可以对接口做惩罚(不同设备的惩罚方式有所不同,可以直接将接口 “软关闭”,直接将攻击者断网;也可以 “静默处理”,仅丢弃欺骗包,其他通信正常)
上面这个动态 ARP 监测技术,可以说是目前防御 ARP 攻击最有效的方法之一。但是,作为初学者,大家可能还会有疑问:
① 一般的交换机或网络设备能部署动态 ARP 监测技术吗?
② 连接用户的交换机,怎么能识别 IP 地址信息呢?
③ 上面这张 DAI 表是如何生成的?是不是像 CAM 表一样能自动识别?
这里要给大家说个稍微悲伤一点的事实,大部分能支持这种动态 ARP 监测技术的交换机或者无线路由器,都基本是企业级的产品。 即便是企业级交换机,具备局域网安全防御功能的设备,价格都要高出不少,所以很多中小型企业网或校园网,基本都愿意买 “阉割版” 网络接入产品,因为 “能通就行”,至于安全性怎样,这是另外要考虑的问题。
所以,简单的交换机不具备动态 ARP 监测技术,即便市面上有带安全防御的网络产品,企业、学校、医院等大量网络,仍然在早期采购的时候,用的是比较基础版本的交换机。当然,随着网络与安全市场的激烈竞争和网络安全意识的增强,以后会越来越好。
另外,交换机能识别 IP 地址信息吗?
从现在的网络技术来看,分层界限越来越模糊,融合式的网络设备才是主流,现在的接入交换机基本能被 Telnet/SSH/Web 管理,更专业的交换机同时支持动态 ARP 监测(dai)、IP 源防护(ipsg)、DHCP 侦听(dhcp snooping)、端口安全、AAA、802.1x 等局域网安全技术,已经超越了原有二层交换机的定义。
所以,交换机能读三层甚至七层的数据包已经不是什么新鲜事了,不要被 “交换机就是二层设备” 给束缚了,这只是纸面上的定义。
**最后一个问题,DAI 检测表是如何生成的?
在上面图解中,我们看到交换机查看的表已经不是原来的 CAM 表了,内容也不太一样,CAM 表的内容主要是 MAC 和 Port 的映射,而 DAI 检测表则是 Port、MAC、IP 三个信息映射。
目前这张表支持两种方式来生成 =>
第一种方式就是手工静态绑定:即用户接入网络之后,管理员根据此用户电脑的 MAC 和 IP 地址,然后在接口上绑死,缺点就是用户数太多的话,手工绑定管不过来。
第二种方式就是目前最主流的做法,即在交换机上开启 DHCP 侦听技术,当用户第一次通过 DHCP 获取到地址的时候,交换机就把用户电脑的 IP、MAC、Port 信息记录在 DHCP 侦听表,后面 ARP 检测直接调用这张 DHCP 侦听表即可。
小结:以上便是在网络设备上部署的 ARP 防御技术,通过动态 ARP 监测技术(DAI),可以很好的解决 ARP 欺骗问题。技术虽好,但局域网内的交换机、无线路由器是否支持 DAI,这个则取决于实际网络情况,尤其是**十面埋伏的公共 WiFi 网络、脆弱无比的家庭网络、能通就行的校园网络…我们都应该持怀疑态度,至少不能完全信任这些网络。
既然这样的话,普通用户有没有 “自救” 的方法,能够抵挡 ARP 攻击呢? 答案是肯定的 =>

对于普通用户,陌生网络不要随意接入,肯定是首选考虑的;当然,这里研究的是用户已经接入了网络,如何做安全防御的问题。从上图可以看到,用户(电脑或手机)最重要的便是通过安装 ARP 防火墙做安全防御,很多普通用户甚至 “以电脑裸奔为豪,以骂安全厂商为荣”,这是对技术的严重藐视,对自己隐私的不负责任。 普通小白一定要记住一句话:你没有被黑,只是你还没有到达被黑的价值。
ARP 防火墙在技术实现上,一般都有以下功能:
① 绑定正确的的 IP 和 MAC 映射,收到攻击包时不被欺骗。
② 能够根据网络数据包特征(参考上一篇讲解的 ARP 攻击数据包溯源分析),自动识别局域网存在的 ARP 扫描和欺骗行为,并做出攻击判断(哪个主机做了攻击,IP 和 MAC 是多少)。
那么,有哪些常见的 ARP 安全产品呢?
自带 ARP 防御功能:腾讯电脑管家、360 安全卫士……
专业的 ARP 防火墙:彩影 ARP、金山贝壳、360ARP 防火墙……
采用安全产品肯定是普通用户最省时省力的做法,而对于技术人 / 工程师而言,如果不屑于使用安全产品,并且希望解决 ARP 攻击行为,也可以通过 “ARP 双向绑定” 的技术来实现。什么是 “ARP 双向绑定” 呢?

从上图可以看到,PC1 和 PC2 通信双方都静态绑定对方的 IP 和 MAC 映射,即便收到 ARP 欺骗包,由于静态绑定的 ARP 映射条目优先级高于动态学习到的,所以可以保证不被欺骗。
这种做法非常 “绿色无污染”,因为不需要额外的软件安装,但是缺点也非常明显,例如普通用户不知道如何在电脑上做 ARP 静态绑定,另外工作量也比较大,每个主机和网关设备都需要绑定整个局域网的 ARP 静态映射。以下面的家庭 WiFi 网络为例:

像这个 WiFi 网络,如果通过 ARP 双向绑定来解决安全问题,配置量其实蛮大的,当然,这就基本能够保障内网主机间通过以及主机访问互联网的安全性了。
Windows arp 静态绑定方法 =>
① 进入命令行 cmd 界面;
② [arp -s ip 地址 mac 地址],例如:arp -s 192.168.1.1 00-11-22-a1-c6-09
注:家用无线路由器若要进行 ARP 绑定,则需要通过 web 登录并进行图形操作
小结:用户端的 ARP 防御方法,要么安装 ARP 防火墙,要么做 ARP 双向绑定。对于绝大部分用户来讲,虽然安装防火墙不是保证百分百安全了,但是能够解决很大一部分的隐患。
三、如果被 ARP 攻击了,如何揪出 “内鬼” 并 “优雅的还手”?
相比 “如何防御 ARP 攻击”,我相信更多人感兴趣的是 “如何揪出内鬼并进行还手”,因为 “揪出内鬼” 的时候,我们充当着 “网络警察” 的角色(把小偷逮住),而 “优雅的还手” 又充当着 “法官” 的角色(惩治小偷)。
而充当网络警察或法官这种角色,我可能算是比较有经验的… 从我刚接触网络 / 安全到现在,充当的次数多的数不过来:在学校外面租房的时候(别想歪)、在网吧上网的时候、在音乐餐吧吃饭的时候、在麦当劳 / 德克士蹭网的时候… 可能普通用户觉得稀疏平常的地方,在网络世界里实则暗流涌动。
我第一次 “抓内鬼当法官” 应该是在 2010 年的时候,当时在学校旁边租了一个房子自己做技术研究。有一天晚上,网速变得特别慢,网页基本没法打开,QQ 勉强还能挂着,但是租房以来网络一直还可以,虽然不算快,但是也至少满足平常上网需求啊。我心想:算了,毕竟租的房子一般,每个月网费也就 30 快,房东拉的宽带可能比较垃圾不稳定吧,明天再看看。
第二天早上爬起来,发现网络一点问题都没有,该开的网页,该下载的资料,都没有任何影响,恩,心情不错,不用专门跑回学校一趟下载资源之类的。但是到了晚上七八点的时候,网络又出现问题了,跟昨天晚上的情况一模一样,基本没法上网,但是网卡又显示连接着,这让我非常的郁闷。
然后我突然想起这几天,这栋楼好像新来了一个租客,这栋楼一共就四层,一层就 3 户租客,一共也就 10 来户,而一楼还是房东自己一家人住,我自己住二楼。基本上这栋楼里的租客都能记得七七八八,所以如果有陌生面孔的话,一眼就能认出来,我们暂且把这个人称为 H,看上去是个上班族。
虽然当时还是个小菜鸟,但是毕竟学这块的,还是有点敏感:擦,会不会是这个人白天去上班,晚上回来宿舍,就开始限制我们的网速啊?
你不犯我,相安无事,你若范我,我必搞你。(年轻人还是有点浮躁啊…)
行,开干吧,多想没用。然后便拿出了 P2P 终结者(忘了当时用什么软件了,不过八九不离十)一扫描,想探探网络究竟。
万万没想到啊,居然遇到老司机了,人家局域网权限比我还高(很多局域网流控软件都有权限的概念,若同一个局域网同时有多个使用这个流控软件,则权限高的优先控制,其他人的软件会自动退出),网络扫描进行一半,就提示 “局域网有多人使用,由于你权限较低暂停退出” 这样的提示,这样一来,就验证了我的判断,这个内鬼应该是 H。自从他来了之后,这个网络就出了问题。这栋楼的网络拓扑结构是这样的 =>

普通小白遇到这种情况,装个 ARP 防火墙,咬咬牙也就过去了。但是咋们学网络和安全的,遇到这种情况,感觉就好像被人骑在头上一样。那咋办呢?作为一个理科男,做事情还是得按步骤走,不能被脾气牵着走,虽然当时已经非常生气了,但是基本定下来这个解决流程:
第一:马上给电脑安装防火墙,先脱离 H 的控制(当时电脑居然是裸奔的…);
第二:想尽办法找到 H 的 IP 和 MAC 地址(很多小伙伴看到这里可能会想:直接上去楼上揍他一顿不就得了,还费什么劲找地址啊。这个有必要说明下:①我个头没人家大只 ②人家要是问:你有证据吗,你取证了吗? 所以,武力不能解决问题,但是技术能力可以。)
第三:想方设法拿到网络控制权,把他踢下去。
第一步:具体就不说了,也忘了当时装的什么安全软件了;
第二步:怎么找到攻击者的 IP 和 MAC 地址呢?
2010 年的安全软件,不像现在的 ARP 防火墙,能够主动告警,并且说明攻击次数和攻击源,所以还是需要自己折腾下:熟练的打开电脑之前安装好了的 wireshark,监听自己电脑网卡的流量,设置流量过滤器(仅过滤 arp 协议),不出意外,接下来就是一堆 “带有节奏的 ARP 扫描包”(还记不记得之前章节说过的,ARP 攻击一般会涉及到持续的内网扫描和欺骗攻击)。当时收到的数据包大概这样的:

通过流量数据包分析,很快就确定了攻击者的 IP 和 MAC 地址。这里要注意:虽然抓到了攻击者的 IP 和 MAC 地址,但是!我们还是没法实锤的证明:攻击者就是 H。
这个攻击者是不是真的 H 啊?怎么确定就是这个人干的呢?如何把虚拟世界里的地址跟真实世界的人匹配起来?
接下来我便想到了一个方法:如果我们能先拿到网络的控制权,然后把攻击者给踢下去直接断网,同时保证其他人网络连通;然后,谁要是下去跟房东沟通反馈不能上网,不就可以基本断定这个人就是攻击者?说白了,就是 “谁叫谁小狗”…
好,到了计划的第三步:如何拿到整个网络的控制权?这里就没走的那么顺畅了:现在的实际情况是:我和攻击者同时开启局域网流控软件,而是我被踢下来了,因为我权限低一些。当时的第一个想法是:我换一个流控软件不就得了?这样我不跟你拼这个软件的权限。但是仔细想了想,即便换一个流控软件能用,但是顶多也就是打个平手,我控制不了你,你也控制不了我,但最终遭殃的还是其他普通小白,这个方法不能 “斩草除根” 啊。
怎么办呢?是不是只能跟他打个平手。在这里卡了很久但又心有不甘,然后到了大半夜了突然顿悟:擦,为什么要跟他 “限来限去” 呢,直接上整栋楼的出口路由器,把他踢出去不就得了?路由器(应该是 TP-LINK)就在一楼楼梯口,然后其他楼层加一个 hub 级联上去,所以大家都在一个网络里面。
但问题是没有路由器的后台登录密码,怎么解决呢?抱着侥幸的心理,查看电脑网关地址,然后浏览器输入网关地址,弹出了登录页面,尝试 admin/admin?不行,再尝试 admin/123456?还是不行… 就这样尝试了常见的十几二十个账号密码,都提示账号密码错误,看来运气不是很好。
既然这样的话,就只能拿出暴力破解软件跑几个词典看看,用 hydra 挂着用户名和密码词典,慢慢的看着命令行输出,但输出结果基本都是 failed… 所以,第二天晚上虽然发现了攻击者的 IP 和 MAC 地址信息,但是拿他没办法,只能先忍着。
到了第三天白天,脑子里想的都是如何登录这个路由器后台管理界面,尝试跑了几个词典都没法登录,心理又在想:房东不应该会设置太复杂的密码啊,四五十岁的阿姨,完全不懂技术啊,网络应该也是叫人搞的,即便别人设置密码也应该给阿姨设置比较简单的让她好记的,方便后面维护之类的… 一想到这里,赶紧从柜子里掏出之前的租房合约和房东名片,然后把房东的手机号码、房东的姓名拼音等信息做成简单的密码词典,再重新跑一次,还没反应过来,就显示密码尝试成功:admin / 房东手机号码。万万没想到,以为只要 6 位或者 8 位的密码,居然是一个 11 位的手机号码,之前尝试的词典都是 8 位以内的。
接下来用浏览器访问路由器后台管理界面,进入主机列表,还没发现这个昨晚攻击者的 IP 地址上线。等到了晚上七八点的时候,终于在路由器上发现这个 IP 地址,而且,wireshark 同时也抓到了这个攻击者发起的扫描包。看来是攻击者一回到宿舍,打开电脑,就直接挂着攻击软件,确实是个 “惯犯” 啊。好吧,看到这个情况,我直接在出口路由器上把这个 IP 和 MAC 地址禁用,看接下来发生什么。
果然,大概过了半个钟,有人从楼上下来,直接去一楼找房东阿姨去了,具体说什么这个不清楚,但是应该是询问是不是宽带欠费之类的导致不能上网。
过了一会,阿姨带着他上来二楼… 然后敲门询问:你们二楼能不能上网啊?大家都陆续回答:可以啊、没问题啊。与此同时,我已经确定了:**眼前的这个人,H 就是攻击者!他大概没料到,自己已经控制了内网,怎么可能被踢掉之类呢。
阿姨也不知道怎么办,只能说明天看看吧。看着他无辜的眼神回楼上去了,我也觉得抓到内鬼也就算了,先把他解禁看看。然后 “惯犯” 又上线了,看来没有吃够苦头啊,当天晚上直接让他断网。之后的几个晚上类似的情况慢慢少了,因为只要他一扫描发起攻击,我这边就断他网,然后隔 10 分钟或者半个钟看看他反应,就这样慢慢地把他制服了,整栋楼的网络也就逐渐恢复了平静……
四、ARP 防御总结
① ARP 攻击非常低门槛,但是造成的影响却很大,包括断网攻击、流量被限、账号被盗等;
② ARP 防御可以在网络端(网络设备)上部署,也可以在用户端(电脑 / 手机)上部署;
③ 网络设备(例如交换机)部署 ARP 防御,通常需要用到 DAI(动态 ARP 监测)技术,更加专业的局域网安全防御,还可能结合 DHCP 侦听、IP 源防护、端口安全、AAA、802.1X 等技术,这些专业的防御技术,是由网络运维和安全运维工程师来实施的。
④ 用户端(电脑 / 手机)实施 ARP 防御,最好的方法就是不要随意接入陌生网络,并且安装 ARP 防火墙。当然,技术宅的话,可以采用 “ARP 双向绑定” 的方法,相对比较麻烦,但是也奏效。
⑤ 作为一名有素养的网络 / 安全工程师,应该不作恶。但是如果遭受攻击,应该揪出内鬼并 “优雅的还手”,做一个网络警察,还普通用户一个干净的网络环境。
图解 ARP 协议(四)代理 ARP:善意的欺骗
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 30 日 23:59
一、代理 ARP 概述
我:当电脑要访问互联网上的服务器,目标 MAC 是什么?
很多小伙伴在刚学习网络协议的时候,经常这样直接回应:不就是服务器的 MAC 嘛!

这时我会反问:那电脑怎么拿到这个服务器的 MAC 地址呢?
小伙伴一般都自信的抛出下面两个点:
① 根据网络通信中数据封装的原则,通信双方需要封装源目 IP 和 MAC 地址;
② 如果要拿到目标 MAC 地址,就需要通过 ARP 协议进行交互。
我:好,确实没毛病,你是指的下面这个意思吧 ==>

小伙伴:对对对,是这个意思的。
我:好,你再看看下面这个图,再确认下。

小伙伴:好像不太对唉,刚才没注意看… 互联网这么多路由器,根据之前学过的:
① 路由器隔离广播域,每个接口 / 网段都是独立的广播域;
② ARP 请求是二层广播包,广播包没法过路由器;
这样的话,ARP 请求广播包根本没法穿越互联网到达目标服务器。
我:那我们平常上微博逛知乎去京东剁手基本都依据上面这张图,通过 DNS 协议将域名解析为 IP 地址,通过 ARP 协议将 IP 解析为 MAC 地址。现在 ARP 请求无法穿越过去,电脑便无法获取目标服务器的 MAC 地址,怎么跟它通信呢?
小伙伴:……
上面这个疑惑,我相信每个学习网络协议的初学者经常会问到,更普遍的情况是,很多工作多年的工程师,也未必能够将下面这几个问题完全搞清楚:
① 电脑访问互联网服务器的时候,ARP 询问的内容,真的是问服务器的吗?
② 什么是代理 ARP?跟 ARP 有什么区别?什么场景下会用到代理 ARP?
③ 代理 ARP 跟网关(默认路由)设置有什么关系?
所以,这一篇文章虽然是讲代理 ARP,但其实核心内容是围绕代理 ARP,解读跨网段通信过程中,ARP / 代理 ARP / 网关(默认路由)/ 数据封装等相关问题。
二、代理 ARP 原理
当 ARP 请求目标跨网段时,网关设备收到此 ARP 请求,会用自己的 MAC 地址返回给请求者,这便是代理 ARP(Proxy ARP)。

上面这张图中,电脑发送 ARP 请求服务器 8.8.8.8 的 MAC 地址,路由器(网关)收到这个请求时会进行判断,由于目标 8.8.8.8 不属于本网段(即跨网段),此时便返回自己的接口 MAC 地址给 PC,后续电脑访问服务器时,目标 MAC 直接封装为 MAC254。
代理 ARP 本质是一个 “善意的欺骗”,是一个 “错位” 的映射。从图中我们看到服务器地址的正常映射是 < 8.8.8.8-MAC2>,而路由器返回给电脑的,却是 <8.8.8.8-MAC254>。不管是不是 “欺骗”,至少最终电脑可以与外网的服务器实现通信,以 PC Ping Server 为例 =>

实际网络中,代理 ARP 由网络中的网关设备来执行,包括路由器、多层交换机、无线路由器、防火墙等设备。并且,网关即便有代理 ARP 功能,也未必一定执行,还必须满足两个条件:
① 网关已经开启代理 ARP 功能;
② 网关有目标的路由信息。
我们来看下面这张图 =>

上面这张图中,我们假设路由器已具备全网的路由,但连接电脑的接口没有开启(或不支持)代理 ARP 功能,此时便造成一个尴尬的情况:电脑反复询问到 8.8.8.8 的 MAC 地址,路由器收到之后,处理流程跟正常 ARP 是一致的,“问自己的回复,不是问自己的丢弃”。因此,当网络通信采用代理 ARP 时,可能会 “受制于沿途网关设备”,造成网络通信故障。
进一步思考:既然代理 ARP 不是一种特别流畅的实现,会 “受限于别人”,那我们没必要一定要使用它。甚至,这里我们需要搞清一个事实:实际网络中,无论是同网段还是跨网段通信(例如访问互联网),绝大情况下都是使用正常的 ARP,而不是代理 ARP。 生活中的上网的经验也已经告诉我们,好像从来没有遇到或听到过 “XXX 设备不支持代理 ARP 功能,导致通信故障” 这样的问题。
很多小伙伴看到这里,会有大大的疑惑:
① “什么!我们才刚学习了代理 ARP 的实现原理,现在居然告诉说它没怎么用?”
② 那为什么要创造代理 ARP,它的真正使用场景在哪里??
③ 上述图解中,电脑跨网段通信时 ARP 到底是如何工作的???
接下来给大家划重点:
第一,代理 ARP 仅仅是正常 ARP 的一个拓展使用,是可选项而不是必要项;
第二:代理 ARP 有特定的应用场景,与网关 / 路由的设置有直接关系:当电脑没有网关 / 路由功能时,并且需要跨网站通信时,则会触发代理 ARP。换句话说,如果有网关 / 路由功能,则不需要代理 ARP;
第三:正常环境下,当用户接入网络时,都会通过 DHCP 协议或手工配置的方式得到 IP 和网关信息(所以不需要代理 ARP)。
三、ARP 与代理 ARP:不是互斥而是互补
在大家理解了代理 ARP 的工作原理和应用场景之后,接下来我们终于可以更加全面的分析开篇的这个经典问题:
当用户访问互联网的时候,到底用 ARP 还是代理 ARP?
跟网关 / 路由设置有什么关系?
数据封装又有什么区别?
我们通过下面两张图做个对比 =>
当电脑没有网关时,PC Ping 8.8.8.8,采用代理 ARP =>

当电脑有网关时,PC Ping 8.8.8.8,采用正常 ARP =>

通过上面的对比,我们得到以下信息:
① 电脑没有网关时,ARP 直接询问目标 IP 对应的 MAC 地址(跨网段),采用代理 ARP;
② 电脑有网关时,ARP 只需询问网关 IP 对应的 MAC 地址(同网段),采用正常 ARP;
③ 无论是正常 ARP 还是代理 ARP,电脑最终都拿到同一个目标 MAC 地址:网关 MAC。
为了让上面这个总结更加的通用性,我们将原有的网络拓扑稍微复杂化 =>
当电脑没有网关时(采用代理 ARP ),PC 依次 Ping 8.8.8.8、8.8.4.4、114.114.114.114=>

当电脑有网关时(采用正常 ARP ),PC 依次 Ping 8.8.8.8、8.8.4.4、114.114.114.114=>

通过上面的拓扑,我们可以得到更加通用性的总结,归纳如下:
① 当电脑没有网关(采用代理 ARP)时:“跨网段访问谁,就问谁的 MAC”
② 当电脑有网关(采用正常 ARP)时:“跨网段访问谁,都问网关的 MAC”
③ 无论哪种 ARP,跨网段通信时,发送方请求得到的目标 MAC 地址都是网关 MAC。
注明:网关(Gateway)、下一跳(Next-hop)、路由器(Router)都指的是离发送方最近的三层(或多层)设备,具备三层和路由转发功能。
举例:我们通过 WiFi 上网时,网关就是无线路由器,它帮忙将电脑和手机的数据转发到互联网;所以,我们访问互联网时(无论访问谁),电脑和手机采用的目的 MAC,都是无线路由器的 MAC。有兴趣的小伙伴都可以跟着我验证下(请见下面章节)。
四、ARP 与代理 ARP 实战指南
为了让大家更直观理解,真正 “亲眼所见” 上面学到的技术原理,这里我带大家 在真实网络和虚拟环境分别验证。第一个实验,主要是针对没任何命令基础的小伙伴,大家可以在家就可以实验;第二个实验,主要针对有一定网络和安全基础的小伙伴,通过构造网络虚拟实验环境来验证。
(一)真实网络下 ARP 与代理 ARP 实验

这个网络中,我的电脑地址是 192.168.199.177,连接到极路由(无线路由器),通过极路由器访问互联网。这个 WiFi 网络的主机列表情况如下,这里的 PC 就是我的 Macbook。

接下来再看看极路由 MAC 地址 =>

查看我的电脑 (Macox 系统)IP 地址和网关信息,通过命令 “ifconfig” 查看 ip 地址 =>(Windows 系统则通过 “ipconfig /all” 查看 IP 地址和网关信息)

通过命令**“netstat -rn”**查看我的电脑网关设置 =>

接下来,我的电脑连续 PING 8.8.8.8 和 114.114.114.114 或其他外网地址 =>

重点来了,在我的电脑连续访问这么多外网地址之后,我们来看看 ARP 表项是怎样的,是否有 8.8.8.8、114.114.114.114、www.pinginglab.net(120.24.59.68)对应的 MAC 呢?
通过命令 “arp -a” 查看电脑的 ARP 缓存信息 =>

从最终的 ARP 内容来看,我的电脑只记录着本机和网关的 MAC 地址,MAC 地址 “d4:ee-07:54:c1:9e” 就是上面给大家截图的极路由 MAC。
通过这个真实网络的实验,我们可以验证了以下内容:
① 真实网络中一般都是正常 ARP,而不是代理 ARP;
② 当电脑有网关(采用正常 ARP)时,无论跨网段访问谁,都直接问网关的 MAC;
③ 当第一次获取网关 MAC 之后,后续的通信都不再需要重新进行 ARP 请求。(这个是比较容易忽略的,而代理 ARP 每次访问新的外网地址,都需要再次请求)
(二)虚拟环境下 ARP 与代理 ARP 实验
网络拓扑采用 GNS3 搭建,采用 C3640 操作系统镜像 =>

① 首先为各个设备打开接口并配置 IP 地址:
PC (config)#int f0/0
PC (config-if)#no shutdown
PC (config-if)#ip address 192.168.1.1 255.255.255.0
Router (config)#int f0/0
Router (config-if)#no shutdown
Router (config-if)#ip address 192.168.1.254 255.255.255.0
Router (config-if)#int f1/0
Router (config-if)#no shutdown
Router (config-if)#ip address 8.8.8.1 255.255.255.0
Server (config)#int f0/0
Server (config-if)#no shutdown
Server (config-if)#ip address 8.8.8.8 255.255.255.0
② 为各个设备设置路由信息:
a. 关闭 PC 上路由功能,模拟主机并查看路由表(此时的电脑没有设置网关)
PC (config)#**no ip routing
PC#**show ip route
\# Default gateway is not set
Host Gateway Last Use Total Uses Interface
b. 设置并查看 Router 和 Server 路由表,保证联通,模拟互联网(这里 Router 已有全网的直连路由,Server 需要设置返回内网的路由;实际环境应该通过 NAT 返回,这里不再深入)
Router#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
8.0.0.0/24 is subnetted, 1 subnets
C 8.8.8.0 is directly connected, FastEthernet1/0
C 192.168.1.0/24 is directly connected, FastEthernet0/0
Server (config)#**ip route 192.168.1.0 255.255.255.0 8.8.8.1
Server#**show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
8.0.0.0/24 is subnetted, 1 subnets
C 8.8.8.0 is directly connected, FastEthernet0/0
S 192.168.1.0/24 [1/0] via 8.8.8.1
③ 查看 PC/Router/Server 的接口 MAC 地址:
PC#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is**cc05.1f56.0000 (bia cc05.1f56.0000)
Internet address is 192.168.1.1/24
Router#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is**cc07.1f56.0000 (bia cc07.1f56.0000)
Internet address is 192.168.1.254/24
Router#show int f1/0
FastEthernet1/0 is up, line protocol is up
Hardware is AmdFE, address is**cc07.1f56.0010 (bia cc07.1f56.0010)
Internet address is 8.8.8.1/24
Server#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is**cc06.1f56.0000 (bia cc06.1f56.0000)
Internet address is 8.8.8.8/24
④通过 Wireshark 抓取 PC 和 Router 链路的数据包,并让 PC ping Server(8.8.8.8),查看 ARP 问答信息:
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!! (一个 ping 来回为一个!标识,而第一个点,代表此时正在 arp)
Success rate is 80 percent (4/5), round-trip min/avg/max = 44/47/48 ms

从数据包可以看到,由于 PC 没有设置默认网关,所以直接采用代理 ARP 方式询问: 即直接询问跨网段目的 8.8.8.8 的 IP 地址。而由于路由器 Router 默认开启了代理 ARP 功能,所以直接用自己的 MAC 地址回应了。这里的 cc:07:1f:56:00:00 即路由器的 MAC 地址。这里顺便查看下 PC 的 arp 表:
PC#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 8.8.8.8 9 cc07.1f56.0000 ARPA FastEthernet0/0
Internet 192.168.1.1 - cc05.1f56.0000 ARPA FastEthernet0/0
因此,这里便验证了:当电脑没有设置网关信息,则采用代理 ARP。
我们接着验证另外一个点:当采用代理 ARP 时,会 "受限于沿途网关设备",例如网关设备(路由器)可能不支持代理 ARP 或关闭代理 ARP 功能,此时电脑就无法与外网 IP 实现通信。
怎么验证呢?这里我们需要关闭路由器接口的代理 ARP 功能,并且清空电脑 PC 的 arp 表=>
Router (config)#int f0/0
Router (config-if)#no ip proxy-arp
PC#clear arp
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
查看底层数据包交互过程 =>

当路由器关闭代理 ARP 时,此时电脑 “苦苦哀求” 外网 8.8.8.8 的 MAC 地址,而路由器直接丢弃不再返回,由于电脑没有目标 IP 对应的 MAC 信息,所以通信失败,即 **…**我们来看下此时 PC 的 arp 表是怎样的 =>
PC#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 8.8.8.8 0 Incomplete ARPA
Internet 192.168.1.1 - cc05.1f56.0000 ARPA FastEthernet0/0
⑤ 为 PC设置默认网关,重新 ping 8.8.8.8,看看能不能通 =>
PC (config)#**ip default-gateway 192.168.1.254
PC#**ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 44/244/1040 ms
可以看到,当电脑具备网关信息之后,此时直接采用 ARP 询问网关的 MAC,即去往 8.8.8.8 的时候直接询问 192.168.1.254 的 MAC,这个时候不管 Router 有没有开启代理 ARP,也会正常回应 PC 的 ARP 询问,我们来看看底层数据包截图 =>

四、代理 ARP 总结
① 本章节我们深入学习了代理 ARP 的原理和实践,在文章的开头,我们通过一个引子,帮大家矫正一个误区:跨网段通信时,就一定要用到代理 ARP;
② 代理 ARP 是一个 “善意的欺骗”,当电脑要跨网段访问外网设备时,网关设备用自己的 MAC 返回;
③ 代理 ARP 和 ARP 的具体实现,跟电脑是否有设置网关有直接的关系;有网关通过 ARP,没网关通过代理 ARP;代理 ARP 可以看成是 ARP 的补充;
④ 代理 ARP 会 “受限于沿途网络设备”,真实网络里面一般都直接用 ARP 获取 MAC 地址。
图解 ARP 协议(五)免费 ARP:地址冲突了肿么办?
陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 03 日 10:30
一、免费 ARP 概述
网络世界纷繁复杂,除了各种黑客攻击行为对网络能造成实际破坏之外,还有一类安全问题或泛安全问题,看上去问题不大,但其实仍然可以造成极大的杀伤力。今天跟大家探讨的,也是技术原理比较简单,但实际防范比较头疼的一个问题:地址冲突。

这个局域网中,大家所在 IP 网段是 192.168.1.0/24,PC1 的地址是 192.168.1.1,而 PC2 和 PC3 的地址发生冲突,都是 192.168.1.2。那么,如果 PC1 需要将数据包发送给 192.168.1.2,数据包最终到了 PC2 还是 PC3 手里?还是负载均衡?不管结果如何,这里的地址冲突肯定会对正常通信造成麻烦。
上面这个电脑 / 手机之间的地址冲突,大家可能觉得没什么太大的问题,那么接下来再看下面这个图片 =>

这里的 Server1 和 Server2 处在 [服务集群] 中,提供着企业的某种服务,例如 Web 网站、邮箱系统、FTP 文件服务器等,此时服务器的地址发生了冲突,都是 10.1.1.1。这种地址冲突则会影响大规模的用户无法访问这个服务器,若服务器承载的是核心业务,对于企业则会造成极大的影响。
所以,地址冲突问题可大可小,可能网络运维人员部署上的疏忽,也可能是普通电脑小白无意导致的,更有可能是主动的黑客行为,例如攻击者制造地址冲突场景,扰乱正常业务,导致业务服务中断。
因此,**如何在 IP 地址冲突的时候及时检测,并且做出解决方案呢?
二、免费 ARP 原理
Gratuitous ARP,被翻译为『免费 ARP』也被称为『无故 ARP』,用于检测局域网内的 IP 地址冲突,在一定程度上能够给用户和网络运维人员提供帮助。相比『免费』这个翻译,『无故』这个词其实会更加好理解:"在没有人问自己的情况下,无缘无故自问自答"。

这项技术不需要电脑和服务器安装什么安全软件或产品例如防火墙之类的,也不需要交换机和路由器购买什么 license,只要设备具备联网功能(有网卡)就内置了这项功能,由于免费 ARP 本质是 ARP 协议的实现,所以只要有 TCP/IP 协议栈的网卡,就能支持。相比其他安全防御技术,**免费 ARP 是一项轻量级的 “用户无感知” 的技术。
接下来,我们来回顾下之前的图片 =>

当用户发送数据包给 192.168.1.2 的时候,交换机会将数据包转发给谁呢?
① 根据我们之前学过的 ARP 原理,交换机会拆开这个数据包,并且根据目的 MAC 进行转发;
② 那么 PC1 在数据封装的时候,目的 MAC 是封装 PC2 还是 PC3 的 MAC?
③ 目标 MAC 则取决于电脑本地的 ARP 缓存表,所以 PC1 最终把数据包给 PC2 还是 PC3,则取决于收到的 ARP 回应,并且根据 “后到优先” 原则作出选择。
所以,若 PC2 提前回应 ARP,则 PC1 一直发给 PC3;若 PC3 提前回应 ARP,则 PC1 一直发送给 PC2。还有一种情况,PC2 和 PC3 交替回应 ARP,PC1 有可能将部分数据给 PC2,部分数据给 PC3(而 PC1 则处于懵逼状态,因为关于 192.168.1.2 的 MAC 映射一直在变动)。这个更多是理论推导,实际情况不同设备测试出来的效果有些差异,后面章节我会带大家做真实和虚拟网络的实验。
我们来看看免费 ARP 是如何工作的并介入这场冲突的?

当电脑检测到自己的 IP 地址跟其他电脑冲突时,它们会相互发送免费 ARP(“互怼”),用来提醒对方:你的 IP 地址跟我的冲突啦! 这里要注意一点:免费 ARP 是 以 ARP Request 或 Reply 广播形式发送,将 IP 和 MAC 地址信息绑定,并宣告到整个局域网。如果在宣告的过程中,其他电脑监听到,并且地址跟自己一样,也会直接参与这个 “互怼” 过程。
上面 PC2 和 PC3 一直不停地对外发送免费 ARP:我的地址是 192.168.1.2,MAC 是 xxx。与此同时,同一局域网的其他主机,则根据这两个免费 ARP 信息不断的修改本地 ARP 表,192.168.1.2 一会映射到 MAC2,一会映射到 MAC3。
那么,这个混乱的争抢过程,会不会停下来呢?
可能会持续一段时间,也可能一直持续下去(后面有实验验证)。冲突方之间可能会一直发送,直到有一边做出让步并修改 IP 地址。(不同系统解决方法不同)
很多人在这里开始有疑惑,即便免费 ARP 帮我们检测到了地址冲突,但是也是在协议底层在 “互怼”,我们作为 “主人”,如何收到地址冲突提示,并且做出修改和让步呢? 因为无论是普通用户还是专业工程师,也不可能天天挂在 wireshark 这种抓包软件,时时刻刻盯着免费 ARP 包,判断是否有人跟我们地址冲突了。所以,这又涉及到电脑(操作系统)如何根据免费 ARP 的地址冲突检测,更好的提示或帮助用户了。
目前行业的解决方案是这样的:如果是图形化操作系统,例如 Windows 或者 MacOS,是通过系统弹框的方式提示用户;而如果是命令行操作系统(交换机 / 路由器 / 防火墙),则通过日志报错信息提示用户。
也就是说,无论普通电脑还是专业的防火墙设备,通过免费 ARP 检测到地址冲突之后,设备都会弹出来跟他说:**喂,主人,你地址跟人家冲突了,该改改了!
这是 Windows 和 MacOS 的地址冲突弹框告警,引导用户修改本机 IP 地址 =>

这是思科路由器 IOS(网际操作系统)的地址冲突日志信息,引导网络运维人员修改 IP 地址 =>
% IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
所以,当地址发生冲突时,根据免费 ARP 引起的弹框和日志告警,用户或者管理员便可以对 IP 地址进行修改,从而解决通信问题。例如,下面的 PC2 和 PC3,只要一方修改了地址即可 =>

三、免费 ARP 实战指南
免费 ARP 出现的场景非常多,例如地址冲突时、地址修改或变更时、DHCP 分发地址时、网关冗余协议交互时(例如 HSRP)、TFTP 传输数据时……
不同的场景,抓到的免费 ARP 数据包,底层结构都会有所差异,可能是基于 ARP 请求广播发送的,也可能是基于 ARP 回应广播发送的(没看错!ARP 回应这里是广播方式)
为了让大家 “亲眼所见”,同时可跟着我一起实践,更好吸收这块的知识,这里我设计了真实和虚拟网络来进行实战,并抓取免费 ARP 数据包,通过数据包解构原理。
(一)真实网络下 免费 ARP 实战
① 跟上一篇文章中代理 ARP 的真实网络一样,我的网络拓扑是这样的:

为了让这个实验更有通用性,我加入了一台 Windows 电脑。此时登录无线路由器(极路由)查看局域网主机列表:

还是原来的配方… 苹果全家桶和一台 Windows 电脑。实物图大概是这样的:

② 接下来,为了看到地址冲突时,免费 ARP 的数据包交互,我们在 Windows 和 MacOS 同时开启 Wireshark 并抓包本机电脑的数据包,设置 arp 过滤。
macbook 端截图如下:

Windows 端截图如下:**(Windows 10 跟无线路由器一直在交互)

③ 在 Mac 端,将 IP 地址设置为跟 Windows 地址一样,从 192.168.199.177 改为 192.168.199.152


点击应用之后,开始观察两边电脑弹框和 wireshark 的 ARP 包交互过程 =>

上图可以看到 macbook 的弹框告警了,接下来我们来分析下此时 Mac 和 windows 抓到的数据交互过程 =>


我的 windows 电脑很明确的回应 Mac 电脑:这个地址 199.152,已经被我用了。这个过程重复了 3 次。根据抓包,这个过程后面还在不断的持续中,不管在 win 还是 mac,都能抓到类似的问答过程。

由于 macbook 电脑此刻不能上网,所以还 “不屈不挠” 的询问着,它在想:没准 windows 下线了,没有回应了呢?(如果 win 没有回应,则说明它下线了或改为其他地址了,那么 mac 就可以使用)

④ 接下来,我们将 windows 的网络断开,然后在 macbook 这端观察 arp 交互和网络连接状态:

此时,macbook 跟往常一样发生三个 arp 请求,询问 152 这个地址是否有人使用,由于 windows 已经下线,所以三次都没有应答。紧接着有三个 gratuitous arp 数据包,跟上面三个请求包几乎是一样的,只有一个区别,就是发送者的 IP 地址此时从 0.0.0.0 修改为 192.168.199.152。这意味着mac 确认了 152 没有其他人使用,并且认为此刻自己有资格用上 152 这个地址了。
从 wireshark 抓包来看,之前的 arp 请求好像没有标记 “gratuitous” 这个关键词,那么算不是是免费 arp 或者无故 arp 呢?这个其实也是比较多讨论和争议。如果从 "自己问自己的角度" 出发,这两种 arp 都算是免费 arp,因为都是在问自己配置的这个新地址 192.168.199.152,而且目的都是一致的,都是为了检测是否地址可用是否存在冲突。
当然,更严谨的的免费 arp 包,则是需要 “发送方 ip” 和 “接收者 ip” 是一致的,就是下面这种 arp 请求包,都有 192.168.199.152 这个地址。所以,这一小知识点的话,我个人觉得不用太纠结,通过数据包结构还原整个免费 arp 工作原理才是最重要的。
从 wireshark 截图可以看到,经过了上面这些免费 ARP 的请求之后,由于一直没有其他设备回应 152 这个地址,所以 macbook 电脑再次询问网关 192.168.199.1 的物理地址,拿到网关的 ARP 回应之后,我的 macbook 便可以正常通信了。

⑤【接下来是拓展内容,涉及 dhcp 协议,新手的话可暂时忽略这一小段…】
这个实验还可以继续深挖下来,此时让 windows 电脑重新接入这个 wifi 网络,之后同样会出现免费 arp 的交互过程,只不过多了一个 dhcp 协议交互,并且最终 windows 使用了 192.168.199.153 这个地址接入 wifi 网络。先整理下流程再截核心数据包 =>
-
当 windows 重新接入网络之后,会通过 dhcp 重新获取 192.168.199.152 这个地址(由于 macbook 的 152 这个地址是由我手工静态指定的而不是路由器分配,所有路由器仍然通过 dhcp 地址池分配);
-
windows 收到这个地址之后,第一时间便发送免费 arp 包进行地址检测,但是发现这个地址已经被 macbook 占用了!因此,通过 dhcp decline 数据包向无线路由器取消这个地址;
-
windows 重新获取 192.168.199.153 这个地址,通过免费 arp 重新检测,发现没有人回应了,说明这个地址可用,后续用这个地址接入 wifi 网络。
windows 重新接入网络的 dhcp 交互包 =>

windows 获取地址后通过免费 arp 检测到 macbook=>

windows 通过 dhcp decline 放弃 152,并重新获取 153 这个地址 =>

windows 通过免费 arp 检测,发现 153 地址没其他人用,所以接入了网络 =>

总结:通过这个真实网络,我们构造了 windows 和 macbook 地址冲突的环境,通过 wireshark 抓取免费 arp 数据包,学习了免费 arp 的地址检测功能以及数据包结构。
① 当电脑(手工)修改的地址跟局域网其他主机地址一样的时候,通过免费 arp 协议,电脑会弹框提醒并无法上网;
② 当相同地址的电脑其中一台下线时,通过免费 arp 可以证明此地址可使用(没人争抢 / 回应),此时便可接入网络;
③ 当电脑通过 DHCP 获取地址时,会通过免费 arp 检测这个地址是否可用,若已经被使用,则重新通过 dhcp 获取新的地址,再接入互联网。
④ 这里抓取的免费 ARP 包是请求广播包,并且特征是 “自己问自己”。**(“自己答自己” 的回应广播包,在下面的实验有)
(二)虚拟网络下 免费 ARP 实战
网络拓扑采用 GNS3 搭建,采用 C3640 操作系统镜像 =>

① 为每个路由器配置 IP 地址,所在网段为 192.168.1.0/24=>
R1 (config)#int f0/0
R1 (config-if)#no sh
R1 (config-if)#**ip add 192.168.1.1 255.255.255.0
R2 (config)#int f0/0
R2 (config-if)#no sh
R2 (config-if)#**ip add 192.168.1.2 255.255.255.0
R3 (config)#int f0/0
R3 (config-if)#no sh
R3 (config-if)#**ip add 192.168.1.3 255.255.255.0
② 在路由器相连链路上抓包,路由器相互 PING 通,并查看 ARP 表 =>
(这里用 R1 举例,其他类似)
R1#ping 192.168.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 64/64/64 ms
R1#ping 192.168.1.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 64/64/68 ms
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 0 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0
③ 让 R3 和 R2 的地址冲突,例如将 R3 的地址从 192.168.1.3 配置为 192.168.1.2,在 R2 和 R3 上面开启 arp 调试 “debug arp”,在 R1 上面查看 ARP 表,通过 wireshark 观察底层免费 ARP 包交互过程 =>
R3 (config)#int f0/0
R3 (config-if)#**ip add 192.168.1.2 255.255.255.0
一旦 R3 设置了上面的地址,跟 R2 冲突之后,此时 R2 和 R3 的命令行界面开始不停断 “刷屏”=>

核心日志信息:
R2#
*Mar 1 00:13:25.519: % IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
R2#
*Mar 1 00:13:56.259: % IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
R2#
*Mar 1 00:14:27.167: % IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
虽然网络设备没法像 Windows 或者 Macos 弹框告警,但是通过日志提示同样可以达到同样的目的,让网络运维人员作出修改。
Cisco IOS 通过免费 ARP 检测到地址冲突之后,解决的方法相对 “暴力”,例如,R2 和 R3 直接会持续发送免费 ARP(reply 广播包),直到地址冲突问题被解决掉。可以通过 wireshark 数据包观察 =>

此时再观察 R1 上面的 ARP 表,关于 192.168.1.2 这个地址的映射信息:
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc02.394f.0000 ARPA FastEthernet0/0
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc02.394f.0000 ARPA FastEthernet0/0
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0
……
可以看到,由于免费 ARP 是一种广播的形式 ,所以 R1 同处一个局域网可以收到,并且 ARP 信息被不断修改,一会将 192.168.1.2 指向 R2 的 MAC 地址,一会指向 R3 的 MAC 地址。
这个过程会一种持续下去,直到地址做了修改,这里我们将 R3 的 IP 地址重新修改为 192.168.1.3,之后网络便恢复了平静。
总结:通过这个虚拟网络,我们构造了路由器地址冲突的环境,同样验证了免费 ARP 能够检测 IP 地址冲突的功能,当然,这里跟 Windows 和 Macos 的处理方式有一些差别,例如 Cisco 路由器检测到免费 ARP 之后,会保持非常高频率的 “互怼” 过程,然后不断报出错日志,督促管理员感觉修改地址。除此之外,数据包结构也有差异,Windows 和 Macos 是 “自己问自己” 的 arp request 包,而 cisco ios 是 “自己答自己” 的 arp reply 包。
四、总结:地址冲突了怎么办?
① 对于普通用户而言,当看到电脑弹框告警说明地址有冲突时,在不懂技术的情况下,可以尝试重启家里的路由器,这样可以重新为局域网的电脑分配地址;
② 路由器不是自己的,接入的是租房网络、校园网络等第三方网络,当看到电脑弹框告警说明地址有冲突时并且无法管理路由器的时候,可以尝试手工修改本机电脑的 IP 地址,无论是 Windows 还是 Macos,直接进入网卡设置修改即可,怎么做手工修改呢?例如电脑地址是 192.168.1.1,提示冲突的话,那么可以在原有数字的基础上递增 1 或者 10,直到显示不冲突,例如修改为 192.168.1.2、192.168.1.3 或者 192.168.1.11、192.168.1.21,以此类推… (这种方法未必能保证解决,但是在管理员介入之前,至少算是一种解决方案);
③ 对于专业的网络和安全运维人员而言,当看到网络地址冲突,则需要考虑自己的 DHCP 部署、IP 地址规划有没有问题,或者找出网络中是否有 “捣蛋鬼” 自己私设 IP 之类的;
④通过本章节的学习,我们掌握了免费 ARP 不同网络环境下的实现,例如 “自己问自己” 和 “自己答自己” 两种广播包方式,也了解了电脑和网络设备的不同机制。
图解 ARP 协议(六)RARP 与 IARP:被遗忘的兄弟协议
原创 陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 05 日 17:11
一、概述

在我第一次接触 ARP 协议的时候,发现这协议挺简单的,“一去一回 通过 IP 拿到 MAC 地址”,整个过程在 1s 内就搞定了。后面学到了代理 ARP,发现也不过是变了个法子,做了次 “欺骗”,本质还是一样。接下来又学到了免费 ARP,顿时觉得网络协议设计者太牛了,一个协议居然能折腾出这么多玩法,连 “地址检测” 都能实现。等学到了 ARP 嗅探和欺骗,又发现其实黑帽子更爱折腾,谁能想到这么简单的协议,居然能制造工具出来做内网探测和欺骗攻击,引发这么大的危害。
当我以为 ARP 这一知识点在我的技术旅途中应该就此翻篇了的时候,又冒出了RARP 和 IARP这两,对比其他 ARP 协议的研究,当时学这两个协议是心不甘情不愿的:
第一,无论学习还是工作,极少碰到,真正 “翻篇” 了的协议;
第二,名字记不住,“翻转”" 反转 ““逆向”” 反向 ",不同技术文档的中文翻译有时候完全相反,没法记。毕竟汉语这么博大精深,就记住英文就好了,后面发现更加糟糕,因为 reverse 和 inverse 这两个单词仅仅 2 个字母之差,老外太欺负人了,这根本没法记。
我在想,肯定也有很多朋友学到这个时候遇到了上面同样的问题和纠结,有些坚持研究通透有些中途离开。然后我又思考了一番:ARP 协议通过几个字段的细微调整,便能够适用于这么多不同场景,例如 ARP、PARP、GARP、RARP、IARP,这是不是证明了它在 TCP/IP 协议栈里面独特的位置,有哪个协议能做到这一点,有这么多花样? 所以,我的建议是:既然到了这一步了,就继续搞清楚吧,否管它是否用的上。
那么,什么是 RARP 和 IARP?中文叫法是什么?它们各自的应用场景在哪里?数据包又是怎样的?
二、RARP 原理与实践
RARP(Reverse ARP)即反向 ARP 或者翻转 ARP,顾名思义,它跟常规的 ARP 功能恰恰是相反的,ARP 是实现 IP 到 MAC 地址的映射,而 RARP 是实现 MAC 到 IP 地址的映射。
什么样的设备或者场景需要用到 RARP 呢?其实 RARP 原先在设计的时候,是适用于大部分终端设备的,不仅仅是无盘工作站,它的功能就是根据 MAC 获取 IP 地址,功能跟 DHCP 是一样的。
例如,一个电脑刚接入网络,没有 IP 地址就无法上网,此时它便会通过本地 MAC 地址,对外发送 RARP Request 广播请求,看看局域网里面是否有 RARP Server,若 Server 上面有关于此 MAC 地址的映射 IP,则会向此电脑返回 RARP Reply 回应,电脑便获取了 IP 地址 =>

RARP 通过非常精简的交互实现了 IP 地址的获取,但同时也暴露了一些问题:
① RARP Server 必须提前将 MAC 和 IP 的映射静态绑定在本地;若没有提前绑定,则电脑用自己 MAC 询问时,Server 也不会回应;
② RARP Server 只能给电脑分配 IP 地址,不包括其他信息,包括网关、DNS 等信息;
③ RARP 基于二层封装,只能运行在同一网段;每个网段分配地址,都需要一个 RARP Server。
在 RARP 的基础上,后面又有了 Bootp 协议,直译过来便是 “启动协议”,功能同 RARP,也是用于电脑接入网络时,用来获取 IP 地址的。但是毕竟做了增强,Bootp 协议能让电脑启动时,不仅仅获取 IP 地址,而且能获取到网关地址,从而让电脑实现跨网段通信。

Bootp 协议虽然让电脑能够获取到更多的信息,但是仍然没有解决最大的问题:
服务器仍然需要提前手工绑定 MAC 和 IP 地址,而对于现在的移动网络或者公共网络而言,这根本无法实现。
因为用户什么时候接入,接入的 MAC 是多少,管理员没法提前知道。这就有了后面的 DHCP,DHCP 通过动态分配的方式解决了这个诟病,并且通过 DHCP 中继技术实现了跨网段地址分配,实现了全网 IP 地址的统一管理。
小结:RARP 是一种逝去的地址分配技术,是 Bootp 和 DHCP 的鼻祖,目前我们的电脑基本不会用到这个协议,只有部分无盘工作站等情况需要用到。
为了让大家更深入理解 RARP,这里我们从数据包结构来解构它的功能。RARP 的数据包比较难抓取,不像常规的 ARP 和 DHCP 协议,这里给大家提供一个思路:对于比较难找的协议数据包,除了搭建特殊的实验环境抓取之外,也可以借助一些 [数据包生成工具] 来实现,例如 nmap 扫描器里面集成的nping 工具,可以生成非常多的协议包,包括 arp、icmp、udp、tcp 等等。
nmap 的安装以及 nping 的使用,可以到 https://nmap.org/nping 下查询。这里给大家演示如何用 nping 生成 rarp 数据包,下图是我们要 “人为” 构造 出来的交互场景 =>

我的 Macbook 已经安装了 nmap,自带了 nping 工具,跟 ARP/RARP 相关的帮助命令如下:
jayking:~ jaykingchen$**nping
Nping 0.7.60 ( https://nmap.org/nping )
Usage:**nping [Probe mode] [Options] {target specification}
TARGET SPECIFICATION:
Targets may be specified as hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.*.1-24
ARP/RARP PROBE MODE:
--arp-type <type> : Type: ARP, ARP-reply, RARP, RARP-reply.
--arp-sender-mac <mac> : Set sender MAC address.
--arp-sender-ip <addr> : Set sender IP address.
--arp-target-mac <mac> : Set target MAC address.
--arp-target-ip <addr> : Set target IP address.
为了能够抓取到 rarp 的请求和回复包,首先打开 wireshark 抓取电脑网卡流量并设置 arp 过滤,然后采用两条命令:第一条命令模拟我的电脑发起的 RARP 请求包,第二条命令模拟局域网网关设备(极路由)返回的 RARP 回复包。
jayking:~ jaykingchen$ sudo**nping --arp-type RARP --arp-sender-mac ac:bc:32:8b:56:df --arp-sender-ip 0.0.0.0 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 0.0.0.0 192.168.199.255
Starting Nping 0.7.60 ( https://nmap.org/nping ) at 2017-09-04 23:57 CST
SENT (0.0077s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (1.0079s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (2.0084s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (3.0111s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (4.0159s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)
Nping done: 1 IP address pinged in 5.02 seconds
jayking:~ jaykingchen$ sudo**nping --arp-type RARP-reply --arp-sender-mac d4:ee:07:54:c1:9e --arp-sender-ip 192.168.199.1 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 192.168.199.153 192.168.199.153
Starting Nping 0.7.60 ( https://nmap.org/nping ) at 2017-09-05 00:03 CST
SENT (0.8094s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (1.8107s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (2.8114s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (3.8138s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (4.8159s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)
Nping done: 1 IP address pinged in 5.82 seconds
此时,从 Wireshark 抓取到的 RARP 请求和回复包如下 =>


至此,关于 RARP 的原理和数据包分析便完成了。
三、IARP 原理与实践
IARP(Inverse ARP)即逆向 ARP,这个没法 “顾名思义”,因为它既不是 IP 到 MAC 的映射,也不是 MAC 到 IP 的映射,而是DLCI 到 IP 的映射。相比前面所有其他 ARP 协议,IARP 的应用场景不是在以太网(局域网)里面,而是在帧中继网络(广域网) 里面。

要真正理解 DLCI 和 IARP,需要有一些帧中继网络技术背景,这里简单说下:
DLCI(Data Link Connection Identifier)数据链接连接标识,是帧中继网络里面的二层地址,好比以太网里面的 MAC 地址,用于标记帧中继网络里面的虚拟专线。示图如下:

图中 R1 和 R2 通过专线连接到帧中继交换机,对应的 DLCI 号分别是 102 和 201。交换机通过转发表进行数据交换:根据接口收到数据包的 DLCI,查看对应的接口,转发到匹配的线路。
所以说,帧中继网络里面,DLCI 类似 MAC,决定了数据包的去向。那么,DLCI 和 IP 的映射关系又是如何的呢?我们来看下帧中继网络里面的数据封装,以 R1 ping R2 为例:

从这里我们可以看到帧中继网络的数据封装和转发模式都不同于以太网:
① 二层封装的时候,不需要源目地址,只需要本地 DLCI;例如 10.1.1.1 ping 10.1.1.2,源目 IP 地址这个跟以太网的封装是一样的,但是链路层封装不需要目标 DLCI 201。
② 交换机会改变二层地址信息,例如这里的 DLCI 从左边的 102,变成了右边的 201。
理解了这些差异,我们才能得到这里 DLCI 和 IP 的映射关系:即目标 IP 地址与本地 DLCI 的映射。例如 R1 要访问 10.1.1.2,此时需要映射到本地的 102;而 R2 要访问 10.1.1.1,则需要映射到本地的 201。
更完整的说明:逆向 ARP 解决帧中继网络里目标 IP 地址与本地 DLCI 的映射,并且让通信双方生成帧中继映射表(frame-relay map)。好比 ARP 解决了以太网里面目的 IP 与目标 MAC 的映射,并且让通信方生成 ARP 映射表。

接下来,我们通过实验环境来验证,这里可以通过 GNS3 模拟器搭建以上环境,并且抓包验证 =>

①为 R1 和 R2 打开接口,封装帧中继,并配置 IP 地址:
R1 (config)#int s0/0
R1 (config-if)#no shutdown
R1 (config-if)#**encapsulation frame-relay
R1 (config-if)#ip address 10.1.1.1 255.255.255.0
R2 (config)#int s0/0
R2 (config-if)#no shutdown
R2 (config-if)#encapsulation frame-relay
R2 (config-if)#ip address 10.1.1.2 255.255.255.0
② 开启 wireshark 抓包,抓取 IARP 请求和回复包:


③ 查看 R1 和 R2 本地生成的 IARP 映射表:
R1#**show frame-relay map
Serial0/0 (up):**ip 10.1.1.2 dlci 102 (0x66,0x1860)**, dynamic,
broadcast,, status defined, active
R2#**show frame-relay map
Serial0/0 (up):**ip 10.1.1.1 dlci 201 (0xC9,0x3090),**dynamic,broadcast,, status defined, active
④ 测试 R1 和 R2 之间的联通并抓取 ICMP 包:
R1#ping 10.1.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 68/75/88 ms

至此,IARP 的原理与实践并完成了。那么,既然 IARP 能够实现帧中继的通信,为什么在文章开头,我们提到说 IARP 跟 RARP 一样,在工作中已经不常见了呢?
① 帧中继作为一种广域网远程连接技术,正在慢慢被其他技术代替;
② IARP 不像 ARP 协议可以实时交互,它是周期性运行的,通信双方若丢失 IARP 映射表,则需要等待到固定的时间交互才能重新生成并通信。另外不同厂商不同型号对 IARP 的兼容性也可能不同。基于这些原因,一般建议直接关闭 IARP 协议,采用静态绑定的方式生成映射表,这里不再深入。(有兴趣的小伙伴可以观看我之前的技术视频教程,有深入讲解了如何关闭 IARP 和静态绑定的做法。)
四、RARP 与 IARP 协议总结
① RARP 用于实现 MAC 到 IP 的映射,本质就是为了获取 IP 地址,是 Bootp 和 DHCP 协议的鼻祖;
② IARP 用于实现帧中继网络中 DLCI 到 IP 地址的映射,生成帧中继映射表(类似 ARP 表),实现数据封装与通信;
③ 相比 ARP、免费 ARP、代理 ARP、ARP 攻防等技术,RARP 和 IARP 随着技术的更新迭代正在退出历史舞台,成为**“被遗忘的兄弟协议”**。(对于初学者来说,也算是个好事,因为终于不用 “翻转”" 反向 "“逆向” 各种分不清了)
ARP 协议大总结
到这里,我们通过六篇文章终于搞定了 ARP 协议的方方面面,包括它们的应用场景、设计思想、数据包结构、实验验证等等。
另外,为什么这次图解系列的开头是从 ARP 协议开始写,而不是从 Ethernet、IP、TCP、HTTP 或其他呢?
主要是因为 “ARP 太简单了”,简单到大家在学网络和安全的时候,都容易去忽略协议背后的很多细节,例如很多人认为 [ARP 的请求就一定是广播的,回复就一定是单播的],但 “常识” 背后也有另外一些特殊的情况。所以,通过这一个足够简单的协议,为大家解构背后相对复杂的机制,为后续深入研究开个好头。
另外一个原因就是 “ARP 很有趣”,例如协议设计者通过不同的操作代码 (opcode),做了非常多的变种(arp 是 1 和 2,rarp 是 3 和 4,iarp 是 8 和 9),做一个模型便可以多处应用;而且通过精巧的构造,就可以在内网造成极大的杀伤力。
via:
-
图解 ARP 协议(一)陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 25 日 07:07
https://mp.weixin.qq.com/s/njogTKMwLurT5UBjW1f4xA -
图解 ARP 协议(二)ARP 攻击篇 陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 27 日 10:00
https://mp.weixin.qq.com/s/niDCGUJeBA2H_D7fiuhTPg -
图解 ARP 协议(三)ARP 防御篇:如何揪出 “内鬼” 并 “优雅的还手”?陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 29 日 06:10
https://mp.weixin.qq.com/s/EcimmL--wYGse4wuGvMjkA -
图解 ARP 协议(四)代理 ARP:善意的欺骗 陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 30 日 23:59
https://mp.weixin.qq.com/s/62XPaBvI7Ah7UYITtOCCdg -
图解 ARP 协议(五)免费 ARP:地址冲突了肿么办?陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 03 日 10:30
https://mp.weixin.qq.com/s/4REsTEbVeOH3y9UVaK-uxQ -
图解 ARP 协议(六)RARP 与 IARP:被遗忘的兄弟协议 原创 陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 05 日 17:11
https://mp.weixin.qq.com/s/sHs96aPkokXzKeEC20DM3Q
304

被折叠的 条评论
为什么被折叠?



