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)。
过程:
- 用于匹配此字段的名称在 IKE 协商期间通过 ID 载荷传送。
- 发起方的源 IP 地址(隧道模式下的内层 IP 头)被绑定到由 IKE 协商所创建的 SAD 条目中的远端 IP 地址。
- 当 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 载荷时,才能被使用。