ARP 协议与 ARP 欺骗
基于 HTTP 现代标准 · 核于 2026-06
速查
- ARP(Address Resolution Protocol,地址解析协议):在同一网段内把已知的 IP 地址解析为 MAC 地址,由 RFC 826 定义;IPv6 下由 NDP(邻居发现协议) 接替。
- 为什么需要:数据要封装成以太网帧才能在局域网发出,帧头必须填目的 MAC;但上层只交给我们一个目的 IP——ARP 就是补上「IP → MAC」这最后一步的桥梁。
- 工作两步:广播 ARP Request「谁是 1.1.1.1?告诉我你的 MAC」(目的 MAC 填全
ff:ff:ff:ff:ff:ff)→ 目标主机单播 ARP Reply 回自己的 MAC。 - ARP 缓存:每台主机维护一张 IP↔MAC 映射表,命中则不再广播;表项有老化时间(aging),到期删除以适应设备/地址变化(
arp -a可查看)。 - 层级定位:ARP 横跨链路层与网络层之间(常称「2.5 层」)——它服务于二层封装,却要查三层 IP,RFC 826 把它归在链路层。
- 跨网段:目的 IP 不在本网段时,主机不为对方 IP 做 ARP,而是解析默认网关的 MAC,把帧交给网关接力转发(详见 路由原理与路由器/网关)。
- 致命弱点:ARP 无任何认证、且无状态——主机会无条件接受收到的 ARP 应答并刷新缓存,哪怕自己从没问过。
- ARP 欺骗 / 投毒(ARP spoofing / poisoning):攻击者发伪造应答,把自己的 MAC 绑到网关(或受害者)的 IP 上,污染受害者缓存,使本该发往网关的流量转投攻击者。
- 危害:中间人攻击(MITM)、会话劫持、流量嗅探 / 篡改,或直接丢弃造成断网(DoS);前提是攻击者已接入同一广播域。
- 防护:关键映射用静态 ARP、交换机动态 ARP 检测(DAI)+ DHCP Snooping、
arpwatch监测异常;应用层用 HTTPS / SSH / VPN 加密,即便被嗅探也读不到明文。 - 边界:MAC 地址的格式/分配见 数据链路层与 MAC 寻址;ARP 解析「IP→MAC」是同层内的事,勿与 DNS(域名→IP,应用层)混淆。
为什么需要 ARP:帧要发出去,必须知道目的 MAC
局域网里数据的真正载体是以太网帧,而帧头里有一个绕不开的字段——目的 MAC 地址(帧结构详见 以太网帧结构)。可是当应用要访问 192.168.1.20 时,它交给下层的只有一个目的 IP:
应用层:我要访问 192.168.1.20 (只有 IP)
│
网络层:好,封装 IP 包,源/目的 IP 都填好 (仍只有 IP)
│
链路层:要发帧了……目的 MAC 填什么?? (缺一个 MAC!)这就是 ARP 存在的全部理由:在同一网段内,把一个已知的 IP 地址解析成对应的 MAC 地址,好让链路层把帧的目的地址填完整、发出去。用一句话概括 ARP 的职责——「发现与某个网络层地址(通常是 IPv4 地址)相关联的链路层地址(即 MAC 地址)」。
一句话类比
你知道同事的工位编号(IP),却要把文件实际送到他手上(MAC)。于是你在办公室喊一嗓子(广播):「3 号工位是哪位?」——本人应一声并报上姓名(应答),你就知道该把文件递给谁了。
ARP 工作流程:一问一答
ARP 的核心是一次广播提问 + 单播回答。假设主机 A(192.168.1.10)要给同网段的主机 B(192.168.1.20)发数据,而缓存里没有 B 的 MAC:
① ARP Request(广播,目的 MAC = ff:ff:ff:ff:ff:ff,全网段都收到)
A ──▶ ┌──────────────────────────────────────────┐
│ 「谁是 192.168.1.20?请把你的 MAC 告诉 A」 │ ──▶ 网段内所有主机
└──────────────────────────────────────────┘
(非 192.168.1.20 的主机:不是问我 → 丢弃)
② ARP Reply(单播,只回给 A)
B ──▶ 「192.168.1.20 在我这,我的 MAC 是 bb:bb:bb:bb:bb:bb」 ──▶ A
③ A 把「192.168.1.20 ↔ bb:bb:bb:bb:bb:bb」写入 ARP 缓存,之后直接封帧发送要点:
- 请求广播、应答单播——请求面向全网段(只有目标会理会),应答则点对点回给提问者。
- 双向缓存:A 收到 B 的应答后缓存 B;与此同时 B 也从请求里得知了 A 的 IP/MAC,顺手缓存 A——一次握手,双方都更新。
- 报文很小:IPv4 over 以太网的 ARP 报文仅 28 字节,承载在以太网帧里,EtherType =
0x0806标识这是 ARP。
ARP 报文关键字段
| 字段 | 含义 | IPv4/以太网典型值 |
|---|---|---|
| HTYPE(硬件类型) | 链路层类型 | 1 = 以太网 |
| PTYPE(协议类型) | 上层协议类型 | 0x0800 = IPv4 |
| HLEN / PLEN | 硬件 / 协议地址长度 | 6(MAC)/ 4(IPv4) |
| OPER(操作码) | 请求还是应答 | 1 = Request,2 = Reply |
| SHA / SPA | 发送方 MAC / IP | 填写者自己的地址 |
| THA / TPA | 目标 MAC / IP | 请求时 THA 未知(填 0),TPA 为待解析 IP |
免费 ARP(Gratuitous ARP)
主机有时会主动广播一条关于自己 IP 的 ARP(无人问也发),用途有二:① 检测 IP 冲突(开机时问「谁在用我这个 IP」);② 通告更新(MAC 变了或主备切换时,让全网段刷新对自己的缓存)。它既可用 Request 也可用 Reply 格式,RFC 倾向用 Request 形式。这一机制后面会看到,也正是攻击者伪造应答的温床。
ARP 缓存与老化
每次都广播太浪费,所以主机把解析结果存进 ARP 缓存(ARP cache)——一张 IP↔MAC 映射表。发包前先查表:命中直接用,未命中才发起 ARP。
# 查看本机 ARP 缓存
arp -a
# 例:? (192.168.1.1) at aa:bb:cc:dd:ee:ff [ether] on en0 ← 网关的映射表项不会永久驻留,而是带老化时间(aging time):长时间未使用即被删除,下次用到再重新解析。这样做是为了适应现实变化——设备可能更换网卡、IP 可能被重新分配、主机可能下线。老化机制是把双刃剑:它让网络能自愈,但也意味着伪造的映射只要持续刷新就能「赖着不走」(见下文欺骗防护)。
ARP 的层级定位
ARP 处在一个微妙的位置:它横跨链路层与网络层之间,因此常被戏称为「2.5 层」协议。
- 它为二层服务:最终产物是一个 MAC 地址,用于填写以太网帧头。
- 它又要看三层:输入是一个 IP 地址,本质是在两层地址之间做翻译。
- RFC 826 的官方归类把 ARP 放在链路层,视其为「向更高层(网络层)询问」的工具。
别和 DNS 混为一谈
两者都「解析」,但完全不在一层、解决不同问题:DNS 把域名 → IP(应用层,跨广域网,详见 DNS 作用与域名层级体系);ARP 把IP → MAC(链路层,仅限本网段)。一次访问 example.com 通常先 DNS 拿到 IP,再 ARP 拿到下一跳 MAC,二者接力而非替代。
跨网段:解析的是网关的 MAC
如果目的 IP 不在本网段(比如要访问公网 203.0.113.5),主机不会也无法为这个远端 IP 做 ARP——广播出不了本地网段,远端主机根本收不到。此时主机改为:
- 查路由表,发现目的不在本网段 → 交给默认网关。
- 对网关的 IP(如
192.168.1.1)做 ARP,拿到网关的 MAC。 - 封帧时:目的 IP 仍是
203.0.113.5(不变),但目的 MAC 填网关的 MAC——帧先送到网关,由网关接力转发。
帧头目的 MAC = 网关 MAC ← 二层下一跳(每过一跳就改写)
IP 头目的 IP = 203.0.113.5 ← 三层最终目的(端到端不变)这正体现了「IP 管端到端、MAC 管逐跳」的分工:数据在每一跳都靠 ARP 找到下一跳的 MAC,而最终 IP 始终指向真正的终点。
ARP 欺骗 / 投毒:伪造应答冒充网关
ARP 的设计有个致命前提缺陷:它没有任何认证机制,而且是无状态的——主机会无条件接受收到的 ARP 应答并据此刷新缓存,根本不验证自己是否发过对应的请求。攻击者正是利用这一点。
ARP 欺骗(ARP spoofing,又称 ARP 缓存投毒 ARP cache poisoning) 的定义:「攻击者向局域网发送伪造的 ARP 报文,目的是把自己的 MAC 地址与另一台主机(如默认网关)的 IP 地址关联起来,使本应发往那个 IP 的流量转而发给攻击者。」
正常:受害者 ──流量去网关──▶ 网关(192.168.1.1, MAC=GW) ──▶ 互联网
攻击者持续广播伪造应答:「192.168.1.1 的 MAC 是 ATTACKER」
「192.168.1.10 的 MAC 是 ATTACKER」(同时骗网关)
↓ 受害者与网关的 ARP 缓存双双被污染
中间人:受害者 ──▶ 攻击者(冒充网关) ──▶ 真网关 ──▶ 互联网
◀── ◀── 转发回来 ◀──
(攻击者夹在中间,可嗅探/篡改/丢弃,受害者却毫无察觉)前提与危害:
- 前提:攻击者必须已接入被攻击的本地网段(同一广播域)——ARP 欺骗是局域网内的攻击,不能跨网段远程发起。
- 中间人攻击(MITM):同时毒化受害者和网关,双向流量都过攻击者,可嗅探明文、篡改内容、做会话劫持。
- 拒绝服务(DoS):把目标 IP 映射到一个不存在的 MAC,或单纯丢弃流量,使受害者断网。
为什么如此奏效
攻击者无需「攻破」任何设备——只要比真实主机更频繁地广播伪造应答,靠不断刷新就能让受害者缓存长期停留在错误映射上(缓存老化反而帮了攻击者:老化后正好被下一条伪造应答补上)。这是协议层面的信任缺陷,而非某个实现的 bug。
防护措施
ARP 欺骗无法靠「打补丁」根除(缺陷在协议本身),只能多层加固:
| 手段 | 所在层 | 原理 | 代价 / 局限 |
|---|---|---|---|
| 静态 ARP(Static ARP) | 主机 | 对网关等关键映射写只读静态表项,拒绝被动态应答覆盖 | 手工维护,设备一多难以管理 |
| 动态 ARP 检测 DAI | 交换机 | 结合 DHCP Snooping 绑定表,校验每条 ARP 的「IP-MAC-端口」是否合法,非法即丢弃 | 需支持该特性的交换机 + 正确配置可信端口 |
| arpwatch 类监测 | 网管 | 持续监控 IP↔MAC 映射,一旦变化就告警(Syslog / 邮件) | 只能发现、不能阻断,需人工响应 |
| 端口安全 / OS 加固 | 交换机 / 主机 | 限制每端口 MAC 数;部分系统忽略未经请求的应答 | 覆盖面有限 |
| 加密(HTTPS/SSH/VPN) | 应用 / 网络层 | 不阻止嗅探,但让中间人拿到的全是密文,读不懂也改不了(会触发证书告警) | 不能防 DoS 型断网 |
实战首选组合
企业内网最有效的是交换机侧 DAI + DHCP Snooping:交换机把从 DHCP 学到的「IP-MAC-端口」绑定关系建成可信表,对每个非可信端口进来的 ARP 逐条比对,伪造应答在二层就被丢弃,从源头掐断投毒。终端侧再辅以对网关的静态 ARP双保险。
小结
本页讲透了局域网里「把 IP 翻译成 MAC」的关键协议 ARP 及其安全风险:
- ARP 解决的核心问题:帧必须填目的 MAC,但上层只给 IP——ARP 在同一网段内做「IP → MAC」解析,补上链路层封装的最后一块拼图(IPv6 由 NDP 接替)。
- 一问一答:广播 Request「谁是某 IP」→ 目标单播 Reply 回 MAC(OPER
1/2,EtherType0x0806,28 字节);结果存入带老化时间的 ARP 缓存,一次握手双方互相缓存。 - 层级与跨网段:ARP 横跨链路层/网络层(「2.5 层」);目的不在本网段时解析的是网关 MAC,体现「IP 管端到端、MAC 管逐跳」。
- ARP 欺骗:协议无认证 + 无状态,主机无条件信任应答;攻击者伪造应答把自己 MAC 绑到网关 IP,污染缓存做中间人 / 嗅探 / 篡改 / 断网,前提是已在同一广播域。
- 防护多层并举:静态 ARP、交换机 DAI + DHCP Snooping、
arpwatch监测、应用层 HTTPS/SSH/VPN 加密——首选「DAI + DHCP Snooping」从二层掐断投毒。
上一页梳理了局域网的逻辑隔离手段 VLAN 与局域网隔离(同一 VLAN 才共享广播域,也才可能互相 ARP 欺骗);下一页走进无线场景,看共享介质如何接入与加密 Wi-Fi/802.11 无线局域网。