快速理解网络协议(四)ARP、RARP 协议

ARP 协议

Address Resolution Protocol 地址解析协议,工作在 MAC 层,用于获得已知 IP 地址的 MAC 地址。

相同子网

普通ARP

假设 Client A 和 Client D 在 同一个子网中,Client A 要向 Client D 发送一个 IP 数据包(IP Packet)

  1. Client A 查看自己的 ARP 缓存表,判断是否包含 Client D 对应的 ARP 表项。如果有,则直接利用 ARP 缓存表中的 MAC 地址,对 IP 数据包进行帧封装,发送数据帧给 Client D

  2. 若 Client A 的 ARP 缓存表中,没有包含 Client D 的信息,则 Client A 先将此数据帧缓存,以广播的形式发送 ARP 请求报文,交换机收到广播包时,会原样复制该包到除源端口外的所有端口,具体包格式如下图:

  • dMAC 目标 MAC 地址 ff:ff:ff:ff:ff:ff ,即广播包
  • sMAC 源 MAC 地址,即 Client A 的 MAC 地址
  • type 数据帧类型为 ARP
  • ARP 数据报文内容 ^1^
    • HType(Hardware Type)硬件类型,标识链路层协议,当为 1 时表示以太网
    • PType(Protocol Type)协议类型,标识网络层协议,当为 0x0800 时表示 IPv4 协议
    • HLen(Hardware Length),硬件地址长度,以太网的长度为 6
    • PLen(Protocol Length),协议地址长度,IPv4 的长度为 4
    • Opcode 操作码,1 表示 ARP 请求("Request")
    • Sender MAC、Sender IP,为 Client A 的 MAC 地址 和 IP 地址
    • Target MAC 为 00:00:00:00:00:00,说明此时 Client A 还不知道 Client D 的 MAC 地址
    • Target IP 为 Client D 的 IP 地址
  1. Client D 比较自己的 IP 地址和 ARP 请求报文中的 Target IP 地址,若二者相同,将 ARP 请求报文中的 Sender MAC、Sender IP 地址信息存入自己的 ARP 缓存表中,以单播 的形式返回 ARP 响应报文 (Client C 也会将 Client A 的 IP、MAC 地址缓存在自己的 ARP 缓存表中,但并不响应 ARP 请求)。
  • dMAC 目标 MAC 地址,即 Client A 的 MAC 地址
  • sMAC 源 MAC 地址,即 Client D 的 MAC 地址
  • type 数据帧类型为 ARP
  • ARP 数据报文内容
    • HType、PType、HLen、PLen 与 ARP 包请求相似
    • Opcode 为 "Reply",即 ARP 响应包
    • Sender MAC、Sender IP,为 Client D 的 MAC 地址 和 IP 地址
    • Target MAC、Target IP, 为 Client A 的 MAC 地址 和 IP 地址

抓包实例

  1. 申请在同一个 VPC 下的 2 台云主机,内网地址分别为 10.23.139.22、10.23.197.59

  2. 登陆到 10.23.139.22,使用命令 arp -n 查看已经存在的 arp 缓存表项

  • 如果此时已有 10.23.197.59 的缓存,使用命令 arp -d 10.23.197.59 删掉缓存,删完之后再次check ,如果没有的话就继续下一步

  1. 使用tcpdump -i eth0 arp -w arp.pcap命令开始抓包

  2. 新开一个 tab,登陆到 10.23.139.22,使用 ping 10.23.197.59,对 10.23.197.59 发送一个 ICMP 报文

  3. 结束抓包,将 arp.pcap 下载到本地,用 wireshark 打开 arp.pcap

    • ARP Request

      • 可以看到 ARP 报文中的目标 MAC 地址是 00:00:00:00:00:00,而外层的目标 MAC 地址是 ff:ff:ff:ff:ff:ff,即广播
    • ARP Reply

      • ARP Reply 报文中,由于已经知道目标 MAC 地址,直接以jj单播的形式返回

不同子网

假设 Client A 和 Client D 不在同一个子网中,Client A 要向 Client D 发送一个 IP 数据包(IP Packet),还会像在同一子网内那样发送 ARP 报文吗?答案是否定的,这里要分两种情况,Client A 本身是否存在网关。由于之前已经解析过 ARP 报文中的具体字段,之后的 ARP 报文我们就只关注于字段的值而不再赘述字段含义。

普通 ARP

Client A 和 Client D 不在同一个子网中且 Client A 存在网关

  1. Client A 首先发现目标 IP 是跨网段的,并且 Client A 此时有网关,那么 Client A 就会发送 ARP 报文去查找网关的 MAC 地址,而不是跨网段的目标 IP 的 MAC 地址(本地无网关 MAC 地址缓存)
  2. Client A 以广播的形式发送 ARP 请求报文
  3. 网关以单播的形式返回 ARP 响应报文

跨子网且有网关的抓包实例

  1. gns3 网络拓扑及配置

    • 路由器配置地址 192.168.1.1 和 10.10.10.1

      • 进入配置模式 configure terminal
      • 配置接口 int e0/0
        • ip add 192.168.1.1 255.255.255.0
        • no shut
        • exit
      • e1/0 与 e0/0 相同
    • Client D-ARP 配置地址 10.10.10.20

      * ip 10.10.10.20/24 10.10.10.1

    • Client A 配置地址 192.168.1.100 和 网关地址 192.168.1.1

      • 注意这里的 Client A 是由路由器模拟的,为了方便后续的 proxy arp 实验
      • 进入配置模式 configure terminal
      • 配置接口 int e0/0
        • ip add 192.168.1.100 255.255.255.0
        • no shut
        • exit
      • 关闭路由功能 no ip routing
      • 设置默认网关 ip default-gateway 192.168.1.1
      • 退出配置模式后,检查下是否配置成功 show ip route
  2. 开始抓包

  3. 在 Client A 上 ping 10.10.10.20

    • ARP Request

      • 仍旧是广播的形式
      • 可以看到 Target IP 是 192.168.1.1 即网关的地址,而不是 10.10.10.20
    • ARP Reply

      • 网关单播回复 ARP Reply,附上自己的 MAC 地址

Proxy ARP(代理 ARP)

Client A 和 Client D 不在同一个子网中且 Client A 不存在网关

  1. 先来看看什么是 Proxy ARP
  • 当局域网内部主机发起跨网段的 ARP 请求,网关设备开启 ARP 代理功能且知道目标的路由信息时,会使用自身的 MAC 地址回复该请求
  • 这里有两个非常重要的点,一个是 Proxy ARP 需要网关设备支持且开启 ARP 代理功能,这说明 Proxy ARP 依赖且受限于网关设备 ,因此必定会来可扩展性差和不可靠的缺点。另一个是网关设备会用自身的 MAC 地址回复 ARP 请求报文
  1. Proxy ARP 和普通 ARP 的请求路径类似,唯一不同的是 ARP 请求报文中的 Target IP Address 中的值是目标 IP(而不是网关 IP)

跨子网无网关的 ARP 抓包实例

  1. gns3 网络拓扑及配置

    • 路由器和上述相同

    • Client D-ProxyARP 类似,配置地址换为 10.10.10.10

    • Client A 这里要关闭路由功能(上述已关闭)且去掉默认网关

      • no ip default-gateway
  2. 开始抓包

  3. 在 Client A 上 ping 10.10.10.10

    • ARP Request

      • 仍旧是广播的形式
      • 可以看到 Target IP 是 10.10.10.10 即目标地址,而不是网关地址
    • ARP Reply

      • 仍旧是网关单播回复 ARP Reply,附上自己的 MAC 地址

ARP 动态表项、静态表项

ARP 动态表项 :由 ARP 协议通过 ARP 报文自动生成和维护,可以被 ARP 静态表项覆盖,可以被 ARP 报文更新,可以过期
ARP 静态表项:手动配置和维护,不会被 ARP 动态表项覆盖,不会被 ARP 报文更新,不会过期

ARP 欺骗及防御

由于 ARP 请求不会验证 ARP 响应报文,若此时有主机在收到广播 ARP 请求报文后伪造 ARP 响应报文,则可以欺骗发送方,伪造 IP 地址 - MAC 地址 的映射关系,从而导致如下的问题:

  • 劫持通信内容
  • 广播攻击
  • 丢弃通信,拒绝服务

防御措施

  • 建立正确的 ARP 映射关系、检测并过滤伪造的 ARP 报文,保证经过其转发的 ARP报文正确合法
  • 抑制短时间内大量 ARP 报文的冲击

Gratuitous ARP(免费 ARP)

Gratuitous ARP 是一种特殊的 ARP 请求,当主机启动时,发送一个 Gratuitous ARP 请求,即请求自己的 IP 地址和 MAC 地址,即目标 IP 地址为 自己的 IP 地址。

Gratuitous ARP 的作用:

  1. 以广播的形式发送自己的 IP 地址 和 MAC 地址,在网络中宣告自己的信息,可以是宣告新添加的主机或者更新自己的 MAC 地址
  2. 检测 IP 地址冲突,若收到了 ARP 响应报文,则说明网络中已存在使用该 IP 地址的主机

ARP 常用命令

  • 查看 arp 表项 arp -a/ arp -e
  • 删除 arp 表项 arp -d,例:arp -i eth1 -d 192.168.60.1
  • 添加 arp 表项 arp -s,例:arp -s IP MAC-ADDRESS
  • 更多:arp -h

RARP 协议

反向地址转换协议(Reverse Address Resolution Protocol),用于获得已知 MAC 地址的 IP 地址。

一般在主机刚接入网络时,通过本地 MAC 地址来发送 RARP 请求,如果局域网内有 RARP Server 且 Server 上存在关于此 MAC 地址的映射 IP,则会返回 RARP Reply 响应,此时主机就获取了 IP 地址。

  • 需要 RARP 服务器,一般用于无法使用 DHCP 或没有任何输入接口的小型嵌入式设备
  • 主机以广播的形式发送 RARP 请求包,声明自己的 MAC 地址,并请求分配一个 IP 地址
  • RARP 服务器收到 RARP 请求包后,检查 RARP 列表,查找该 MAC 地址对应的 IP 地址
    • 若存在,则返回 RARP 响应包,成功分配 IP 地址
    • 若不存在,则不做任何响应,分配 IP 地址失败

Footnotes

  1. 更多参数值查看:www.iana.org/assignments...
相关推荐
点点滴滴的记录1 小时前
RPC核心实现原理
网络·网络协议·rpc
程思扬3 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
海绵波波1074 小时前
Webserver(4.8)UDP、广播、组播
单片机·网络协议·udp
很透彻6 小时前
【网络】传输层协议TCP(下)
网络·c++·网络协议·tcp/ip
蝌蚪代理ip8 小时前
辩论赛——动态IP与静态IP的巅峰对决
网络·网络协议·tcp/ip·ip
dulu~dulu10 小时前
查缺补漏----用户上网过程(HTTP,DNS与ARP)
网络·网络协议·http
丶213611 小时前
【网络】HTTP(超文本传输协议)详解
网络·网络协议·http
坚持拒绝熬夜11 小时前
IP协议知识点总结
网络·笔记·网络协议·tcp/ip
C++忠实粉丝15 小时前
计算机网络socket编程(1)_UDP网络编程实现echo server
linux·服务器·网络·c++·网络协议·计算机网络·udp
MetaverseMan17 小时前
http防抖和ws防抖
网络·网络协议·http