3. 链路层调试:MAC地址表学习、ARP协议工作原理、VLAN标签处理

链路层调试,说白了就是搞清楚交换机怎么认路、设备怎么找人、以及广播域怎么切。这三个东西搞不明白,网络出问题你连从哪下手都不知道。我刚开始带团队那会儿,有个兄弟调了一下午的VLAN不通,最后发现是MAC地址表没刷新——这种坑,踩过一次就记住了。

3.1 MAC地址表学习机制

交换机不是天生就知道每个端口后面连着谁。它得学。怎么学?看源MAC。

一台交换机刚上电,MAC地址表是空的。这时候A发了个帧给B,交换机从端口1收到这个帧,一看源MAC是AA:AA:AA:AA:AA:01,立马在表里记一笔:

MAC地址             端口
AA:AA:AA:AA:AA:01   GigabitEthernet0/0/1

然后它查目的MAC,发现表里没有B的地址,怎么办?泛洪——除了接收端口,其他所有端口都发一遍。这就是经典的“未知单播泛洪”。

核心要点:MAC地址表学习只关心源MAC,转发决策只关心目的MAC。这两个动作是独立的,但缺一不可。

我在项目中遇到过一个问题:某台服务器频繁丢包,抓包一看,交换机MAC地址表在疯狂抖动。原因是服务器网卡做了双工协商失败,一直在发错误的MAC地址。嗯,这种问题不查MAC表根本定位不到。

3.1.1 MAC地址表老化

MAC地址表不是永久有效的。默认老化时间一般是300秒。如果某个MAC在300秒内没再发过帧,交换机就会把它删掉。这么做是为了适应网络拓扑变化——你想想看,如果一台笔记本从端口1换到端口2,老条目还在,那数据就送错了。

参数 默认值 调整建议
MAC老化时间 300秒 稳定网络可适当延长,频繁变动网络建议缩短
MAC表容量 视设备而定(8K~128K) 核心层建议不低于32K
静态MAC 无 关键服务器建议绑定静态MAC

调试技巧:用 show mac-address-table 查看当前表项。如果发现同一个MAC出现在多个端口,大概率是环路或者网卡故障。

3.2 ARP协议工作原理

MAC地址表解决的是二层转发问题,但设备之间通信用的是IP。怎么把IP映射到MAC?这就是ARP干的事。

ARP的工作流程其实很简单:

  1. 主机A想和主机B通信,但只知道B的IP,不知道B的MAC
  2. A发一个ARP请求广播:谁的IP是192.168.1.2?请告诉我你的MAC
  3. B收到后,发现问的是自己,就回复一个ARP应答:我是192.168.1.2,我的MAC是BB:BB:BB:BB:BB:02
  4. A收到应答,把IP和MAC的对应关系写进ARP缓存

这里有个细节:ARP请求是广播,ARP应答是单播。为什么?因为请求不知道目标MAC,只能广播;应答已经知道请求者的MAC了,直接单播回去就行。

注意:ARP协议没有任何认证机制。谁都可以发ARP应答。这就是ARP欺骗攻击的根本原因。我曾经在一个客户现场抓到过有人私接路由器导致断网——就是ARP欺骗搞的鬼。

3.2.1 ARP缓存与老化

ARP缓存也有老化时间。Windows默认是120秒,Linux默认60秒。老化之后,下次通信需要重新发ARP请求。

我个人习惯在调试时先用 arp -a 看看缓存里有没有目标IP的条目。如果没有,那就是ARP没学到;如果有但通信还是不通,那就检查MAC地址是不是对的。

# Windows查看ARP缓存
arp -a

# Linux查看ARP缓存
ip neigh show

# 清除ARP缓存(调试时常用)
arp -d 192.168.1.2

避坑指南:我曾经遇到过一个问题——两台设备配置了相同IP,导致ARP表在两者之间来回跳。现象就是网络时通时断。排查方法很简单:在交换机上查看MAC地址表,发现同一个IP对应的MAC在变。这种问题,ARP表一看就知道。

3.3 VLAN标签处理

VLAN的作用是把一个物理网络切成多个逻辑网络。交换机怎么区分不同VLAN的数据?靠标签。

IEEE 802.1Q标准在以太网帧头里插入了4字节的VLAN标签。结构如下:

字段 长度 说明
TPID 2字节 固定值0x8100,标识这是802.1Q帧
PCP 3位 优先级,用于QoS
DEI 1位 丢弃指示,用于拥塞控制
VID 12位 VLAN ID,范围1-4094

交换机端口有两种模式:

  • Access口:只属于一个VLAN,收到帧时打上对应VLAN标签,发出时去掉标签。一般连终端设备。
  • Trunk口:可以承载多个VLAN,帧带着标签走。一般连交换机或路由器。

调试要点:用 show vlan brief 查看VLAN配置,用 show interfaces trunk 查看Trunk口允许的VLAN列表。很多VLAN不通的问题,就是Trunk口没放行对应VLAN。

3.3.1 VLAN标签处理流程

交换机处理VLAN标签的流程,我画了个图,你看一眼就明白了:

VLAN标签处理流程 数据帧到达端口 判断端口类型:Access / Trunk Access口 打标签/去标签 Trunk口 检查VID是否在允许列表 查MAC地址表 + VLAN 注意:Access口和Trunk口对标签的处理方式完全不同,配置错误是VLAN不通最常见的原因

3.3.2 常见VLAN调试问题

我整理了几个实际项目中经常遇到的VLAN问题:

  • VLAN不通:先查Trunk口有没有放行对应VLAN。用 show interfaces trunk 一看便知。
  • 帧被丢弃:检查端口的allowed VLAN列表。我曾经遇到一个案例,Trunk口只放行了VLAN 10-20,但业务用了VLAN 30,结果全丢了。
  • 标签不匹配:Access口的PVID和实际VLAN不一致。比如端口PVID是10,但收到的帧带的是VLAN 20标签,交换机会直接丢弃。

重要提醒:VLAN 1是默认VLAN,很多交换机把VLAN 1作为管理VLAN。安全考虑,建议把管理VLAN改成其他ID,比如VLAN 99。我在等保测评项目里,这个配置几乎是必改项。

3.4 三者联动:一个完整的通信过程

把MAC地址表、ARP、VLAN串起来,看一个完整的通信过程:

  1. 主机A(IP: 192.168.10.1, VLAN 10)想和主机B(IP: 192.168.10.2, VLAN 10)通信
  2. A检查ARP缓存,没有B的MAC,于是发ARP请求广播
  3. 交换机从Access口收到这个广播帧,打上VLAN 10标签
  4. 交换机在VLAN 10内泛洪这个ARP请求(除了接收端口)
  5. B收到ARP请求,回复ARP应答(单播)
  6. 交换机学习到B的MAC地址,并转发应答给A
  7. A学到B的MAC,开始发送数据
  8. 交换机查MAC表,直接转发,不再泛洪

这个过程看起来简单,但任何一个环节出问题,通信就断了。我调试的时候,习惯按这个顺序排查:先看ARP能不能学到,再看MAC表有没有条目,最后看VLAN配置对不对。这个顺序,基本能覆盖90%的二层问题。