Skip to content

ARP 寻址与 NAT 穿透

ARP 协议地址解析过程、ARP 缓存与 ARP 欺骗、NAT/NAPT 网络地址转换原理与内网穿透技术(STUN/TURN/打洞)。

Updated View as Markdown
For humans

ARP 寻址与 NAT 穿透

校招考察频度:低频(网络底层寻址与内网穿透·大厂拓展加分项) 复习主线:虽然校招中应用层(HTTP/HTTPS)与传输层(TCP/UDP)占据 80% 的出题量,但大厂网络底层面试与运维排障题常常考察“IP 报文到底怎么送到目标网卡”以及“局域网私网 IP 如何与公网通信”。核心重点:有了 IP 为什么还要 MAC、ARP 请求广播与单播应答流程、跨网段路由时的 MAC 替换、NAT/NAPT 端口复用原理与 P2P 内网打洞。


1. 为什么有了 IP 地址,还需要 MAC 地址?

这是网络面试中非常经典的思考题:既然 IP 已经能唯一标识网络中的主机,为什么网卡还需要烧录 48 位的物理 MAC 地址?

+-------------------------------------------------------------------+
|  IP 地址(网络层·逻辑寻址): 决定了数据包的【终点和起点】(我要去北京)   |
|  MAC 地址(链路层·物理寻址): 决定了数据包【下一跳由谁转交】(先坐地铁到火车站)|
+-------------------------------------------------------------------+
  • 职责与抽象分工:
    • IP 地址是分层编址的逻辑地址:由网络拓扑决定,主机搬迁或切换 WiFi 后 IP 会发生变化,负责跨网络的端到端(End-to-End)路由。
    • MAC 地址是平坦编址的物理硬件地址:由厂商烧录在网卡 ROM 中,全球唯一,只负责同一局域网(同一物理网段)内相邻节点之间的点到点(Hop-by-Hop)传输。
  • 数据包转发时两者的变化:
    • 在路由器跨网段转发过程中,IP 数据报头部的 源 IP 和目的 IP 保持不变(NAT 场景除外)。
    • 但以太网帧头部的 源 MAC 和目的 MAC 每经过一个路由器跳步(Hop)就会被重新重写一次。

2. ARP(地址解析协议)工作原理

ARP(Address Resolution Protocol,RFC 826)工作在网络层与数据链路层之间,作用是:已知目标主机的 IP 地址,查询其对应的物理 MAC 地址。

2.1 同一局域网内的 ARP 解析过程

假设主机 A(192.168.1.10)想向同网段的主机 B(192.168.1.20)发送数据:

[主机 A: 192.168.1.10]                                  [主机 B: 192.168.1.20]
        |                                                        |
        |---- 1. 查询本地 ARP 缓存表 (arp -a) --------------------|
        |     (若命中则直接组装以太网帧发送)                             |
        |                                                        |
        |---- 2. 发送 ARP Request (广播) ------------------------>|
        |     [以太网帧头: 目的 MAC = FF:FF:FF:FF:FF:FF (全网广播)]  |
        |     [ARP Payload: 谁是 192.168.1.20? 请回复 192.168.1.10] |
        |                                                        |
        |     (局域网所有主机收到,非目标主机丢弃,主机 B 记录 A 的 MAC)      |
        |                                                        |
        |<--- 3. 返回 ARP Reply (单播) --------------------------|
        |     [以太网帧头: 目的 MAC = 主机 A 的 MAC (单播应答)]          |
        |     [ARP Payload: 我是 192.168.1.20, 我的 MAC 是 BB:BB:...]  |
        |                                                        |
        |---- 4. 主机 A 写入本地 ARP 缓存,并发送业务数据报文 ------>|
  1. 查缓存:主机 A 先查看自己本地的 ARP 缓存表(arp -a)。若存在 192.168.1.20 的映射且未过期,直接封装以太网帧发送。
  2. 广播请求(ARP Request):
    • 缓存未命中时,主机 A 在局域网内广播发送 ARP 请求报文。
    • 目的 MAC 地址填为全 1 的广播地址:FF:FF:FF:FF:FF:FF,同一碰撞域/广播域内的所有主机交换机都会收到。
  3. 单播回复(ARP Reply):
    • 局域网内其他无关主机收到后对比目标 IP,发现不是自己则直接丢弃。
    • 主机 B 发现询问的是自己,先将主机 A 的 IP-MAC 映射存入自己的 ARP 缓存,随后向主机 A 发送单播 ARP 响应(目的 MAC 为 A 的 MAC)。
  4. 更新缓存并通信:
    • 主机 A 收到响应后,将主机 B 的映射记录在本地 ARP 表中(通常有老化时间,如 15~20 分钟),随后的网络报文直接单播传输。

2.2 跨网段寻址:目标不在同一局域网

如果主机 A(192.168.1.10)要访问百度服务器(180.101.50.242):

  • 主机 A 拿自己的子网掩码与目标 IP 进行与运算,发现目标 IP 与自己不在同一子网。
  • 主机 A 不会去 ARP 广播查询百度的 MAC 地址(局域网广播无法穿透路由器)。
  • 主机 A 查询的是默认网关(Default Gateway,即本地路由器 LAN 口)的 MAC 地址。
  • 数据包封装为:源 IP: 192.168.1.10, 目的 IP: 180.101.50.242,而 目的 MAC: 网关的 MAC。

2.3 免费 ARP(Gratuitous ARP)

主机启动或网卡配置 IP 时,主动向网络发送一个“查询自己 IP 对应的 MAC”的 ARP 请求(目的 IP 为自己的 IP):

  • IP 冲突检测:如果网络中有其他机器回复了该报文,说明局域网内发生了 IP 冲突,系统会弹出警告并禁用该配置。
  • 刷新全网缓存:当服务器更换了网卡(IP 不变但 MAC 改变)或进行浮动 VIP 漂移(Keepalived 主备切换)时,发送免费 ARP 广播让交换机和相邻主机立即刷新缓存。

2.4 ARP 欺骗与防御

  • 成因:ARP 协议没有身份认证机制,节点遵循“谁应答就相信谁,甚至没请求也可以接收应答”的原则。
  • 黑客攻击:黑客向局域网广播或伪造 ARP Reply,声称“网关 IP 的 MAC 地址是我黑客的网卡”,从而成为中间人(MITM),窃听或劫持局域网所有流量。
  • 防御手段:
    1. 操作系统/网络设备静态绑定核心 IP 与 MAC 映射。
    2. 交换机开启 DAI(Dynamic ARP Inspection,动态 ARP 检查),结合 DHCP Snooping 绑定表丢弃非法 ARP 报文。

3. NAT(网络地址转换)与 NAPT

3.1 为什么需要 NAT?

  • IPv4 地址枯竭危机:IPv4 总共只有 42 亿个地址,除去广播、组播和保留段所剩无几。
  • 私网 IP 保留网段(RFC 1918):
    • A 类:10.0.0.0 ~ 10.255.255.255
    • B 类:172.16.0.0 ~ 172.31.255.255
    • C 类:192.168.0.0 ~ 192.168.255.255
  • 私网 IP 在公网骨干路由器上是不可路由的。私网设备想访问公网,必须在边界路由器(家庭光猫、企业网关)经过 NAT 将私网 IP 替换为合法的公网公有 IP。

3.2 NAT 的三种形态

类型原理优缺点
静态 NAT (Static NAT)1 个私网 IP 固定映射 1 个公网 IP不节约公网 IP,常用于内网特定服务器对外发布
动态 NAT (Dynamic NAT)内网主机随机借用公网 IP 地址池中的某个 IP缓解冲突,但同时上网人数不能超过公网 IP 池大小
NAPT (网络地址端口转换)最主流:基于“IP + 传输层端口号”进行转换成千上万台内网机器共用 1 个公网 IP,通过端口号区分不同连接

3.3 NAPT 工作流程图解

内网主机 192.168.1.5:50001 向公网 Web 服务器 1.1.1.1:80 发送 HTTP 请求,经过公网 IP 为 203.0.113.1 的 NAT 网关:

[内网主机: 192.168.1.5]
  |  源: 192.168.1.5:50001, 目的: 1.1.1.1:80
  v
[NAT 网关 / 路由器] (公网 IP: 203.0.113.1)
  |
  |-- 建立 NAT 转换表项:
  |   [内部地址: 192.168.1.5:50001] <---> [外部地址: 203.0.113.1:62001]
  |
  |-- 修改 IP 首部与 TCP 首部:
  |   源: 203.0.113.1:62001, 目的: 1.1.1.1:80
  v
[公网 Web 服务器: 1.1.1.1:80]
  |
  |-- 回包: 源: 1.1.1.1:80, 目的: 203.0.113.1:62001
  v
[NAT 网关 / 路由器]
  |-- 查 NAT 表: 端口 62001 对应 192.168.1.5:50001
  |-- 修改报文目的 IP 和端口为: 192.168.1.5:50001
  v
[内网主机: 192.168.1.5]

4. NAT 穿透与 P2P 打洞

4.1 NAT 带来的副作用

NAT 虽然拯救了 IPv4,但也打破了互联网端到端对等通信(End-to-End Principle)的基本假设:

  • 外部主动连接受阻:NAT 转换表项是由内网机器主动向外发送报文时动态创建的。公网机器或位于另一个 NAT 后面的机器,无法主动发起连接给位于 NAT 内部的主机。
  • P2P 应用阻碍:如 WebRTC 音视频通话、BT 下载、多人联机游戏需要节点两两直连。

4.2 NAT 的四种经典分类

根据 NAT 对外部数据包源 IP 与端口的限制严格程度,分为:

  1. 完全圆锥型(Full Cone NAT):最宽松。内网主机打洞后,任何公网主机向该映射端口发送报文均可到达内网。
  2. 受限圆锥型(Address-Restricted Cone NAT):内网主机向公网 IP-X 发过报文后,只有 IP 为 IP-X 的公网主机(端口不限)才能发送数据进来。
  3. 端口受限圆锥型(Port-Restricted Cone NAT):更严格。只有内网主机曾经向特定的 IP-X:Port-Y 发送过报文,外部该特定源端口才能向内发送。
  4. 对称型(Symmetric NAT):最严格。内网主机每次向不同的外部目标 IP/端口发起连接,NAT 分配的公网映射端口都不同且随机。无法通过常规 UDP 打洞直接直连。

4.3 常见穿透解决方案

+-------------------------------------------------------------+
|                      STUN 服务器 (公网)                       |
+-------------------------------------------------------------+
         ^                                             ^
  1. 探测自身映射公网 IP:Port                  1. 探测自身映射公网 IP:Port
         |                                             |
   [Client A (NAT-A)] ---- 2. 尝试向对方公网映射发包 ---> [Client B (NAT-B)]
                      <--- (互相打洞,成功建立 P2P 直连) ---
  • STUN(Session Traversal Utilities for NAT):
    • 客户端向公网 STUN 服务器发请求,STUN 服务端告诉客户端“从我的视角看,你的公网 IP 和端口是什么”,并判定当前的 NAT 属于哪种类型。
    • 双方得知彼此的公网映射地址后,同时向对方端口发包,在各自 NAT 路由器上打开“准入大门”(打洞)。
  • TURN(Traversal Using Relays around NAT):
    • 当至少有一方处于最严苛的“对称型 NAT”导致打洞失败时,退化为由公网中继服务器转发流量。延迟稍高、耗费中继带宽,但 100% 能连通。
  • ICE(Interactive Connectivity Establishment):
    • 综合框架(WebRTC 的核心协议):优先尝试本地局域网直连 -> 其次尝试 STUN UDP 打洞 -> 最后回退到 TURN 中继。

5. 面试高频追问

Q1:ping 命令底层用到了 ARP 吗?

答:用到了。ping 192.168.1.1 使用的是 ICMP 协议,属于网络层。但在封装成数据链路层以太网帧时,必须填充目的 MAC 地址。如果本地 ARP 缓存表中没有目标 IP 的 MAC,操作系统必须先暂停发送 ICMP 报文,先广播发送 ARP 请求并获得应答后,再将 ICMP 报文发出去。在第一次 ping 新机器时,经常看到第一个包超时丢弃,就是因为在等待 ARP 寻址。

Q2:交换机和路由器分别工作在哪一层?如何协作?

答:

  • 交换机(二层交换机):工作在数据链路层。基于 MAC 地址表工作,通过自学习源 MAC 构建转发表,转发时根据目的 MAC 单播或洪泛转发以太网帧,不修改报文内容。
  • 路由器:工作在网络层。基于 IP 路由表工作,负责跨网段路径寻址。转发时会剥离原以太网帧头,查询下一跳路由,将 TTL 减 1,重新封装新的源 MAC(路由器当前出口 MAC)和目的 MAC(下一跳路由器入口 MAC)。

Q3:NAPT 是如何区分相同内网主机访问相同公网目标的?

答:NAT 转换表维护的是一个五元组映射关系:{内网 IP, 内网 Port, 传输协议, 映射公网 IP, 映射公网 Port}。当主机 A 和主机 B 同时访问同一个 Web 服务器的 80 端口时,NAT 网关会为它们在公网出口分配互不相同的公网端口(例如分别分配 61001 和 61002)。当回包到达网关时,网关根据回包的目的端口(61001 或 61002)查表,就能精准路由回主机 A 或主机 B。

Navigation

Type to search…

↑↓ navigate↵ selectEsc close