25天:ARP协议和链路层

第25天:ARP协议和链路层

今日目标

  • 理解ARP协议的作用和工作原理
  • 掌握ARP缓存管理
  • 学习免费ARP和代理ARP
  • 了解ARP安全问题和防御措施
  • 理解MAC地址和以太网帧格式
  • 学习VLAN基础
  • 实现ARP工具

1. ARP协议概述

1.1 什么是ARP?

ARP = Address Resolution Protocol(地址解析协议)

ARP的作用:
将IP地址映射到MAC地址

为什么需要ARP?
- 网络层使用IP地址通信
- 数据链路层使用MAC地址通信
- 需要将IP地址转换为MAC地址

生活比喻:
IP地址像家庭住址:"北京市朝阳区某某街123号"
MAC地址像门牌号码:"1号楼2单元301室"

快递员(数据包)需要:
1. 先找到街道(IP路由)
2. 再找到具体门牌(MAC地址)

ARP就是"查询门牌号的过程"

工作场景:
主机A(192.168.1.10)想发送数据给主机B(192.168.1.20)
→ A知道B的IP地址(192.168.1.20)
→ A不知道B的MAC地址
→ A使用ARP查询:"谁是192.168.1.20?"
→ B回复:"我是,我的MAC地址是aa:bb:cc:dd:ee:ff"
→ A记录下来,然后发送数据

ARP的特点

✅ 工作在数据链路层和网络层之间
✅ 只在局域网内工作(不跨路由器)
✅ 使用广播查询
✅ 使用单播应答
✅ 维护ARP缓存表

协议类型:
- 以太网类型字段:0x0806(ARP)
- 位于OSI模型第2层和第3层之间

1.2 为什么需要地址映射?

网络通信的两种地址:

1. IP地址(逻辑地址)
   - 32位(IPv4)
   - 层次化
   - 可路由
   - 示例:192.168.1.10

2. MAC地址(物理地址)
   - 48位
   - 扁平化
   - 不可路由
   - 示例:aa:bb:cc:dd:ee:ff

为什么两种地址?

IP地址:
✅ 全局唯一(理论上)
✅ 层次化,支持路由
✅ 可以动态分配
✅ 便于网络管理

MAC地址:
✅ 硬件内置
✅ 网卡级别唯一
✅ 不需要配置
✅ 数据链路层使用

数据传输流程:
应用层:使用域名(www.google.com)
   ↓ DNS
网络层:使用IP地址(142.250.185.14)
   ↓ ARP
数据链路层:使用MAC地址(aa:bb:cc:dd:ee:ff)
   ↓
物理层:电信号传输

ARP是关键的桥梁!

2. ARP工作原理

2.1 ARP报文格式

ARP报文格式(28字节):

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Hardware Type           |       Protocol Type           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  HW Addr Len  | Proto Addr Len|          Operation            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Sender Hardware Address                     |
|                        (6 bytes)                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Sender Protocol Address                     |
|                        (4 bytes)                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Target Hardware Address                     |
|                        (6 bytes)                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Target Protocol Address                     |
|                        (4 bytes)                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明:

Hardware Type (硬件类型, 16位):
- 1 = 以太网
- 6 = IEEE 802网络
- 7 = ARCnet

Protocol Type (协议类型, 16位):
- 0x0800 = IPv4
- 与以太网类型字段相同

Hardware Address Length (硬件地址长度, 8位):
- 以太网 = 6(字节)

Protocol Address Length (协议地址长度, 8位):
- IPv4 = 4(字节)

Operation (操作, 16位):
- 1 = ARP请求(ARP Request)
- 2 = ARP应答(ARP Reply)
- 3 = RARP请求
- 4 = RARP应答

Sender Hardware Address (发送方硬件地址, 6字节):
- 发送方的MAC地址

Sender Protocol Address (发送方协议地址, 4字节):
- 发送方的IP地址

Target Hardware Address (目标硬件地址, 6字节):
- 请求时为全0或FF:FF:FF:FF:FF:FF
- 应答时为目标MAC地址

Target Protocol Address (目标协议地址, 4字节):
- 目标的IP地址

2.2 ARP请求和应答

ARP请求(ARP Request)

场景:
主机A(192.168.1.10, MAC: 11:11:11:11:11:11)
想发送数据给
主机B(192.168.1.20, MAC: 未知)

ARP请求流程:

1. 主机A构造ARP请求包:
   ┌──────────────────────────────────┐
   │ 以太网头部                        │
   ├──────────────────────────────────┤
   │ 目标MAC: FF:FF:FF:FF:FF:FF (广播) │
   │ 源MAC: 11:11:11:11:11:11         │
   │ 类型: 0x0806 (ARP)               │
   ├──────────────────────────────────┤
   │ ARP报文                          │
   ├──────────────────────────────────┤
   │ 操作: 1 (请求)                   │
   │ 发送方MAC: 11:11:11:11:11:11     │
   │ 发送方IP: 192.168.1.10           │
   │ 目标MAC: 00:00:00:00:00:00       │
   │ 目标IP: 192.168.1.20             │
   └──────────────────────────────────┘

2. 广播发送到局域网
   - 所有主机都能收到
   - 目标MAC是广播地址

3. 局域网内所有主机接收:
   - 主机C: IP不是192.168.1.20,忽略
   - 主机D: IP不是192.168.1.20,忽略
   - 主机B: IP是192.168.1.20,处理!

ARP应答(ARP Reply)

主机B收到ARP请求后:

1. 主机B构造ARP应答包:
   ┌──────────────────────────────────┐
   │ 以太网头部                        │
   ├──────────────────────────────────┤
   │ 目标MAC: 11:11:11:11:11:11       │
   │ 源MAC: 22:22:22:22:22:22         │
   │ 类型: 0x0806 (ARP)               │
   ├──────────────────────────────────┤
   │ ARP报文                          │
   ├──────────────────────────────────┤
   │ 操作: 2 (应答)                   │
   │ 发送方MAC: 22:22:22:22:22:22     │
   │ 发送方IP: 192.168.1.20           │
   │ 目标MAC: 11:11:11:11:11:11       │
   │ 目标IP: 192.168.1.10             │
   └──────────────────────────────────┘

2. 单播发送给主机A
   - 不是广播,直接发送
   - 目标MAC是请求方的MAC

3. 主机A接收应答:
   - 记录到ARP缓存
   - 192.168.1.20 → 22:22:22:22:22:22
   - 现在可以发送数据了!

完整交互流程

主机A (192.168.1.10)               主机B (192.168.1.20)
11:11:11:11:11:11                  22:22:22:22:22:22
      │                                   │
      │                                   │
      │  ARP Request (广播)                │
      │  "谁是192.168.1.20?               │
      │   我是192.168.1.10"                │
      │──────────────────────────────────>│
      │                                   │
      │                          ┌────────┤
      │                          │ 检查IP │
      │                          │ 是我! │
      │                          └────────┤
      │                                   │
      │  ARP Reply (单播)                  │
      │  "我是192.168.1.20                 │
      │   我的MAC是22:22:22:22:22:22"      │
      │<──────────────────────────────────│
      │                                   │
 ┌────┤                                   │
 │缓存│                                   │
 │映射│                                   │
 └────┤                                   │
      │                                   │
      │  开始发送数据                      │
      │──────────────────────────────────>│
      │                                   │

时间:约几毫秒

2.3 ARP缓存

什么是ARP缓存?

ARP缓存 = ARP表 = ARP Cache

作用:
- 存储IP地址到MAC地址的映射
- 避免重复ARP请求
- 提高通信效率

内容:
┌─────────────────┬─────────────────────┬─────────┬──────┐
│   IP地址        │      MAC地址        │  类型   │ 剩余 │
├─────────────────┼─────────────────────┼─────────┼──────┤
│ 192.168.1.1     │ aa:bb:cc:dd:ee:ff   │ 动态    │ 120s │
│ 192.168.1.20    │ 11:22:33:44:55:66   │ 动态    │ 300s │
│ 192.168.1.100   │ 00:11:22:33:44:55   │ 静态    │  -   │
└─────────────────┴─────────────────────┴─────────┴──────┘

缓存类型:

1. 动态条目(Dynamic)
   - 通过ARP请求/应答获得
   - 有超时时间(通常2-20分钟)
   - 超时后删除,下次重新ARP

2. 静态条目(Static)
   - 手动添加
   - 永久有效(重启失效)
   - 不会被覆盖
   - 用于安全或特殊需求

工作流程:

1. 需要发送数据到某IP
2. 查找ARP缓存
   - 找到?使用缓存的MAC地址
   - 没找到?发送ARP请求
3. 收到ARP应答后更新缓存
4. 使用MAC地址发送数据

查看ARP缓存

Linux/macOS:
$ arp -a
? (192.168.1.1) at aa:bb:cc:dd:ee:ff [ether] on eth0
? (192.168.1.20) at 11:22:33:44:55:66 [ether] on eth0

$ ip neigh show
192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE
192.168.1.20 dev eth0 lladdr 11:22:33:44:55:66 STALE

Windows:
C:\> arp -a
Interface: 192.168.1.10 --- 0x3
  Internet Address      Physical Address      Type
  192.168.1.1           aa-bb-cc-dd-ee-ff     dynamic
  192.168.1.20          11-22-33-44-55-66     dynamic

缓存状态(Linux):
- REACHABLE: 可达,最近验证过
- STALE: 陈旧,超过有效期但未删除
- DELAY: 延迟,正在验证
- PROBE: 探测,发送请求验证
- FAILED: 失败,无法解析
- PERMANENT: 永久,静态条目

管理ARP缓存

查看ARP缓存:
arp -a
ip neigh show

添加静态ARP:
# Linux
sudo arp -s 192.168.1.100 00:11:22:33:44:55
sudo ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0

# Windows
arp -s 192.168.1.100 00-11-22-33-44-55

删除ARP条目:
# Linux
sudo arp -d 192.168.1.100
sudo ip neigh del 192.168.1.100 dev eth0

# Windows
arp -d 192.168.1.100

清空ARP缓存:
# Linux
sudo ip neigh flush all

# Windows
arp -d *

超时设置:
# Linux查看超时配置
sysctl net.ipv4.neigh.default.gc_stale_time
# 默认60秒

# 修改超时时间
sudo sysctl -w net.ipv4.neigh.default.gc_stale_time=300

3. 免费ARP和代理ARP

3.1 免费ARP(Gratuitous ARP)

免费ARP = Gratuitous ARP = GARP

定义:
主机发送ARP请求,查询自己的IP地址

格式:
┌──────────────────────────────────┐
│ 发送方IP: 192.168.1.10           │
│ 目标IP: 192.168.1.10(自己)     │
│ 目标MAC: FF:FF:FF:FF:FF:FF (广播) │
└──────────────────────────────────┘

特点:
- 查询的是自己的IP
- 广播发送
- 通常不期待响应

用途:

1. 检测IP冲突
   - 主机配置IP前发送GARP
   - 如果收到响应:IP冲突!
   - 如果无响应:IP可用

示例:
主机启动,配置192.168.1.10
→ 发送GARP:"谁是192.168.1.10?"
→ 如果局域网内有其他主机使用此IP
→ 该主机会响应
→ 检测到冲突,提示用户

2. 更新其他主机的ARP缓存
   - IP地址变更后
   - MAC地址变更后
   - 通知其他主机更新缓存

示例:
服务器更换网卡(MAC变了)
→ 发送GARP
→ 局域网内所有主机收到
→ 更新ARP缓存:192.168.1.10 → 新MAC

3. 高可用性/故障转移
   - 虚拟IP漂移
   - 主备切换

示例:
主服务器:VIP 192.168.1.100
→ 主服务器故障
→ 备服务器接管VIP
→ 备服务器发送GARP
→ 其他主机更新:192.168.1.100 → 备服务器MAC
→ 流量切换到备服务器

4. 链路层负载均衡
   - 多网卡绑定
   - VRRP/HSRP协议

3.2 代理ARP(Proxy ARP)

代理ARP = Proxy ARP

定义:
路由器代替其他主机响应ARP请求

场景:
网络A: 192.168.1.0/24
   ↓
路由器R(启用代理ARP)
   ↓
网络B: 192.168.2.0/24

问题:
主机A (192.168.1.10) 认为 192.168.2.20 在同一网络
(错误配置了子网掩码为 /16)
→ 发送ARP广播:"谁是192.168.2.20?"
→ 192.168.2.20在另一个网络,收不到

代理ARP解决:
1. 路由器R收到ARP请求
2. R检查:192.168.2.20在网络B
3. R代替192.168.2.20响应ARP
4. R返回:192.168.2.20的MAC是路由器R的MAC
5. 主机A发送数据到路由器R
6. 路由器R转发到192.168.2.20

工作流程:
主机A                  路由器R                 主机B
192.168.1.10                                  192.168.2.20
      │                    │                       │
      │ ARP Request        │                       │
      │ "谁是192.168.2.20?"│                       │
      │───────────────────>│                       │
      │                    │                       │
      │              ┌─────┤                       │
      │              │检查 │                       │
      │              │路由 │                       │
      │              └─────┤                       │
      │                    │                       │
      │ ARP Reply          │                       │
      │ "我是(路由器MAC)"│                       │
      │<───────────────────│                       │
      │                    │                       │
      │ 发送数据到路由器    │                       │
      │───────────────────>│ 转发数据              │
      │                    │──────────────────────>│
      │                    │                       │

优点:
✅ 简化网络配置
✅ 透明路由
✅ 兼容性好

缺点:
❌ 增加ARP流量
❌ 可能被滥用
❌ 难以排错

现代网络:
- 代理ARP较少使用
- 更推荐正确配置子网掩码
- 或使用路由协议

4. RARP协议

4.1 RARP概述

RARP = Reverse Address Resolution Protocol
反向地址解析协议

作用:
与ARP相反,从MAC地址解析IP地址

使用场景:
无盘工作站启动
- 没有硬盘
- 不知道自己的IP地址
- 只知道自己的MAC地址(网卡ROM中)

工作流程:
1. 无盘工作站启动
2. 读取网卡MAC地址
3. 广播RARP请求:"我的MAC是xx:xx:xx:xx:xx:xx,我的IP是多少?"
4. RARP服务器查询配置表
5. RARP服务器响应:"你的IP是192.168.1.100"
6. 无盘工作站配置IP地址
7. 继续启动(通常使用TFTP下载操作系统)

报文格式:
与ARP相同,只是操作字段不同:
- Operation = 3: RARP请求
- Operation = 4: RARP应答

现状:
RARP已过时,被以下协议取代:
- BOOTP
- DHCP (推荐)

原因:
❌ 需要专用服务器
❌ 功能单一(只能获取IP)
❌ 不提供网关、DNS等信息
❌ 难以管理

DHCP优势:
✅ 自动分配IP
✅ 提供完整网络配置
✅ 支持租约管理
✅ 易于部署和管理

5. ARP安全问题

5.1 ARP欺骗/ARP缓存投毒

ARP欺骗原理

ARP欺骗 = ARP Spoofing = ARP Cache Poisoning

问题:
ARP协议没有认证机制!
- 任何主机都可以发送ARP应答
- 主机无法验证ARP应答的真实性
- 收到ARP应答就更新缓存

攻击原理:
攻击者发送伪造的ARP应答
→ 其他主机更新ARP缓存为错误映射
→ 流量被重定向到攻击者

经典攻击:中间人攻击(MITM)

正常情况:
主机A ←→ 路由器 ←→ 互联网

ARP欺骗后:
主机A ←→ 攻击者 ←→ 路由器 ←→ 互联网
           │
        窃听/篡改

攻击步骤:

网络环境:
- 主机A: 192.168.1.10 (MAC: AA:AA:AA:AA:AA:AA)
- 路由器: 192.168.1.1 (MAC: 11:11:11:11:11:11)
- 攻击者: 192.168.1.50 (MAC: EE:EE:EE:EE:EE:EE)

步骤1: 攻击者 → 主机A
发送伪造的ARP应答:
"192.168.1.1的MAC是EE:EE:EE:EE:EE:EE"

主机A的ARP缓存被修改:
原来: 192.168.1.1 → 11:11:11:11:11:11 (正确)
现在: 192.168.1.1 → EE:EE:EE:EE:EE:EE (错误!)

步骤2: 攻击者 → 路由器
发送伪造的ARP应答:
"192.168.1.10的MAC是EE:EE:EE:EE:EE:EE"

路由器的ARP缓存被修改:
原来: 192.168.1.10 → AA:AA:AA:AA:AA:AA (正确)
现在: 192.168.1.10 → EE:EE:EE:EE:EE:EE (错误!)

步骤3: 双向流量被拦截
主机A发送数据到路由器 → 实际发到攻击者
路由器发送数据到主机A → 实际发到攻击者

步骤4: 攻击者转发流量(保持连接)
攻击者收到主机A的数据 → 转发给路由器
攻击者收到路由器的数据 → 转发给主机A

结果:
✅ 主机A和路由器通信正常(看起来)
✅ 攻击者能看到所有流量
✅ 攻击者可以篡改流量
✅ 用户完全不知道!

攻击演示

攻击工具:
- Ettercap
- arpspoof(dsniff工具包)
- Cain & Abel
- Bettercap

示例(arpspoof):

# 终端1:欺骗主机A
sudo arpspoof -i eth0 -t 192.168.1.10 192.168.1.1
# 告诉主机A:路由器的MAC是我的MAC

# 终端2:欺骗路由器
sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.10
# 告诉路由器:主机A的MAC是我的MAC

# 终端3:启用IP转发(保持连接)
sudo sysctl -w net.ipv4.ip_forward=1

# 终端4:抓包
sudo tcpdump -i eth0 -w capture.pcap

结果:
主机A的所有流量都被拦截!

攻击影响

可能的危害:

1. 窃听流量
   - 捕获用户名密码
   - 窃取敏感信息
   - 监控通信内容

2. 篡改流量
   - 修改网页内容
   - 注入恶意代码
   - 替换下载文件

3. 会话劫持
   - 窃取Session Cookie
   - 冒充用户身份
   - 非法操作

4. 拒绝服务
   - 不转发流量
   - 导致通信中断
   - 网络瘫痪

5. DNS欺骗
   - 拦截DNS查询
   - 返回伪造IP
   - 重定向到钓鱼网站

5.2 防御措施

技术防御

1. 静态ARP绑定
   - 手动配置ARP表
   - 防止被覆盖

优点:
✅ 完全防御ARP欺骗

缺点:
❌ 管理复杂
❌ 难以扩展
❌ 需要人工维护

使用场景:
- 小型网络
- 关键服务器
- 高安全需求

示例:
sudo arp -s 192.168.1.1 aa:bb:cc:dd:ee:ff

2. 动态ARP检测(DAI)
   - 交换机功能
   - 验证ARP包的合法性
   - 丢弃伪造的ARP包

工作原理:
- 交换机维护IP-MAC-端口绑定表
- 检查ARP包是否与绑定表一致
- 不一致的ARP包被丢弃

配置(Cisco):
Switch(config)# ip arp inspection vlan 1
Switch(config)# interface GigabitEthernet0/1
Switch(config-if)# ip arp inspection trust

3. IP源防护(IPSG)
   - 基于IP-MAC-端口绑定
   - 过滤非法IP包

4. DHCP侦听(DHCP Snooping)
   - 建立IP-MAC绑定数据库
   - 为DAI提供数据

5. 端口安全
   - 限制端口学习的MAC数量
   - 防止MAC泛洪

6. 802.1X认证
   - 端口级认证
   - 只允许认证设备接入

7. VLAN隔离
   - 分割广播域
   - 限制ARP欺骗范围

8. ARP监控工具
   - ArpWatch:监控ARP变化
   - arpON:主动防御
   - XArp:Windows工具

9. 使用加密协议
   - HTTPS代替HTTP
   - SSH代替Telnet
   - VPN隧道
   - 即使被中间人攻击,数据也是加密的

主机端防御

Linux:

1. 安装arpwatch
sudo apt-get install arpwatch
sudo systemctl start arpwatch
# 监控ARP变化,发送邮件警告

2. 配置静态ARP
# 添加网关静态ARP
sudo arp -s 192.168.1.1 aa:bb:cc:dd:ee:ff

# 持久化配置(Ubuntu)
# 编辑 /etc/network/interfaces
up arp -s 192.168.1.1 aa:bb:cc:dd:ee:ff

3. 使用arptables
sudo arptables -A INPUT -s 192.168.1.1 --source-mac ! aa:bb:cc:dd:ee:ff -j DROP
# 只接受来自正确MAC的ARP

Windows:

1. 静态ARP
arp -s 192.168.1.1 aa-bb-cc-dd-ee-ff

2. 使用XArp软件
- 图形化工具
- 实时监控
- 自动防御

3. 启用防火墙
- 防止未授权访问

macOS:

1. 静态ARP
sudo arp -s 192.168.1.1 aa:bb:cc:dd:ee:ff

2. 使用第三方工具
- Little Snitch
- ArpGuard

最佳实践

网络管理员:
1. 部署交换机安全功能(DAI, IPSG, DHCP Snooping)
2. 使用VLAN隔离关键网络
3. 定期审计网络设备
4. 监控异常ARP流量
5. 实施端口安全策略
6. 启用802.1X认证

用户:
1. 使用加密协议(HTTPS, SSH, VPN)
2. 安装ARP监控工具
3. 定期检查ARP缓存
4. 避免在不安全网络(公共WiFi)传输敏感信息
5. 关键服务器使用静态ARP
6. 及时更新系统和软件

开发者:
1. 使用HTTPS
2. 实施证书验证
3. 使用HSTS
4. 警告用户不安全连接
5. 实施端到端加密

6. MAC地址和以太网

6.1 MAC地址

MAC地址格式

MAC地址 = Media Access Control Address
物理地址、硬件地址、以太网地址

格式:48位(6字节)
表示:12个十六进制数字

常见格式:
aa:bb:cc:dd:ee:ff  (冒号分隔)
aa-bb-cc-dd-ee-ff  (短横线分隔)
aabb.ccdd.eeff     (Cisco风格)
aabbccddeeff       (连续)

结构:
┌──────────────────┬──────────────────┐
│   OUI (24位)     │   NIC (24位)     │
│ 组织唯一标识符   │  网卡接口标识    │
└──────────────────┴──────────────────┘

示例:
00:1A:2B:3C:4D:5E
│ │
│ └─ 第一个字节的最低位
│    = 0: 单播地址
│    = 1: 多播地址
│
└─ 第一个字节的第二低位
   = 0: 全球唯一(OUI分配)
   = 1: 本地管理

OUI(Organizationally Unique Identifier):
- 前3个字节
- IEEE分配给厂商
- 每个厂商唯一

常见OUI:
00:1A:2B - Apple
00:50:56 - VMware
08:00:27 - Oracle VirtualBox
52:54:00 - QEMU/KVM

NIC(Network Interface Controller):
- 后3个字节
- 厂商自行分配
- 同一厂商内唯一

特殊MAC地址:

1. 广播地址
   FF:FF:FF:FF:FF:FF
   - 发送给所有主机

2. 多播地址
   01:00:5E:xx:xx:xx
   - IPv4多播映射

3. 零地址
   00:00:00:00:00:00
   - 无效地址

MAC地址分类

1. 单播MAC(Unicast)
   - 第一字节最低位 = 0
   - 一对一通信
   - 示例:00:1A:2B:3C:4D:5E

2. 多播MAC(Multicast)
   - 第一字节最低位 = 1
   - 一对多通信
   - 示例:01:00:5E:00:00:01

3. 广播MAC(Broadcast)
   - FF:FF:FF:FF:FF:FF
   - 发送给所有主机

全球唯一 vs 本地管理:
- 全球唯一:第一字节第二低位 = 0
  - IEEE分配的OUI
  - 理论上全球唯一

- 本地管理:第一字节第二低位 = 1
  - 本地配置
  - 可能冲突

6.2 以太网帧格式

以太网II帧格式

以太网帧(Ethernet Frame)

格式:
┌─────────┬─────────┬──────┬─────────┬─────┐
│ 前导码  │ 目标MAC │ 源MAC│  类型   │数据 │ FCS │
│ 8字节   │ 6字节   │ 6字节│ 2字节   │46-  │4字节│
│         │         │      │         │1500 │     │
└─────────┴─────────┴──────┴─────────┴─────┘

详细结构:

1. 前导码(Preamble):8字节
   - 7字节前导码:10101010...
   - 1字节帧起始定界符(SFD):10101011
   - 用于同步和帧定界

2. 目标MAC地址:6字节
   - 接收方的MAC地址
   - 可以是单播、多播、广播

3. 源MAC地址:6字节
   - 发送方的MAC地址
   - 必须是单播地址

4. 类型/长度字段:2字节
   - ≥ 1536(0x0600):类型字段(以太网II)
     - 0x0800:IPv4
     - 0x0806:ARP
     - 0x86DD:IPv6
   - ≤ 1500:长度字段(IEEE 802.3)

5. 数据字段:46-1500字节
   - 上层协议数据
   - 最小46字节(不足填充)
   - 最大1500字节(MTU)

6. FCS(帧校验序列):4字节
   - CRC-32校验
   - 检测传输错误

总长度:
最小帧:64字节(不含前导码)
最大帧:1518字节(不含前导码)

MTU(最大传输单元):
- 以太网MTU:1500字节
- 数据字段最大长度
- 不包括以太网头部和FCS

帧类型

常见以太网类型值:

0x0800 - IPv4
最常见的类型

0x0806 - ARP
地址解析协议

0x86DD - IPv6
IPv6数据包

0x8100 - 802.1Q VLAN标签
VLAN标记帧

0x8847 - MPLS单播
MPLS标签

0x8863 - PPPoE发现
PPPoE协议

0x8864 - PPPoE会话
PPPoE数据

示例:IP数据包的以太网帧

┌────────────────────────────────────────┐
│ 目标MAC: aa:bb:cc:dd:ee:ff             │
│ 源MAC: 11:22:33:44:55:66               │
│ 类型: 0x0800 (IPv4)                    │
├────────────────────────────────────────┤
│ IP头部(20字节)                       │
│ TCP头部(20字节)                      │
│ HTTP数据(变长)                       │
├────────────────────────────────────────┤
│ FCS: xx:xx:xx:xx                       │
└────────────────────────────────────────┘

6.3 VLAN基础

什么是VLAN?

VLAN = Virtual Local Area Network
虚拟局域网

作用:
- 在物理网络上划分逻辑网络
- 隔离广播域
- 提高安全性
- 简化管理

传统网络 vs VLAN:

传统(一个交换机 = 一个广播域):
┌────────────────────────────────────┐
│         交换机                     │
├────┬────┬────┬────┬────┬────┬─────┤
│ PC1│ PC2│ PC3│ PC4│ PC5│ PC6│ PC7 │
└────┴────┴────┴────┴────┴────┴─────┘
所有PC在同一广播域,能互相通信

VLAN(一个交换机 = 多个虚拟交换机):
┌────────────────────────────────────┐
│         物理交换机                 │
├─────────────────┬──────────────────┤
│   VLAN 10       │    VLAN 20       │
│  (研发部)       │    (销售部)      │
├────┬────┬───────┼────┬────┬────────┤
│ PC1│ PC2│ PC3   │ PC4│ PC5│ PC6    │
└────┴────┴───────┴────┴────┴────────┘
不同VLAN隔离,不能直接通信

优点:
✅ 隔离广播
✅ 提高安全
✅ 灵活管理
✅ 逻辑分组
✅ 跨地域VLAN

802.1Q VLAN标签

802.1Q标准:
在以太网帧中插入4字节VLAN标签

标准以太网帧:
┌─────────┬─────────┬──────┬─────────┬─────┐
│ 目标MAC │ 源MAC   │ 类型 │  数据   │ FCS │
└─────────┴─────────┴──────┴─────────┴─────┘

802.1Q标记帧:
┌─────────┬─────────┬──────────┬──────┬─────────┬─────┐
│ 目标MAC │ 源MAC   │VLAN标签  │ 类型 │  数据   │ FCS │
│ 6字节   │ 6字节   │ 4字节    │2字节 │ 46-1500 │4字节│
└─────────┴─────────┴──────────┴──────┴─────────┴─────┘

VLAN标签(4字节):
┌────────────────┬─────┬─────┬────────────────┐
│   TPID         │ PCP │ DEI │    VID         │
│   16位         │ 3位 │ 1位 │    12位        │
└────────────────┴─────┴─────┴────────────────┘

TPID(Tag Protocol Identifier):
- 固定值:0x8100
- 标识这是VLAN标记帧

PCP(Priority Code Point):
- 3位,0-7
- 服务质量(QoS)优先级

DEI(Drop Eligible Indicator):
- 1位
- 标记是否可丢弃

VID(VLAN Identifier):
- 12位,0-4095
- VLAN ID
- 0:默认VLAN
- 1:默认VLAN(通常)
- 4095:保留
- 有效范围:1-4094

示例:
VLAN ID = 10
标签:81 00 00 0A

VLAN配置示例

Cisco交换机配置:

1. 创建VLAN
Switch(config)# vlan 10
Switch(config-vlan)# name VLAN_DEV
Switch(config-vlan)# exit

Switch(config)# vlan 20
Switch(config-vlan)# name VLAN_SALES
Switch(config-vlan)# exit

2. 分配端口到VLAN
Switch(config)# interface GigabitEthernet0/1
Switch(config-if)# switchport mode access
Switch(config-if)# switchport access vlan 10
Switch(config-if)# exit

Switch(config)# interface GigabitEthernet0/2
Switch(config-if)# switchport mode access
Switch(config-if)# switchport access vlan 20
Switch(config-if)# exit

3. 配置Trunk端口(连接交换机)
Switch(config)# interface GigabitEthernet0/24
Switch(config-if)# switchport mode trunk
Switch(config-if)# switchport trunk allowed vlan 10,20
Switch(config-if)# exit

4. 查看VLAN
Switch# show vlan brief

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Gi0/3, Gi0/4
10   VLAN_DEV                         active    Gi0/1
20   VLAN_SALES                       active    Gi0/2

7. 实战项目:ARP工具套件

7.1 项目需求

功能需求:
1. ARP缓存查看和管理
   - 显示ARP表
   - 添加/删除条目
   - 清空缓存

2. ARP扫描
   - 扫描局域网主机
   - 发现活动主机
   - MAC地址识别

3. ARP监控
   - 实时监控ARP流量
   - 检测ARP变化
   - 警告异常

4. ARP安全检测
   - 检测ARP欺骗
   - IP/MAC冲突检测
   - 网关验证

技术要求:
- Python实现
- 原始套接字
- 友好的输出
- 跨平台支持

7.2 工具演示

# ARP缓存查看
python day25_arp_tool.py --show

# ARP扫描
sudo python day25_arp_tool.py --scan 192.168.1.0/24

# ARP监控
sudo python day25_arp_tool.py --monitor

# 安全检测
sudo python day25_arp_tool.py --detect

8. 今日练习

练习1:ARP分析

1. 查看本机ARP缓存:
   arp -a

   分析:
   - 有多少条目?
   - 哪些是动态的?
   - 网关MAC是什么?

2. 清空ARP缓存后ping网关:
   sudo ip neigh flush all
   ping -c 1 192.168.1.1
   arp -a

   观察ARP表的变化

3. 使用tcpdump抓取ARP包:
   sudo tcpdump -i eth0 arp -vv

   分析ARP请求和应答

练习2:ARP实验

实验1:ARP缓存超时
1. 记录一个动态ARP条目
2. 等待一段时间
3. 观察条目是否消失
4. 再次ping,观察ARP请求

实验2:静态ARP
1. 添加静态ARP:
   sudo arp -s <IP> <MAC>
2. 尝试ping
3. 删除静态ARP
4. 对比差异

实验3:ARP扫描
使用nmap扫描局域网:
nmap -sn 192.168.1.0/24
观察发现的主机

练习3:安全测试

在隔离的测试环境中:

1. 搭建测试网络
   - 2-3台虚拟机
   - 同一网络

2. 测试ARP欺骗(仅用于学习)
   - 使用arpspoof
   - 观察流量
   - 验证防御措施

3. 部署防御
   - 配置静态ARP
   - 使用监控工具
   - 测试效果

注意:
⚠️ 仅在自己的测试环境中进行
⚠️ 不要在生产网络测试
⚠️ ARP欺骗是违法行为

9. 常见问题

Q1:为什么ARP使用广播?

A:

  • ARP在数据链路层工作
  • 不知道目标MAC地址
  • 只能使用广播让所有主机收到
  • 目标主机识别出是自己的IP后响应

Q2:ARP缓存为什么会超时?

A:

  • 主机可能更换网卡(MAC变化)
  • IP地址可能重新分配
  • 避免缓存过期信息
  • 典型超时:2-20分钟

Q3:如何防止ARP攻击?

A: 最佳方案组合:

  1. 交换机启用DAI和DHCP Snooping
  2. 关键服务器使用静态ARP
  3. 使用HTTPS等加密协议
  4. 部署ARP监控工具
  5. VLAN隔离

Q4:跨路由器能ARP吗?

A:

  • 不能!ARP只在局域网内工作
  • 路由器不转发ARP广播
  • 跨网段通信需要路由
  • 路由器会代理ARP(如果启用)

Q5:IPv6还用ARP吗?

A:

  • 不用ARP
  • 使用NDP(邻居发现协议)
  • 基于ICMPv6
  • 功能更强大

10. 总结

今天我们学习了:

核心知识点

  1. ARP协议

    • IP地址 → MAC地址映射
    • 广播请求 + 单播应答
    • ARP缓存提高效率
  2. ARP工作流程

    • 查询ARP缓存
    • 发送ARP请求(广播)
    • 接收ARP应答(单播)
    • 更新缓存
    • 发送数据
  3. ARP报文格式

    • 28字节固定格式
    • 包含硬件和协议地址
    • 操作字段区分请求/应答
  4. 免费ARP和代理ARP

    • 免费ARP:检测冲突、更新缓存
    • 代理ARP:路由器代理响应
  5. ARP安全

    • ARP欺骗/缓存投毒
    • 中间人攻击
    • 防御措施:DAI、静态ARP、监控
  6. MAC地址

    • 48位物理地址
    • OUI + NIC
    • 单播/多播/广播
  7. 以太网帧

    • 目标MAC + 源MAC + 类型 + 数据 + FCS
    • 最小64字节,最大1518字节
    • MTU 1500字节
  8. VLAN

    • 虚拟局域网
    • 隔离广播域
    • 802.1Q标签

重点回顾

ARP工作流程:
1. 需要MAC地址
2. 查ARP缓存 → 有:使用;无:继续
3. 广播ARP请求
4. 目标主机单播应答
5. 更新缓存
6. 发送数据

ARP欺骗防御:
网络级:DAI + DHCP Snooping
主机级:静态ARP + 监控
应用级:使用加密协议

MAC地址结构:
OUI(24位)+ NIC(24位)
第一字节最低位:单播/多播
第一字节第二低位:全球/本地

安全警示

⚠️ ARP协议没有认证
⚠️ 容易被欺骗和攻击
⚠️ 必须部署防御措施
⚠️ 使用加密协议保护数据
⚠️ 仅在授权环境测试攻击技术

明天预告

第26天:路由协议基础

内容预览:

  • 路由基础概念
  • 静态路由配置
  • 动态路由协议概述
  • RIP协议详解
  • OSPF基础
  • 路由表分析

继续加油! 🚀

今天我们深入学习了ARP协议,理解了IP地址到MAC地址的映射过程,以及ARP安全问题和防御措施。这是网络通信的基础,也是网络安全的重要一环。明天我们将学习路由协议,了解数据如何在不同网络间传输!

进度:25/180天(13.9%)