ARP / ND:IP 地址如何变成「邻站门牌」MAC
专栏《计算机网络基础》· 第五篇·链路 / 物理层承接《以太网局域网如何用 MAC 与交换机转发帧》讲解维度概念 → 原理 → 应用 → 问题定位读完你能讲清 ARP 请求/应答读懂ip neigh区分「同网段 ARP 失败」与「路由失败」建立 ND 与 ARP 的对照直觉导读下一跳的 IP 有了门牌号呢路由告诉你去10.0.5.20要经网关192.168.1.1出口eth0。以太网却只认 MAC。缺口就是把「邻站 IP」翻译成「邻站 MAC」。IPv4 世界里主角是ARPAddress Resolution ProtocolIPv6 世界里类似工作常由NDNeighbor Discovery基于 ICMPv6完成。上一篇交换机已经会按 MAC 转发了——可主机若填错目的 MAC或根本解析不出网关 MAC帧再漂亮也到不了该去的口。同网段ping不通时第一件事常常不是改业务代码而是看邻居表有没有学到、是不是 FAILED。已知下一跳 IP 192.168.1.1 未知其 MAC ARP喊一嗓子「谁是 192.168.1.1」→ 对方应答自己的 MAC一、概念ARP / ND 各在认什么1.1 ARP 解决的问题ARP在局域网同一广播域 / 通常即同一 VLAN内通过请求/应答解析IPv4 → MAC。它跑在以太网之上时EtherType 常见为0x0806——你在上一篇tcpdump -e里已经见过这种帧。报文作用ARP Request「谁是这个 IP请告诉我 MAC」通常广播ARP Reply「是我MAC 是 ……」通常单播回请求者解析结果缓存在邻居表 / ARP 缓存避免每次发包都广播扰民。缓存会过期、会探测、会失败——Linux 用一组状态把这些过程摊开后面专节看。1.2 它管什么 / 默认不管什么它管默认不管邻站 IPv4 → MAC跨网段选路本广播域内的请求/应答「一定解析成功」对端可关机、可被隔离缓存与老化实现相关传输层端口、应用协议旁路能力免费 ARP 宣告等加密与认证默认 ARP 不签最容易说错的一句访问 8.8.8.8 时ARP 解析的不是 8.8.8.8 的 MAC 而是「去 8.8.8.8 的下一跳」通常是默认网关的 MAC远方主机没有、也不需要在你广播域里有一张以太网门牌。1.3 NDIPv6对照别换一套脑模型IPv4IPv6直觉ARP Request / ReplyNeighbor Solicitation / AdvertisementNS / NA以太网广播问「谁是此 IP」常向被请求节点组播地址更定向地问免费 ARP重复地址检测DAD等机制有重叠气质ip neighip -6 neigh同一套邻居表基础设施的不同地址族EtherType0x0806承载在 ICMPv6 上外层仍是 IPv6 / 以太网本篇以 ARP 为主把排障肌肉练熟见到 IPv6 同网段不通就去看ip -6 neigh show sudo tcpdump -ni eth0 icmp6思路同构邻居解析失败 vs 路由失败。不要因为换了地址族就先怀疑应用框架。1.4 只解析「邻站」不解析「远方」目的 8.8.8.8 → 路由说经 192.168.1.1 → ARP 只问 192.168.1.1 的 MAC → 不会、也不能直接 ARP 出 8.8.8.8 的 MAC和网络层边界一致IP 头里写最终目的每一跳链路封装只服务「此刻的邻站」。掩码配错时主机会误判「谁算邻站」——该 ARP 直达的去走了网关或该走网关的却在本地广播瞎喊表现会非常像鬼神二、原理报文、缓存、状态机与几种「变体」2.1 ARP 报文字段不必背全文但要认得排障相关的ARP 报文里有硬件类型、协议类型、操作码以及两对「地址」Sender Hardware Address 发送者 MAC Sender Protocol Address 发送者 IP Target Hardware Address 目标 MAC请求里常为 0 Target Protocol Address 目标 IP「谁是这个 IP」里的那个操作码直觉op含义1request请求2reply应答Request 常见形态以太网目的 MAC 为全 F里面问Target Protocol Address 网关或对端 IPSender填自己。Reply 常见形态单播回到请求者把「IP ↔ MAC」填实。抓包时你不必对着 RFC 默写偏移要能回答谁在问问的是哪个 IP 谁回答了声称的 MAC 是什么 回答是否出乎意料例如多个不同 MAC 抢答2.2 一次完整解析主机侧剧本1) 查邻居表已有可用条目直接封装帧发送 2) 无建 INCOMPLETE发 ARP Request广播 3) 目标主机或代理 ARP回 Reply 4) 写入邻居表如 REACHABLE封装以太网帧发送 5) 之后一段时间内走缓存过期后再探测或重新解析交换机在这个过程中的角色把广播 Request 扩散到广播域把单播 Reply 送到请求者口——它通常不「替你生成 ARP 答案」代理 ARP 是路由器/网关上的另一种故事。2.3 邻居表状态Linux 够用版ip neigh show ip neigh show dev eth0状态人话REACHABLE最近确认过可信放心用STALE过期了再用时可能先确认一下DELAY / PROBE正在确认对端是否还在INCOMPLETE还在问、还没答上常见于刚发起解析FAILED解析失败——同网段故障强信号PERMANENT等静态绑定若有人配过排障时重点看网关 IP 是 REACHABLE、STALE还是 FAILED / 长期 INCOMPLETE。STALE 不一定是故障——很多系统里它只是「有一阵子没积极确认」。FAILED 才是「喊了没人理」或「路径上根本到不了应答」的强指纹。示意$ ip neigh show 192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE 192.168.1.20 dev eth0 lladdr 52:54:00:11:22:33 STALE 192.168.1.30 dev eth0 FAILED第三条出现时别先怀疑 TCP 参数——同网段三层都还没真正交出去。2.4 免费 ARPGratuitous ARP不是问答是宣告「免费」并不是不花钱而是不是为了问别人要答案而是主动宣告自己的 IP↔MAC。常见触发网卡刚配置 / 刚 up 某地址 DHCP 客户端确认租约 高可用 VIP 漂移到新机器 某些栈的重复地址探测相关行为交换机可能借此更新 MAC 地址表其它主机可能更新邻居缓存。若两台主机争同一 IP你会看到冲突、间歇不通——邻居表在不同 MAC 间跳业务像抽风。有一次双机热备脚本在切换时漏发了免费 ARP结果半个机房还指着旧机器的 MACVIP「漂了」流量却没跟上补宣告后才恢复。这类问题抓 ARP 比盯应用日志快。2.5 代理 ARPProxy ARP知道即可疑难时想起来某些网关会替「看起来在别处的 IP」回答 ARP把流量吸到自己再负责转发。旧网络、特殊迁移、错误子网设计里能见到。后果直觉主机以为对端是二层邻居 → 实际流量进了网关 路径变长、排障变绕有时和「掩码过大」叠加现代干净的地址规划更少依赖代理 ARP你不必把它当日常主菜但当抓包显示「明明不是本机 IP网关却抢着 Reply」时别怀疑眼睛。2.6 缓存过期与「突然 ping 一下又好了」邻居条目会老化。过期后下一次发送可能触发探测先单播问一声不行再广播。所以你能遇到这种工单业务超时报警 → 你一 ping 网关又好了未必是你「治好了」可能是探测唤醒了路径或对端刚好从省电里回来或中间设备 MAC 表重新学会了。真正排障仍要看失败窗口里邻居状态是什么、有没有 Request 无 Reply、错包计数有没有在涨。2.7 ARP 欺骗与安全直觉不讲攻击教程默认 ARP 几乎是「谁喊一声都可以信」。广播域里若有人抢答可能把自己插入路径中间人。工程师侧更实用的指纹ip neigh show to 192.168.1.1 # 记录正常网关 MAC异常变化值得查防御靠静态绑定、动态 ARP 检查DAI、端口安全、网络隔离、把信任域切小等。本专栏不展开如何攻击只要求你在「网关 MAC 半夜变了、证书告警与流量异常同时出现」时把二层邻居欺诈放进怀疑列表——而不是只重装客户端。2.8 ND 再补半寸和 ARP 同构的排查句式IPv6 链路上常见还要打交道链路本地地址fe80::/10——同链路有效 路由器通告RA——前缀、默认路由从哪来 NS/NA —— 邻站解析与可达性确认 DAD —— 地址重复检测同链路 ping 不通时ip -6 addr ip -6 route ip -6 neigh show ping -6 fe80::xxxx%iface # 链路本地要带出口RA 被关、被墙或邻居 FAILED都会让「IPv6 感觉时好时坏」。细节不必一次吞完先把句式对齐 ARP先链路再邻居再路由再应用。三、应用哪些场景天天碰到 ARP / ND3.1 开机访问网关笔记本拿到192.168.1.23/24默认路由是192.168.1.1。打开浏览器的第一跳之前几乎总会先解析网关 MAC。网关宕机、口隔离、VLAN 错表现都可能是邻居 FAILED外网全灭——但ip link仍显示 UP。3.2 虚拟机热迁移 / 容器漂移虚拟机搬到另一台宿主机后MAC 可能仍在但交换机旧口上的表项过期或指错。免费 ARP / RARP 一类宣告帮助路径收敛。容器若共用或改写 MAC 的策略不同云厂商还可能在虚拟交换机上做反欺骗——「我在虚拟机里改了 IPARP 却发不出去」并不罕见。3.3 双机热备与 VIPVIP 从主机 A 漂到主机 B 时必须让周围设备更新「这个 IP 现在在新 MAC / 新口」。免费 ARP 是常见手段之一。漏宣告的故障前面提过控制台显示切换成功流量还在老路。3.4 同网段主机互访两台同前缀机器互访ARP 直连目的 IP不经网关。若中间有「客户隔离」、交换机 ACL、云安全组对东向流量的隐式拒绝你会看到 Request 出、Reply 无——和「对端关机」长得很像要用对端是否存活、是否同 VLAN 交叉验证。3.5 云上的广播与邻居云环境里虚拟交换机与安全策略可能限制广播「ARP 行为与物理机房不完全一样」。但邻居表 FAILED 仍是好指纹说明至少在你这台虚拟机看来解析没有完成。下一步是区分对端根本不在同一二层域、策略丢了 ARP、还是地址根本不存在。四、问题定位同网段不通时怎么证明4.1 先分层避免把路由问题和 ARP 搅成一锅ping 192.168.1.10你认为的同网段失败 │ ├─ ip link 没有 LOWER_UP → 回物理/以太网专章 │ ├─ 双方前缀/掩码不一致 → 假同网段见 4.3 │ ├─ ip neigh 对端 FAILED / 一直 INCOMPLETE → ARP/过滤/隔离/关机/错 VLAN │ ├─ neigh 正常REACHABLE但仍不通 → 主机防火墙、对端服务、单边 ACL、策略路由 │ └─ 同网段通、仅跨网段不通 → 网关/路由第四篇访问公网失败时先看网关邻居而不是先 ARP1.1.1.1ip route get 1.1.1.1 ip neigh show to $(ip route show default | awk /default/ {print $3; exit})4.2 故障速查现象ARP/ND 侧常见根因先做什么同网段 ping 不通邻居 FAILED对端关机、错 VLAN、口隔离、IP 不存在、ARP 被过滤tcpdump arp核对 VLAN/隔离只有 Request没有 Reply同上或对端防火墙静默丢到对端口抓包看是否收到 Request有 ReplyMAC 合理仍不通上层过滤、非对称路径、策略查防火墙 / 安全组双向抓包Reply 的 MAC 乱跳IP 冲突、欺骗、错误代理对比冲突双方固化网关 MAC 观察网关 FAILED内网邻居却正常网关口问题、网关宕、上行口隔离单测网关换口查网关主机邻居掩码不一致的「半边通」假同网段对齐双方ip addr前缀IPv6 同链路不通ND 失败、RA 问题、需指定出口的链路本地ip -6 neightcpdump icmp64.3 掩码配错ARP 的「假同网段」经典坑A: 192.168.1.10/24 B: 192.168.1.20/16 ← 掩码不同双方对「是否同网段」理解不一致可能出现A 认为 B 是邻居 → 直接 ARP 192.168.1.20 B 认为 A 在「别的地方」→ 把去 A 的包丢给自己的网关结果是半边能通、回程怪、抓包只在一侧看见 ARP。查通断时双方掩码与地址规划一起看——只看「前两段长得像」不够。4.4 抓包解读sudo tcpdump -ni eth0 arp sudo tcpdump -ni eth0 icmp6 # IPv6 / ND抓包现象可能含义只有 Request没有 Reply对端没开机、错 VLAN、口隔离、对端丢弃、IP 不在本网段有 ReplyMAC 合理ARP OK问题在上层或过滤多个不同 MAC 回答同一 IP冲突或欺骗嫌疑Request 都发不出去本机策略、网卡/驱动异常、错误出接口云上 Request 无 Reply 但物理机房同配置正常虚拟网络广播限制 / 安全策略4.5 决策树五、动手把邻居解析摸实在授权环境做。优先用两台同交换机或同虚拟网的机器。接口名、IP 请换成你的。生产上ip neigh flush会导致短暂重新解析选窗口。实验 A清空缓存 → ping → 看状态与 ARP 交互主机 A 上假设对端 B 为192.168.1.20网卡eth0# 观察当前 ip neigh show to 192.168.1.20 # 授权环境下清空该接口邻居缓存影响同口其它条目谨慎 sudo ip neigh flush dev eth0 # 另开一个终端抓 ARP sudo tcpdump -ni eth0 arp -vv # 原终端发起 ping -c 3 192.168.1.20 ip neigh show to 192.168.1.20期望节奏1) flush 后条目消失或不再 REACHABLE 2) ping 触发 ARP Request广播 3) 见到 Reply 4) ip neigh 变为 REACHABLE或很快经过 PROBE 类状态落到可用示意抓包12:10:01.100011 ARP, Request who-has 192.168.1.20 tell 192.168.1.10, length 28 12:10:01.100204 ARP, Reply 192.168.1.20 is-at 52:54:00:11:22:33, length 28示意邻居表192.168.1.20 dev eth0 lladdr 52:54:00:11:22:33 REACHABLE若只有 Request 重复出现、最终FAILED按第四节表格往 VLAN / 隔离 / 对端存活查不要先调tcp_tw之类参数。实验 B公网目的 vs 网关邻居——证明「ARP 问的是谁」ip route get 1.1.1.1 # 记下 via 与 dev例如 via 192.168.1.1 dev eth0 sudo ip neigh flush dev eth0 sudo tcpdump -ni eth0 arp -c 20 ping -c 2 1.1.1.1 ip neigh show期望ARP 对话围绕网关 IP如192.168.1.1而不是1.1.1.1。邻居表里也不该出现「1.1.1.1的以太网 MAC」这种正常条目它不在你的广播域里。很多人第一次做这个实验会愣一下——这正是网络层与链路层边界上最值得留下肌肉记忆的画面。实验 C只看网关对比 REACHABLE 与 FAILEDGW$(ip route show default | awk /default/ {print $3; exit}) echo default gateway: $GW ip neigh show to $GW ping -c 2 $GW ip neigh show to $GW人为制造对照思想实验或实验室拔掉网关、或指到一个不存在的网关 IP再sudo ip neigh flush dev eth0 ping -c 3 192.168.1.254 # 假设这是不存在的「假网关」 ip neigh show to 192.168.1.254期望假地址走向INCOMPLETE→FAILED真网关在通路正常时应能到REACHABLE。把这两种屏幕差记熟以后看监控就不用猜。实验 D可选IPv6 邻居对照若环境有 IPv6 链路本地或同网段全球地址ip -6 neigh show ping -6 -c 2 对端地址 sudo tcpdump -ni eth0 icmp6 -c 20期望能看到 Neighbor Solicitation / Advertisement 一类 ICMPv6 交互具体显示名随 tcpdump 版本略异且ip -6 neigh出现对端条目。链路本地记得带%eth0这类出口后缀。本章小结ARP/ND邻站 IP → 邻站 MAC 只解析下一跳不解析远方主机 邻居表 REACHABLE / FAILED 是同网段排障指纹 Request 无 Reply关机、错 VLAN、隔离、过滤、地址错、冲突边缘 免费 ARP 用于宣告与漂移代理 ARP 会把「假邻居」流量吸到网关 掩码不一致会造成假同网段 抓包 arp / icmp6 可一锤定音 默认 ARP 轻信——网关 MAC 异常变化值得警惕