RARP 协议详解
RARP(Reverse Address Resolution Protocol,反向地址解析协议)是早期TCP/IP协议族中的链路层协议,用于将已知的MAC地址映射为IP地址。主要用于无盘工作站和磁盘less设备的网络启动,已被BOOTP和DHCP完全取代。
1. RARP 协议概述
基本概念
- 作用:MAC地址到IP地址的反向解析
- 发布年份:1984年
- 协议层:链路层(OSI第2层)
- 封装:以太网帧(EtherType=0x8035)
- 状态:已废弃,RFC 903(1984)定义
- 工作范围:同一广播域
RARP vs ARP
特性 | RARP | ARP |
---|
解析方向 | MAC → IP | IP → MAC |
操作码 | 3(请求),4(响应) | 1(请求),2(响应) |
EtherType | 0x8035 | 0x0806 |
使用场景 | 无盘启动 | 正常通信 |
安全性 | 无认证 | 无认证 |
状态 | 已废弃 | 仍在使用 |
为什么需要RARP?
早期网络设备:
- 无盘工作站:无本地存储,无法保存IP配置
- 磁盘less终端:启动时需从网络获取IP
- 引导加载:PXE前身,通过MAC分配固定IP
2. RARP 报文格式
以太网封装的RARP报文
以太网头部 (14字节)
+-----------------------------------+
| 目的MAC (6B,全FF广播) | 源MAC (6B) |
+-----------------------+-----------+
| 类型 (2B: 0x8035 RARP) |
+-----------------------------------+
RARP数据 (28字节,格式与ARP相同)
+-----------------------------------+
| 硬件类型|协议类型|硬件长度|协议长度|操作码 |
+---------+--------+--------+--------+-------+
| 源MAC(6B) | 源IP(4B,全0) |
+----------------------+--------------------+
| 目标MAC(6B,客户端MAC)| 目标IP(4B,全0) |
+-----------------------------------+
字段详解
字段 | 大小 | RARP值 | ARP对比 |
---|
硬件类型 | 2字节 | 1(以太网) | 1(相同) |
协议类型 | 2字节 | 0x0800(IPv4) | 0x0800 |
硬件地址长度 | 1字节 | 6 | 6 |
协议地址长度 | 1字节 | 4 | 4 |
操作码 | 2字节 | 3=请求,4=响应 | 1/2 |
源MAC | 6字节 | 客户端MAC | 发送方MAC |
源IP | 4字节 | 全0(0.0.0.0) | 发送方IP |
目标MAC | 6字节 | 客户端MAC(请求时) | 全0(请求时) |
目标IP | 4字节 | 全0(请求),响应IP(响应时) | 目标IP |
RARP 请求示例(十六进制)
RARP Request: MAC 00:11:22:33:44:55 请求IP
FF:FF:FF:FF:FF:FF 00:11:22:33:44:55 80:35
00:01 08:00 06:04 00:03 00:11:22:33:44:55 00:00:00:00 00:11:22:33:44:55 00:00:00:00:00:00
└广播 └客户端MAC └操作码3 └源MAC └源IP(0) └目标MAC(自身) └目标IP(0)
RARP 响应示例
RARP Reply: 00:11:22:33:44:55 的IP是192.168.1.100
00:11:22:33:44:55 AA:BB:CC:DD:EE:FF 80:35
00:01 08:00 06:04 00:04 AA:BB:CC:DD:EE:FF C0:A8:01:64 00:11:22:33:44:55 00:00:00:00
└客户端MAC └服务器MAC └操作码4 └源MAC └源IP └目标MAC └目标IP(0)
3. RARP 工作流程
完整启动流程
无盘工作站启动
↓
1. ROM代码加载,获取MAC地址
↓
2. 发送RARP请求(广播)
├─ 网络广播
├─ RARP服务器接收
└─ 根据MAC查询IP地址数据库
↓
3. RARP服务器单播响应IP地址
↓
4. 客户端更新网络配置
↓
5. 使用IP发送BOOTP/DHCP请求获取更多配置
↓
6. TFTP下载引导文件,启动操作系统
RARP 服务器配置(历史)
# 早期Unix rarpd守护进程
rarpd -a # 监听所有接口
rarpd eth0 # 指定接口
# /etc/ethers 文件(MAC到IP映射)
00:11:22:33:44:55 johnws
AA:BB:CC:DD:EE:FF maryws
# 启动服务
/etc/init.d/rarpd start
交互示例
[无盘工作站] → RARP Request: MAC=00:11:22:33:44:55
[RARP服务器] → 查询 /etc/ethers 或数据库
[RARP服务器] → RARP Reply: IP=192.168.1.100
[工作站] → 配置IP,发送BOOTP请求
[BOOTP服务器] → 提供TFTP服务器、引导文件
[工作站] → TFTP下载 vmlinuz, initrd → 启动
4. RARP 的局限性和问题
技术限制
- 广播开销:每个请求产生广播风暴
- 单IP分配:无法提供子网掩码、网关等配置
- 手动配置:需要维护MAC-IP静态映射
- 安全性差:无认证,易受伪造响应攻击
- 扩展性差:局域网规模受限
- 仅IPv4:不支持IPv6
配置复杂性
# 传统RARP配置问题
# 1. 每个客户端需要静态/etc/ethers条目
# 2. 服务器重启丢失动态分配
# 3. 跨子网不支持(广播限制)
# 4. 无租约管理,IP冲突风险
5. RARP 替代方案
BOOTP(Bootstrap Protocol)
- RFC 951(1985):RARP的直接继任者
- UDP端口:67(服务器),68(客户端)
- 功能增强:
- UDP可靠传输
- 支持子网掩码、网关、DNS
- 文件服务器地址
- 仍需静态配置:MAC-IP映射
DHCP(Dynamic Host Configuration Protocol)
- RFC 2131(1997):BOOTP的动态扩展
- 动态IP分配:地址池管理
- 租约机制:IP地址回收
- 自动配置:完整网络参数
- 重绑定:租约续期和迁移
演进路径
RARP (1984) → BOOTP (1985) → DHCP (1997)
↓ ↓ ↓
静态MAC-IP 静态+配置 动态+自动配置
广播风暴 UDP可靠 地址池+租约
局域网限制 跨子网支持 完整DHCP功能
已废弃 过渡方案 当前标准
6. 现代PXE启动流程
PXE(Preboot Execution Environment)
1. BIOS/UEFI → PXE ROM加载
2. 发送PXE发现包(DHCP Discover变种)
3. DHCP服务器响应:IP + PXE选项
4. TFTP下载pxelinux.0引导程序
5. 加载内核和initrd
6. 启动操作系统
DHCP/PXE配置示例
# /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option domain-name-servers 8.8.8.8;
# PXE支持
next-server 192.168.1.10; # TFTP服务器
filename "pxelinux.0";
}
# 静态保留(类似RARP)
host workstation1 {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.50;
filename "pxelinux.0";
}
7. RARP 历史实现
早期Unix实现
// 简化rarpd伪代码
void rarpd_main() {
socket = create_raw_socket(ETHERTYPE_REVARP);
bind_to_interface("eth0");
while (true) {
packet = receive_packet();
if (is_rarp_request(packet)) {
mac = extract_source_mac(packet);
ip = lookup_ip_in_ethers(mac);
if (ip) {
send_rarp_reply(client_mac, ip, server_mac);
}
}
}
}
/etc/ethers 文件格式
# MAC地址 主机名
00:11:22:33:44:55 workstation1
aa:bb:cc:dd:ee:ff workstation2
08:00:20:01:23:45 terminal3
启动脚本
#!/bin/sh
# 传统RARP启动
if [ ! -f /etc/rc.conf ]; then
echo "Sending RARP request..."
rarp -a # 触发RARP请求
sleep 2
ifconfig eth0 $RARP_IP netmask 255.255.255.0
route add default gw $GATEWAY
echo "RARP completed, IP=$RARP_IP"
fi
8. RARP 安全问题
攻击向量
- 响应伪造:攻击者发送虚假RARP响应
- IP冲突:分配重复IP地址
- 拒绝服务:洪泛错误响应
- 无认证:无法验证服务器合法性
历史攻击示例
# 伪造RARP响应(仅理论)
# 攻击者监听RARP请求
# 发送虚假响应:任意MAC → 攻击者控制的IP
# 客户端配置错误IP,通信失败或重定向
防护措施(历史)
- 静态配置:/etc/ethers手动验证
- 网络隔离:物理隔离RARP流量
- 服务器认证:早期尝试IPsec封装(不实用)
9. 抓包分析和调试
Wireshark过滤
# RARP流量
frame.protocols == "rarp"
rarp.opcode == 3 # 请求
rarp.opcode == 4 # 响应
# 与ARP对比
eth.type == 0x8035 # RARP
eth.type == 0x0806 # ARP
tcpdump捕获
# 捕获RARP流量
sudo tcpdump -i eth0 -e ether proto 0x8035
# 分析响应
sudo tcpdump -r rarp.pcap -x -e 'rarp[6:2] = 4'
模拟RARP环境
# 使用Scapy模拟RARP服务器
from scapy.all import *
import time
def rarp_server():
while True:
sniff(filter="rarp", prn=lambda pkt: rarp_reply(pkt))
def rarp_reply(req):
if RARP in req and req[RARP].op == 3: # 请求
reply = RARP(
op=4, # 响应
hwsrc="aa:bb:cc:dd:ee:ff", # 服务器MAC
psrc="192.168.1.100", # 分配IP
hwdst=req[RARP].hwsrc, # 客户端MAC
pdst="0.0.0.0"
)
sendp(Ether(dst=req[RARP].hwsrc)/reply, iface="eth0")
# 注意:现代系统不支持RARP,仅模拟
10. 迁移和兼容性
从RARP迁移到DHCP
# 1. 配置DHCP服务器
# /etc/dhcp/dhcpd.conf
host legacy-workstation {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.50;
option bootfile-name "legacy-boot.img";
}
# 2. 客户端BIOS设置:PXE/DHCP替代RARP
# 3. 移除rarpd服务
systemctl disable rarpd
systemctl stop rarpd
# 4. 清理/etc/ethers(可选)
rm -f /etc/ethers
双协议支持(过渡期)
# BOOTP兼容RARP客户端
# dhcpd同时响应BOOTP和DHCP
# 早期客户端收到BOOTP响应,现代用DHCP
11. 现代替代技术的对比
PXE vs RARP
特性 | RARP | PXE/DHCP |
---|
地址分配 | 静态MAC-IP | 动态地址池 |
配置参数 | 仅IP | 完整网络配置 |
引导支持 | 需额外BOOTP | 集成TFTP引导 |
安全性 | 无 | DHCP Snooping |
跨子网 | 不可能 | 中继代理支持 |
IPv6 | 不支持 | DHCPv6 |
UEFI网络启动
- HTTPBoot:HTTP下载替代TFTP
- iPXE:脚本化引导,支持多协议
- Security Boot:签名验证引导文件
12. 历史意义和遗产
RARP的贡献
- 网络引导先驱:奠定无盘启动基础
- 地址解析扩展:ARP协议族扩展
- BOOTP基础:UDP封装和配置选项
- DHCP启发:动态配置概念
协议演进树
ARP (1982) ──┬─ RARP (1984) → 已废弃
│
├─ BOOTP (1985) → DHCP (1997)
│ ↓
│ PXE/iPXE/UEFI
│
└─ NDP (1995, IPv6)
遗留系统支持
# 检查系统是否支持RARP
lsmod | grep rarp
cat /proc/net/rarp # 可能不存在
# 历史工具(可能不可用)
rarp -a # 查询RARP表
rarpd # RARP守护进程
13. 故障排除(历史参考)
常见问题
问题 | 原因 | 解决 |
---|
无响应 | RARP服务器未运行 | 启动rarpd,检查/etc/ethers |
IP冲突 | 重复MAC配置 | 检查静态映射唯一性 |
广播丢失 | 交换机过滤 | 配置广播域,检查VLAN |
引导失败 | BOOTP/TFTP缺失 | 配置完整引导链 |
诊断步骤
1. 检查RARP服务:ps aux | grep rarpd
2. 验证/etc/ethers配置
3. 抓包分析:tcpdump ether proto 0x8035
4. 测试BOOTP继任者:dhcpd测试
5. 迁移到DHCP/PXE
RARP协议作为网络引导的早期解决方案,在无盘工作站时代发挥了重要作用。虽然技术局限使其被淘汰,但其设计理念影响了后续的BOOTP、DHCP和PXE等现代网络启动技术。了解RARP有助于理解网络协议的演进历史和地址分配机制的发展。现代网络环境应完全使用DHCP和PXE替代RARP功能。