跳到主要内容

4.4.1.1. 选择器

一个 SA 可以是细粒度的,也可以是粗粒度的,这取决于用于定义该 SA 流量集合的选择器。例如,两台主机之间的所有流量可以通过单个 SA 承载,并获得一组统一的安全服务。相反,一对主机之间的流量也可能散布在多个 SA 上,具体取决于所使用的应用(由下一层协议及相关字段如端口定义),不同的 SA 提供不同的安全服务。类似地,一对安全网关之间的所有流量可以承载在单个 SA 上,也可以为每一对通信主机分配一个 SA。

所有 IPsec 实现都必须支持以下选择器参数,以便于控制 SA 的粒度。请注意,本地地址和远端地址应同为 IPv4 或同为 IPv6,而不应混用地址类型。另请注意,本地/远端端口选择器(以及 ICMP 消息类型和代码、移动头类型)可以标记为“不透明”(OPAQUE),以适应这些字段因包分片而不可访问的情况。

远端 IP 地址

类型:IPv4 或 IPv6

这是一个 IP 地址范围(单播、广播(仅 IPv4))的列表。该结构允许表达:

  • 单个 IP 地址(通过一个平凡范围)
  • 地址列表(每个地址都是一个平凡范围)
  • 地址范围(低值和高值,含端点)
  • 范围列表

地址范围用于支持共享同一 SA 的多个远端系统,例如位于某安全网关之后的系统。

本地 IP 地址

类型:IPv4 或 IPv6

这是一个 IP 地址范围(单播、广播(仅 IPv4))的列表。该结构允许表达:

  • 单个 IP 地址(通过一个平凡范围)
  • 地址列表(每个地址都是一个平凡范围)
  • 地址范围(低值和高值,含端点)
  • 范围列表

地址范围用于支持共享同一 SA 的多个源系统,例如位于某安全网关之后的系统。本地指的是由本实现(或策略条目)所保护的地址。

注意:SPD 不包含对多播地址条目的支持。为支持多播 SA,实现应当使用 [RFC3740] 中定义的组 SPD(GSPD)。GSPD 条目需要不同的结构,即在多播语境下,无法使用与单播 SA 的本地和远端地址值相关联的对称关系。具体而言,在某个 SA 上发往多播地址的出站流量,不会在以该多播地址为源的配套入站 SA 上被接收。

下一层协议

来源:IPv4 的“协议”字段或 IPv6 的“下一个头”字段

取值:单个协议号、ANY,或(仅 IPv6)OPAQUE

下一层协议是指紧随任何存在的 IP 扩展头之后的协议。为简化下一层协议的定位,应当有一种机制用于配置要跳过的 IPv6 扩展头。

默认跳过的 IPv6 扩展头

  • 0(逐跳选项)
  • 43(路由头)
  • 44(分片头)
  • 60(目的选项)

注意:默认列表不包含 51(AH)或 50(ESP)。从选择器查找的角度来看,IPsec 将 AH 和 ESP 视为下一层协议。

依赖于下一层协议的选择器

若干附加选择器依赖于下一层协议的值:

端口(TCP、UDP、SCTP 等)

如果下一层协议使用两个端口(如 TCP、UDP、SCTP 及其他),那么就有针对本地端口和远端端口的选择器。这些选择器各自具有一个取值范围的列表。

重要:在收到分片包的情况下,或者端口字段已被 IPsec 保护(加密)的情况下,本地端口和远端端口可能不可用;因此,也必须支持 OPAQUE 取值。

分片处理

  • 在非初始分片中,端口值将不可用。
  • 如果某个端口选择器指定了 ANY 或 OPAQUE 之外的值,则它无法匹配非初始分片包。
  • 如果 SA 要求 ANY 或 OPAQUE 之外的端口值,那么到达的不含端口的分片必须被丢弃。(参见第 7 节“处理分片”。)

移动头类型

如果下一层协议是移动头,那么存在一个针对 IPv6 移动头消息类型(MH 类型)的选择器。这是一个 8 位值,用于标识特定的移动消息。

注意:在收到分片包的情况下,MH 类型可能不可用。(参见第 7 节“处理分片”。)

对于 IKE:IPv6 移动头消息类型(MH 类型)被放置在 16 位本地“端口”选择器的最高 8 位中。

ICMP 类型和代码

如果下一层协议值是 ICMP,那么存在一个 16 位选择器用于 ICMP 消息类型和代码。

结构

  • 消息类型:定义 ICMP 消息类型的单个 8 位值,或 ANY
  • ICMP 代码:定义 ICMP 消息特定子类型的单个 8 位值

对于 IKE

  • 消息类型放置在 16 位选择器的最高 8 位中
  • 代码放置在最低 8 位中

允许的组合

  • 单个类型与一个代码范围
  • 单个类型与 ANY 代码
  • ANY 类型与 ANY 代码

匹配算法:给定一个带有类型范围(T-start 到 T-end)和代码范围(C-start 到 C-end)的策略条目,以及一个类型为 t、代码为 c 的 ICMP 包,实现必须使用以下方式测试匹配:

(T-start*256) + C-start <= (t*256) + c <= (T-end*256) + C-end

注意:在收到分片包的情况下,ICMP 消息类型和代码可能不可用。(参见第 7 节“处理分片”。)

名称

重要:这不是像上述其他项那样的选择器。它并非从包中获取。名称可用作 IPsec 本地或远端地址的符号化标识符。

命名 SPD 条目有两种使用方式:

用例 1:响应方(针对移动办公用户的访问控制)

当 IP 地址不适合作为远端 IP 地址选择器时,命名 SPD 条目由响应方(而非发起方)用于支持访问控制,例如针对“移动办公用户”(road warrior)。

过程

  1. 用于匹配此字段的名称在 IKE 协商期间通过 ID 载荷传送。
  2. 发起方的源 IP 地址(隧道模式下的内层 IP 头)被绑定到由 IKE 协商所创建的 SAD 条目中的远端 IP 地址。
  3. 当 SPD 条目以这种方式被选中时,该地址会覆盖 SPD 中的远端 IP 地址值。

要求:所有 IPsec 实现都必须支持名称的这种用法。

支持的名称形式

  • 完全限定域名(FQDN)
  • 识别名(DN)
  • RFC 822 电子邮件地址
  • 密钥 ID

用例 2:发起方(多用户标识)

命名 SPD 条目可由发起方用于标识将为该用户创建 IPsec SA(或该用户的流量可被绕过)的用户。如果并且当以下条目被创建时,发起方的 IP 源地址(隧道模式下来自内层 IP 头)用于替换:

  • SPD 缓存条目中的本地地址
  • 出站 SAD 条目中的本地地址
  • 入站 SAD 条目中的远端地址

支持:这种用法对于多用户的原生主机实现是可选的,且不适用于其他实现。

注意:此名称仅在本地使用;它不由密钥管理协议传送。此外,在发起方语境下,可以适用上述用例 1(响应方)所用名称形式之外的名称形式。

SPD 条目中的名称

一个 SPD 条目可以同时包含名称(或名称列表)以及本地或远端 IP 地址的取值。

对于用例 1(响应方):命名 SPD 条目中采用的标识符是 DNS 名称、识别名或 RFC 822 电子邮件地址。

对于用例 2(发起方):名称形式可以与用例 1 相同,也可以是用户 ID(UID)或其他本地命名约定。

重要命名规则

  • 所有 SPD 条目都必须能够容纳上述为响应方使用而定义的名称形式。
  • 如果实现允许使用对本地有意义的名称形式为发起方创建 SPD 条目,这属于本地事项。
  • 包含名称的 SPD 条目,只有在该名称解析为本地或远端 IP 地址,或者该名称在 IKE 协商期间用于匹配 ID 载荷时,才能被使用。