MAC 地址与 ARP
MAC 地址与 ARP
一个问题:IP 和 MAC 都要,传哪个
网络课上老师会说:IP 地址是逻辑地址,可以变;MAC 地址是物理地址,不能变。听着挺有道理,但你有没有想过:为什么一个数据包需要两个地址?
设想一个真实场景:你的电脑 192.168.1.100 要给服务器 93.184.216.34 发一个 HTTP 请求。
如果只用 IP:路由器怎么把包从你的网卡送到下一个路由器?整个网络有几十亿台设备,路由器需要知道"93.184.216.34 在哪条物理线路上",这不可能靠 IP 算出来。
如果只用 MAC:每张网卡只有 48 位 MAC,全球几十亿设备没法划分网络。MAC 就像一个人的身份证号,没法告诉你"这个人在哪个城市"。
所以两个地址都需要。IP 负责"我送到哪个城市",MAC 负责"我交给哪个具体的人"。IP 是网络层逻辑寻址,MAC 是数据链路层物理寻址。
IP 和 MAC 的关系:靠 ARP 桥接
你的电脑知道目标 IP 是 93.184.216.34(从 DNS 查询拿到),但不知道目标的 MAC 地址(路由器才查 MAC 表)。怎么拿到目标的 MAC?问。
ARP(Address Resolution Protocol)就是"问 MAC 地址"的协议。你的电脑在局域网内广播:"93.184.216.34 的 MAC 是什么?知道的人请回我。"
广播的意思是:这个 ARP 请求包的目的 MAC 写成 FF:FF:FF:FF:FF:FF,交换机收到后会把包从所有端口发出去。局域网里每台机器都收到这个请求,看到包里的目标 IP 不是自己就丢弃,是自己就回一个 ARP 响应:"我是 93.184.216.34,我的 MAC 是 AA:BB:CC:DD:EE:FF"。
你的电脑收到响应,把 IP-MAC 映射存到本地 ARP 缓存里。这个缓存通常 15-20 分钟过期。过期后下次发包会重新问。
图注:ARP 请求以广播(目的 MAC
FF:FF:FF:FF:FF:FF)发送,局域网内所有设备都收到;只有 IP 匹配者回单播响应。
真实抓包:Wireshark 看 ARP
Wireshark 过滤器 arp,能看到所有 ARP 流量。典型的 ARP 请求包:
Address Resolution Protocol (request)
Hardware type: Ethernet (1)
Protocol type: IPv4 (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (1)
Sender MAC address: 11:22:33:44:55:66
Sender IP address: 192.168.1.100
Target MAC address: 00:00:00:00:00:00
Target IP address: 93.184.216.34注意请求包里 Target MAC 是 00:00:00:00:00:00,因为问的时候还不知道。响应包里 Sender 字段会被填上真实 MAC。
查看本机 ARP 缓存:
# Linux
ip neigh show
# 或
arp -a
# Windows
arp -a输出类似:
? (192.168.1.1) at aa:bb:cc:11:22:33 [ether] on eth0
? (192.168.1.50) at dd:ee:ff:44:55:66 [ether] on eth0显示 IP、对应 MAC、所在网卡。如果某条记录出现 (incomplete),表示 ARP 请求没收到响应,目标不可达。
ARP 缓存中毒:最经典的内网攻击
ARP 协议设计上有个致命缺陷:它信任任何 ARP 响应,不验证响应方身份。
攻击原理:黑客接入你的局域网(比如公司 Wi-Fi 没隔离访客),不停广播伪造的 ARP 响应:"192.168.1.1(网关)的 MAC 是 11:22:33:44:55:66(黑客机器的 MAC)"。你的电脑和同事的电脑信了,把发往网关的包都发给黑客。黑客转发给真网关,同时抓包看内容。
这就是 ARP Spoofing(ARP 欺骗)或 ARP Poisoning(ARP 中毒)。后果:
- 流量被监听(账号密码泄露)
- 流量被篡改(插入恶意代码、钓鱼链接)
- 拒绝服务(直接把包丢掉,所有人上不了网)
怎么防御:
- 静态 ARP 绑定:把网关 IP 和 MAC 写死在每台电脑的 ARP 表里。命令
arp -s 192.168.1.1 aa:bb:cc:11:22:33。黑客发了伪造 ARP 也写不进去。但维护成本高,加减设备要手动改。 - 交换机启用 DAI(Dynamic ARP Inspection):校验 ARP 包的合法性,丢弃伪造包。需要交换机支持。
- 网络分段:访客网络和办公网络隔离 VLAN,ARP 广播不互通。
- 加密通信:用 HTTPS、SSH、VPN。ARP 欺骗只能监听和篡改明文,加密流量黑客看不到也改不了。
跨网段时 ARP 不够用
ARP 只在同一个局域网内有效。不同网段之间(比如 192.168.1.0/24 和 192.168.2.0/24)通信时,源机器知道目标 IP 但不知道目标 MAC,更不知道目标在哪个物理网段。
这时 ARP 帮不了你,因为 ARP 只能问"这个 IP 在我这个局域网里是谁",不能跨网段。真正的目标 MAC 其实是网关的 MAC。
流程是这样的:
- 你的电脑 192.168.1.100 要发包给 8.8.8.8(Google DNS)
- 你的电脑发现 8.8.8.8 不在本地子网
- 把包发给网关 192.168.1.1
- 问 ARP:"192.168.1.1 的 MAC 是什么?"(这是 ARP 能问的)
- 拿到网关 MAC 后封装帧
- 网关收到帧,解封看到目的 IP 是 8.8.8.8
- 网关查自己的路由表,决定下一跳
- 重复这个过程直到到达 Google
这就是逐跳转发的精髓:每跳只看自己的 ARP 表和路由表,不知道完整路径。
免费 ARP:宣告"我来了"
有一种特殊 ARP 叫免费 ARP(Gratuitous ARP)——ARP 请求包里的 Sender IP 和 Target IP 都是自己的 IP。用途:告诉局域网"我的 IP 对应的 MAC 是这个,欢迎来 ping 我"。
场景 1:机器刚启动时,发一个免费 ARP,让大家更新 ARP 缓存,避免大家还在用旧的(错的)MAC。
场景 2:换了网卡或 IP 迁移时,发一个免费 ARP 通知大家更新。
场景 3:ARP 欺骗攻击时,攻击者也用免费 ARP 快速污染大量主机。
Wireshark 过滤 arp.isgratuitous == 1 能看到所有免费 ARP 包。
IPv6 不用 ARP
IPv6 时代淘汰了 ARP,用 NDP(Neighbor Discovery Protocol) 替代。NDP 基于 ICMPv6,工作在 IP 层之上,可以跨网段工作(用组播),还自带安全机制(可以认证)。
NDP 有 5 种 ICMPv6 消息:
- Router Solicitation (RS):主机问"有没有路由器"
- Router Advertisement (RA):路由器广播"我是路由器,我能转发"
- Neighbor Solicitation (NS):相当于 ARP 请求
- Neighbor Advertisement (NA):相当于 ARP 响应
- Redirect:路由器告诉主机"去 X 走另一条路"
IPv6 完整淘汰了 ARP,但很多 IPv4 网络还在用 ARP——主要是兼容老设备。
思考题
- ARP 缓存里有 192.168.1.1 的 MAC 记录,但你的电脑突然连不上网了。可能的原因有哪些?(提示:ARP 缓存过期或被污染、网关换了网卡、IP 冲突)
- 你在公司内网 ping 一个跨网段 IP,比如 10.0.2.50。Wireshark 抓包看 ARP 请求,目标 IP 是 10.0.2.50 还是网关 IP?(提示:跨网段通信逻辑)
- 同一台电脑装 Windows 和 Linux 双系统,每次切换 IP 不变但 MAC 会变(如果两个系统分配的虚拟 MAC 不同)。这会带来什么麻烦?(提示:ARP 缓存、DHCP 续约、交换机 MAC 表漂移)
- ARP 请求是广播,ARP 响应是单播。但如果对方 IP 不在本地子网,本机应该广播"我的网关 MAC 是什么"还是"目标的 MAC 是什么"?(提示:跨网段通信流程)
延伸阅读
- 《深入浅出计算机网络》(高军)第 3 章
- RFC 826: An Ethernet Address Resolution Protocol
- 动手实验:在 Linux
arping -I eth0 192.168.1.1主动发 ARP 请求 - 动手实验:用 Wireshark 抓包分析一个完整 ping 过程,看 ARP 解析在哪一步