第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: 最佳方案组合:
- 交换机启用DAI和DHCP Snooping
- 关键服务器使用静态ARP
- 使用HTTPS等加密协议
- 部署ARP监控工具
- VLAN隔离
Q4:跨路由器能ARP吗?
A:
- 不能!ARP只在局域网内工作
- 路由器不转发ARP广播
- 跨网段通信需要路由
- 路由器会代理ARP(如果启用)
Q5:IPv6还用ARP吗?
A:
- 不用ARP
- 使用NDP(邻居发现协议)
- 基于ICMPv6
- 功能更强大
10. 总结
今天我们学习了:
核心知识点
ARP协议:
- IP地址 → MAC地址映射
- 广播请求 + 单播应答
- ARP缓存提高效率
ARP工作流程:
- 查询ARP缓存
- 发送ARP请求(广播)
- 接收ARP应答(单播)
- 更新缓存
- 发送数据
ARP报文格式:
- 28字节固定格式
- 包含硬件和协议地址
- 操作字段区分请求/应答
免费ARP和代理ARP:
- 免费ARP:检测冲突、更新缓存
- 代理ARP:路由器代理响应
ARP安全:
- ARP欺骗/缓存投毒
- 中间人攻击
- 防御措施:DAI、静态ARP、监控
MAC地址:
- 48位物理地址
- OUI + NIC
- 单播/多播/广播
以太网帧:
- 目标MAC + 源MAC + 类型 + 数据 + FCS
- 最小64字节,最大1518字节
- MTU 1500字节
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%)