4.4.1.1. 选择器 (Selectors)
SA 可以是细粒度或粗粒度的,这取决于用于定义 SA 流量集的选择器。例如,两个主机之间的所有流量可以通过单个 SA 承载,并提供统一的安全服务集。或者,一对主机之间的流量可能分布在多个 SA 上,具体取决于所使用的应用程序(由下一层协议和相关字段(例如端口)定义),不同的 SA 提供不同的安全服务。同样,一对安全网关之间的所有流量可以在单个 SA 上承载,或者可以为每个通信主机对分配一个 SA。
所有 IPsec 实现必须 (MUST) 支持以下选择器参数,以便于控制 SA 粒度。请注意,本地和远程地址应该是 IPv4 或 IPv6,但不能混合地址类型。还要注意,本地/远程端口选择器(以及 ICMP 消息类型和代码、移动性头部类型)可能被标记为 OPAQUE,以适应由于数据包分段而无法访问这些字段的情况。
远程 IP 地址 (Remote IP Address(es))
类型: IPv4 或 IPv6
这是 IP 地址范围的列表(单播、广播(仅 IPv4))。此结构允许表达:
- 单个 IP 地址(通过平凡范围)
- 地址列表(每个都是平凡范围)
- 地址范围(低值和高值,包含边界)
- 范围列表
地址范围用于支持共享同一 SA 的多个远程系统,例如,在安全网关后面。
本地 IP 地址 (Local IP Address(es))
类型: IPv4 或 IPv6
这是 IP 地址范围的列表(单播、广播(仅 IPv4))。此结构允许表达:
- 单个 IP 地址(通过平凡范围)
- 地址列表(每个都是平凡范围)
- 地址范围(低值和高值,包含边界)
- 范围列表
地址范围用于支持共享同一 SA 的多个源系统,例如,在安全网关后面。本地是指此实现(或策略条目)保护的地址。
注意: SPD 不包括对多播地址条目的支持。要支持多播 SA,实现应使用 [RFC3740] 中定义的组 SPD (Group SPD, GSPD)。GSPD 条目需要不同的结构,即不能在多播环境中使用与单播 SA 的本地和远程地址值相关联的对称关系。具体来说,在 SA 上定向到多播地址的出站流量不会在具有多播地址作为源的伴随入站 SA 上接收。
下一层协议 (Next Layer Protocol)
来源: IPv4 "协议" 字段或 IPv6 "下一个头部" 字段
值: 单个协议编号、ANY 或(仅 IPv6)OPAQUE
下一层协议是存在的任何 IP 扩展头部之后的内容。为了简化定位下一层协议,应该 (SHOULD) 有一种机制来配置要跳过哪些 IPv6 扩展头部。
默认要跳过的 IPv6 扩展头部:
- 0 (逐跳选项 Hop-by-hop options)
- 43 (路由头部 Routing Header)
- 44 (分段头部 Fragmentation Header)
- 60 (目标选项 Destination Options)
注意: 默认列表不包括 51 (AH) 或 50 (ESP)。从选择器查找的角度来看,IPsec 将 AH 和 ESP 视为下一层协议。
依赖于下一层协议的选择器
几个额外的选择器取决于下一层协议值:
端口 (Ports - TCP, UDP, SCTP 等)
如果下一层协议使用两个端口(如 TCP、UDP、SCTP 和其他协议),则存在本地端口和远程端口的选择器。这些选择器中的每一个都有值范围列表。
重要: 在接收到分段数据包或端口字段已受到 IPsec 保护(加密)的情况下,本地端口和远程端口可能不可用; 因此,也必须 (MUST) 支持 OPAQUE 值。
分段处理:
- 在非初始分段中,端口值将不可用。
- 如果端口选择器指定了除 ANY 或 OPAQUE 之外的值,则它不能匹配非初始分段的数据包。
- 如果 SA 需要除 ANY 或 OPAQUE 之外的端口值,则必须 (MUST) 丢弃没有端口的到达分段。(参见第 7 节"处理分段")
移动性头部类型 (Mobility Header Type)
如果下一层协议是移动性头部 (Mobility Header),则存在 IPv6 移动性头部消息类型 (MH type) 的选择器。这是一个 8 位值,用于标识特定的移动性消息。
注意: 在接收到分段数据包的情况下,MH 类型可能不可用。(参见第 7 节"处理分段")
对于 IKE: IPv6 移动性头部消息类型 (MH type) 放置在 16 位本地"端口"选择器的最高有效八位中。
ICMP 类型和代码 (ICMP Type and Code)
如果下一层协议值是 ICMP,则存在用于 ICMP 消息类型和代码的 16 位选择器。
结构:
- 消息类型 (Message Type): 定义 ICMP 消息类型的单个 8 位值,或 ANY
- ICMP 代码 (ICMP Code): 定义 ICMP 消息的特定子类型的单个 8 位值
对于 IKE:
- 消息类型放置在 16 位选择器的最高有效 8 位中
- 代码放置在最低有效 8 位中
允许的组合:
- 单个类型和代码范围
- 单个类型和 ANY 代码
- ANY 类型和 ANY 代码
匹配算法: 给定具有类型范围 (T-start 到 T-end) 和代码范围 (C-start 到 C-end) 的策略条目,以及具有类型 t 和代码 c 的 ICMP 数据包,实现必须 (MUST) 使用以下方式测试匹配:
(T-start*256) + C-start <= (t*256) + c <= (T-end*256) + C-end
注意: 在接收到分段数据包的情况下,ICMP 消息类型和代码可能不可用。(参见第 7 节"处理分段")
名称 (Name)
重要: 这不是像上面其他选择器那样的选择器。它不是从数据包中获取的。名称可以用作 IPsec 本地或远程地址的符号标识符。
命名 SPD 条目以两种方式使用:
用例 1: 响应方(路由勇士的访问控制)
命名 SPD 条目由响应方(而非发起方)使用,在 IP 地址不适合用作远程 IP 地址选择器时(例如,对于"路由勇士"(road warriors))支持访问控制。
过程:
- 用于匹配此字段的名称在 IKE 协商期间在 ID 载荷中传递。
- 发起方的源 IP 地址(隧道模式下的内部 IP 头部)绑定到由 IKE 协商创建的 SAD 条目中的远程 IP 地址。
- 当以这种方式选择 SPD 条目时,此地址会覆盖 SPD 中的远程 IP 地址值。
要求: 所有 IPsec 实现必须 (MUST) 支持这种名称使用方式。
支持的名称形式:
- 完全限定域名 (Fully Qualified Domain Name, FQDN)
- 可分辨名称 (Distinguished Name, DN)
- RFC 822 电子邮件地址
- 密钥 ID (Key ID)
用例 2: 发起方(多用户标识)
命名 SPD 条目可由发起方用于标识将为其创建 IPsec SA 的用户(或可以为其绕过流量的用户)。发起方的 IP 源地址(来自隧道模式下的内部 IP 头部)用于在创建时替换以下内容:
- SPD 缓存条目中的本地地址
- 出站 SAD 条目中的本地地址
- 入站 SAD 条目中的远程地址
支持: 此用法对于多用户原生主机实现是可选的,不适用于其他实现。
注意: 此名称仅在本地使用; 它不由密钥管理协议传递。此外,除了上述用于情况 1(响应方)的名称形式之外的名称形式也适用于发起方环境。
SPD 条目中的名称
SPD 条目可以同时包含名称(或名称列表)以及本地或远程 IP 地址的值。
对于情况 1(响应方): 命名 SPD 条目中使用的标识符是 DNS 名称、可分辨名称或 RFC 822 电子邮件地址。
对于情况 2(发起方): 名称形式可以与情况 1 相同,或者可以是用户 ID (UID) 或其他本地命名约定。
重要命名规则:
- 所有 SPD 条目必须 (MUST) 能够容纳上面为响应方使用定义的名称形式。
- 如果实现允许使用本地有效的名称形式创建用于发起方使用的 SPD 条目,这是本地事项。
- 包含名称的 SPD 条目只有在名称解析为本地或远程 IP 地址,或者在 IKE 协商期间使用名称来匹配 ID 载荷时才能使用。