3.15. Configuration Payload (配置载荷)
3.15. Configuration Payload (配置载荷)
Configuration payload 在本文件中记为 CP, 用于在 IKE 对等方之间交换配置信息. 该交换供 IRAC 向 IRAS 请求内部 IP 地址, 并交换若 IRAC 直接连接在局域网上时本可通过 Dynamic Host Configuration Protocol (DHCP) 获得的其他信息.
Configuration payload 定义如下:
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Payload |C| RESERVED | Payload Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CFG Type | RESERVED |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ Configuration Attributes ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 22: Configuration payload 格式
Configuration payload 的载荷类型为四十七 (47).
- CFG Type (1 个八位组) - Configuration Attributes 所表示的交换类型. 下表取值仅截至 RFC 4306 发布之日有效. 此后可能已有其他取值被加入. 读者应查阅
[IKEV2IANA]获取最新取值.
| CFG Type | 取值 |
|---|---|
| CFG_REQUEST | 1 |
| CFG_REPLY | 2 |
| CFG_SET | 3 |
| CFG_ACK | 4 |
-
RESERVED (3 个八位组) - 必须发送为零; 必须在接收时忽略.
-
Configuration Attributes (可变长度) - 专属于 Configuration payload 的 type-length-value (TLV) 结构, 定义见下. 本载荷中可有零个或多个 Configuration Attribute.
3.15.1. Configuration Attributes (配置属性)
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R| Attribute Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ Value ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 23: Configuration attribute 格式
-
Reserved (1 位) - 该位必须置零且必须在接收时忽略.
-
Attribute Type (15 位) - 各 Configuration Attribute Type 的唯一标识.
-
Length (2 个八位组, 无符号整数) - 值的八位组长度.
-
Value (零个或多个八位组) - 本 Configuration Attribute 的可变长度值. 下列为属性类型.
下表取值仅截至 RFC 4306 发布之日有效 (INTERNAL_ADDRESS_EXPIRY 与 INTERNAL_IP6_NBNS 已由 RFC 5996 移除除外). 此后可能已有其他取值被加入. 读者应查阅 [IKEV2IANA] 获取最新取值.
| Attribute Type | 取值 | 多值 | 长度 |
|---|---|---|---|
| INTERNAL_IP4_ADDRESS | 1 | YES* | 0 或 4 个八位组 |
| INTERNAL_IP4_NETMASK | 2 | NO | 0 或 4 个八位组 |
| INTERNAL_IP4_DNS | 3 | YES | 0 或 4 个八位组 |
| INTERNAL_IP4_NBNS | 4 | YES | 0 或 4 个八位组 |
| INTERNAL_IP4_DHCP | 6 | YES | 0 或 4 个八位组 |
| APPLICATION_VERSION | 7 | NO | 0 或更多 |
| INTERNAL_IP6_ADDRESS | 8 | YES* | 0 或 17 个八位组 |
| INTERNAL_IP6_DNS | 10 | YES | 0 或 16 个八位组 |
| INTERNAL_IP6_DHCP | 12 | YES | 0 或 16 个八位组 |
| INTERNAL_IP4_SUBNET | 13 | YES | 0 或 8 个八位组 |
| SUPPORTED_ATTRIBUTES | 14 | NO | 2 的倍数 |
| INTERNAL_IP6_SUBNET | 15 | YES | 17 个八位组 |
* 这些属性仅当请求了多个值时, 响应中才可以为多值.
-
INTERNAL_IP4_ADDRESS, INTERNAL_IP6_ADDRESS - 内部网络上的地址, 有时称为红节点地址或私有地址, 也可以是互联网上的私有地址. 在请求消息中, 所给地址为请求的地址 (若未请求特定地址则为零长度). 若请求特定地址, 通常表示先前连接曾使用该地址, 请求方希望复用. 对 IPv6, 请求方可以提供希望使用的低序地址八位组. 可以通过请求多个内部地址属性来请求多个内部地址. 响应方最多只能发送与请求数量相当的地址. INTERNAL_IP6_ADDRESS 由两个字段组成: 第一个为 16 八位组 IPv6 地址, 第二个为
[ADDRIPV6]定义的一八位组前缀长度. 只要请求该地址的 IKE SA (或其重密钥后继) 有效, 所请求地址即有效. 详见第 3.15.3 节. -
INTERNAL_IP4_NETMASK - 内部网络的子网掩码. 请求与响应消息中只允许一个子网掩码 (例如 255.255.255.0), 且必须仅与 INTERNAL_IP4_ADDRESS 属性一起使用. CFG_REPLY 中的 INTERNAL_IP4_NETMASK 含义大致与包含相同信息的 INTERNAL_IP4_SUBNET (“将发往这些地址的流量经我转发”) 相同, 但还隐含链路边界. 例如, 客户端可用自身地址与子网掩码计算链路广播地址. 可在 CFG_REQUEST 中包含空的 INTERNAL_IP4_NETMASK 属性以请求该信息 (尽管网关即使未被请求也可能发送). CFG_REQUEST 中本属性的非空取值没有意义, 因此绝对不能包含.
-
INTERNAL_IP4_DNS, INTERNAL_IP6_DNS - 指定网络内 DNS 服务器的地址. 可以请求多个 DNS 服务器. 响应方可以响应零个或多个 DNS 服务器属性.
-
INTERNAL_IP4_NBNS - 指定网络内 NetBios Name Server (WINS) 的地址. 可以请求多个 NBNS 服务器. 响应方可以响应零个或多个 NBNS 服务器属性.
-
INTERNAL_IP4_DHCP, INTERNAL_IP6_DHCP - 指示主机将任何内部 DHCP 请求发送到属性内所含地址. 可以请求多个 DHCP 服务器. 响应方可以响应零个或多个 DHCP 服务器属性.
-
APPLICATION_VERSION - IPsec 主机的版本或应用信息. 为可打印 ASCII 字符串, 不以 null 结尾.
-
INTERNAL_IP4_SUBNET - 该边缘设备所保护的受保护子网. 本属性由两个字段组成: 第一个为 IP 地址, 第二个为子网掩码. 可以请求多个子网. 响应方可以响应零个或多个子网属性. 详见第 3.15.2 节.
-
SUPPORTED_ATTRIBUTES - 在 Request 中使用时, 本属性必须为零长度, 表示查询响应方支持的所有属性. 响应包含一个属性, 其中为若干各占 2 八位组的属性标识符集合. 长度除以 2 (八位组) 即为响应中所含支持属性数量.
-
INTERNAL_IP6_SUBNET - 该边缘设备所保护的受保护子网. 本属性由两个字段组成: 第一个为 16 八位组 IPv6 地址, 第二个为
[ADDRIPV6]定义的一八位组前缀长度. 可以请求多个子网. 响应方可以响应零个或多个子网属性. 详见第 3.15.2 节.
注意, 本文档不建议实现如何确定响应中应发送何种信息的具体方法, 即不建议 IRAS 向请求 IRAC 返回哪个 DNS 服务器的特定做法.
CFG_REQUEST 与 CFG_REPLY 对允许 IKE 端点向其对等方请求信息. 若 CFG_REQUEST Configuration payload 中某属性非零长度, 则视为对该属性的建议. CFG_REPLY Configuration payload 可以返回该值或新值, 也可以添加新属性并省略某些被请求的属性. 无法识别或不支持的属性在请求与响应中均必须忽略.
CFG_SET 与 CFG_ACK 对允许 IKE 端点向对等方推送配置数据. 此时 CFG_SET Configuration payload 包含发起方希望对等方修改的属性. 若响应方接受了任何配置数据, 必须返回 Configuration payload, 且其中必须包含响应方已接受且数据为零长度的属性. 未接受的属性不得出现在 CFG_ACK Configuration payload 中. 若未接受任何属性, 响应方必须返回空的 CFG_ACK payload, 或返回不含 CFG_ACK payload 的响应消息. 当前对 CFG_SET/CFG_ACK 交换尚无定义用途, 但可能结合基于 Vendor ID 的扩展使用. 符合本规范的实现可以忽略 CFG_SET payload.
3.15.2. INTERNAL_IP4_SUBNET 与 INTERNAL_IP6_SUBNET 的含义
INTERNAL_IP4/6_SUBNET 属性可指示额外子网, 即需要通过通告这些属性的网关到达且可能需要一个或多个独立 SA 的子网. INTERNAL_IP4/6_SUBNET 属性也可表达网关关于哪些流量应经网关转发的策略; 客户端可选择其他流量 (由 TSr 覆盖但不在 INTERNAL_IP4/6_SUBNET 中) 是经网关还是直达目的地. 因此, 发往 INTERNAL_IP4/6_SUBNET 所列地址的流量应经通告这些属性的网关发送. 若不存在其 Traffic Selector 覆盖该地址的既有子 SA, 需要创建新 SA.
例如, 若有两个子网 198.51.100.0/26 与 192.0.2.0/24, 且客户端请求包含:
CP(CFG_REQUEST) =
INTERNAL_IP4_ADDRESS()
TSi = (0, 0-65535, 0.0.0.0-255.255.255.255)
TSr = (0, 0-65535, 0.0.0.0-255.255.255.255)
则有效响应可以是 (其中 TSr 与 INTERNAL_IP4_SUBNET 信息相同):
CP(CFG_REPLY) =
INTERNAL_IP4_ADDRESS(198.51.100.234)
INTERNAL_IP4_SUBNET(198.51.100.0/255.255.255.192)
INTERNAL_IP4_SUBNET(192.0.2.0/255.255.255.0)
TSi = (0, 0-65535, 198.51.100.234-198.51.100.234)
TSr = ((0, 0-65535, 198.51.100.0-198.51.100.63),
(0, 0-65535, 192.0.2.0-192.0.2.255))
这些情况下 INTERNAL_IP4_SUBNET 并不真正携带有用信息.
另一种可能的响应为:
CP(CFG_REPLY) =
INTERNAL_IP4_ADDRESS(198.51.100.234)
INTERNAL_IP4_SUBNET(198.51.100.0/255.255.255.192)
INTERNAL_IP4_SUBNET(192.0.2.0/255.255.255.0)
TSi = (0, 0-65535, 198.51.100.234-198.51.100.234)
TSr = (0, 0-65535, 0.0.0.0-255.255.255.255)
该响应表示客户端可将所有流量经网关发送, 但网关不介意客户端将 INTERNAL_IP4_SUBNET 未涵盖的流量直接发往目的地 (不经网关).
若网关策略要求两个子网的流量分别在不同 SA 中承载, 则如下响应向客户端表明: 若要访问第二子网, 需另建 SA:
CP(CFG_REPLY) =
INTERNAL_IP4_ADDRESS(198.51.100.234)
INTERNAL_IP4_SUBNET(198.51.100.0/255.255.255.192)
INTERNAL_IP4_SUBNET(192.0.2.0/255.255.255.0)
TSi = (0, 0-65535, 198.51.100.234-198.51.100.234)
TSr = (0, 0-65535, 198.51.100.0-198.51.100.63)
若客户端的 TSr 仅包含部分地址空间, INTERNAL_IP4_SUBNET 也有用. 例如客户端请求:
CP(CFG_REQUEST) =
INTERNAL_IP4_ADDRESS()
TSi = (0, 0-65535, 0.0.0.0-255.255.255.255)
TSr = (0, 0-65535, 192.0.2.155-192.0.2.155)
网关响应可能为:
CP(CFG_REPLY) =
INTERNAL_IP4_ADDRESS(198.51.100.234)
INTERNAL_IP4_SUBNET(198.51.100.0/255.255.255.192)
INTERNAL_IP4_SUBNET(192.0.2.0/255.255.255.0)
TSi = (0, 0-65535, 198.51.100.234-198.51.100.234)
TSr = (0, 0-65535, 192.0.2.155-192.0.2.155)
因在 CFG_REQUEST 中 INTERNAL_IP4_SUBNET/INTERNAL_IP6_SUBNET 的含义不明确, 无法在 CFG_REQUEST 中可靠使用.
3.15.3. IPv6 的 Configuration payload
IPv6 的 Configuration payload 以对应 IPv4 载荷为基础, 并不完全遵循 “IPv6 常规做法”. 特别地, 不使用 IPv6 无状态自动配置或路由器通告消息, 也不使用邻居发现. 另有文档讨论 IKEv2 中的 IPv6 配置 [IPV6CONFIG]. 目前为实验性文档, 但希望随着实现经验积累, 能获得与本文档同等的标准地位.
客户端可使用 INTERNAL_IP6_ADDRESS Configuration payload 分配 IPv6 地址. 最小交换可能如下:
CP(CFG_REQUEST) =
INTERNAL_IP6_ADDRESS()
INTERNAL_IP6_DNS()
TSi = (0, 0-65535, :: - FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF)
TSr = (0, 0-65535, :: - FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF)
CP(CFG_REPLY) =
INTERNAL_IP6_ADDRESS(2001:DB8:0:1:2:3:4:5/64)
INTERNAL_IP6_DNS(2001:DB8:99:88:77:66:55:44)
TSi = (0, 0-65535, 2001:DB8:0:1:2:3:4:5 - 2001:DB8:0:1:2:3:4:5)
TSr = (0, 0-65535, :: - FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF)
客户端可以在 CFG_REQUEST 中发送非空 INTERNAL_IP6_ADDRESS 属性以请求特定地址或接口标识符. 网关首先检查所给地址是否可接受, 若可则返回该地址. 若地址不可接受, 网关尝试将接口标识符与其他前缀组合; 若仍失败, 网关另选接口标识符.
INTERNAL_IP6_ADDRESS 属性还包含前缀长度字段. 在 CFG_REPLY 中使用时, 对应 IPv4 情形下的 INTERNAL_IP4_NETMASK 属性.
尽管该 IPv6 地址配置方式相当简单, 仍有局限. 使用 IKEv2 配置的 IPsec 隧道在 IPv6 寻址体系结构意义 [ADDRIPV6] 上并非功能完备的 “接口”. 特别地, 它们未必具备链路本地地址, 这可能使依赖链路本地的协议 (如 [MLDV2]) 使用复杂化.
3.15.4. 地址分配失败
若响应方在处理 Configuration payload 时为发起方分配 IP 地址时出错, 则响应 INTERNAL_ADDRESS_FAILURE 通知. 即使因子 SA 无法建立而导致初始子 SA 创建失败, IKE SA 仍会创建. 若该错误在 IKE_AUTH 交换内产生, 不会创建子 SA. 但还存在更复杂的错误情形.
若响应方完全不支持 Configuration payload, 可忽略所有 Configuration payload. 此类实现从不发送 INTERNAL_ADDRESS_FAILURE 通知.
若发起方要求必须分配 IP 地址, 则将不含 CFG_REPLY 的响应视为错误.
发起方可能请求响应方不支持的某类地址 (IPv4 或 IPv6), 尽管响应方支持 Configuration payload. 此时响应方忽略不支持的地址类型, 照常处理请求的其余部分.
若发起方请求多个响应方支持的某类地址, 且部分 (非全部) 请求失败, 响应方仅回复成功分配的地址. 仅当完全无法分配任何地址时才发送 INTERNAL_ADDRESS_FAILURE.
若发起方按策略未收到所需 IP 地址, 可以保持 IKE SA 并在适当超时后于单独 INFORMATIONAL 交换中重试 Configuration payload, 也可以在单独 INFORMATIONAL 交换中发送 Delete payload 拆除 IKE SA 并在超时后从头重试 IKE SA. 此类超时不宜过短 (尤其从头启动 IKE SA 时), 因为这些错误可能无法迅速修复; 超时可能应为数分钟. 例如, 响应方地址池耗尽可能仅在其他客户端断开使地址归还池或响应方扩大地址池后才会缓解.