手动 SA

手动安全关联 (SA) IPsec 策略方案允许调用方通过直接指定 IPsec SA 来保护任何网络流量,绕过内置 IPsec 密钥模块 (IKE 和 AuthIP) 。

可能的手动 SA 方案的一个示例是“添加 IPsec SA 对,以使用 IPsec 传输模式保护 IP 地址 1.1.1.1 & 2.2(ICMP 除外)之间的所有单播数据流量。

注意

必须在 IP 地址设置得当的两台计算机上执行以下步骤。

若要以编程方式实现此示例,请使用以下 WFP 配置。

FWPM_LAYER_INBOUND_TRANSPORT_V{4|6} 设置每个数据包的入站筛选规则

  1. 添加具有以下属性的筛选器。

    Filter 属性
    FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE 筛选条件 NlatUnicast
    FWPM_CONDITION_IP_LOCAL_ADDRESS 相应的本地地址 (1.1.1.1 或 2.2.2.2) 。
    FWPM_CONDITION_IP_REMOTE_ADDRESS 相应的远程地址 (1.1.1.1 或 2.2.2.2) 。
    action.type FWP_ACTION_CALLOUT_TERMINATING
    action.calloutKey FWPM_CALLOUT_IPSEC_INBOUND_TRANSPORT_V{4|6}
  2. 通过添加具有以下属性的筛选器,从 IPsec 中免除 ICMP 流量。

    Filter 属性
    FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE 筛选条件 NlatUnicast
    FWPM_CONDITION_IP_PROTOCOL 筛选条件 **IPPROTO_ICMP{V6}**这些常量在 winsock2.h 中定义。
    action.type FWP_ACTION_PERMIT
    weight FWPM_WEIGHT_RANGE_IKE_EXEMPTIONS

FWPM_LAYER_OUTBOUND_TRANSPORT_V{4|6} 设置出站每数据包筛选规则

  1. 添加具有以下属性的筛选器。

    Filter 属性
    FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE 筛选条件 NlatUnicast
    FWPM_CONDITION_IP_LOCAL_ADDRESS 筛选条件 相应的本地地址 (1.1.1.1 或 2.2.2.2) 。
    FWPM_CONDITION_IP_REMOTE_ADDRESS 筛选条件 相应的远程地址 (1.1.1.1 或 2.2.2.2) 。
    action.type FWP_ACTION_CALLOUT_TERMINATING
    action.calloutKey FWPM_CALLOUT_IPSEC_OUTBOUND_TRANSPORT_V{4|6}
  2. 通过添加具有以下属性的筛选器,从 IPsec 中免除 ICMP 流量。

    Filter 属性
    FWPM_CONDITION_IP_LOCAL_ADDRESS_TYPE 筛选条件 NlatUnicast
    FWPM_CONDITION_IP_PROTOCOL 筛选条件 **IPPROTO_ICMP{V6}**这些常量在 winsock2.h 中定义。
    action.type FWP_ACTION_PERMIT
    weight FWPM_WEIGHT_RANGE_IKE_EXEMPTIONS

设置入站和出站安全关联

  1. 调用 IPsecSaContextCreate0,其 outboundTraffic 参数包含 IP 地址为 1.1.1.1 & 2.2.2, ipsecFilterId 作为上面添加的出站传输层 IPsec 标注筛选器的 LUID。
  2. 调用 IPsecSaContextGetSpi0,其 id 参数包含从 IPsecSaContextCreate0 返回的上下文 ID,将包含 IP 地址的 getSpi 参数作为 1.1.1.1 & 2.2.2, ipsecFilterId 作为上面添加的入站传输层 IPsec 标注筛选器的 LUID。 返回的 SPI 值旨在由本地计算机用作入站 SA SPI,由相应的远程计算机用作出站 SA SPI。 这两台计算机必须使用一些带外方法来交换 SPI 值。
  3. 调用 IPsecSaContextAddInbound0,其 id 参数包含从 IPsecSaContextCreate0 返回的上下文 ID,以及描述入站 SA 捆绑 (的属性的 inboundBundle 参数,例如入站 SA SPI、转换类型、算法类型、密钥等) 。
  4. 调用 IPsecSaContextAddOutbound0,其中 id 参数包含从 IPsecSaContextCreate0 返回的上下文 ID,以及描述出站 SA 捆绑 (的属性的 outboundBundle 参数,例如出站 SA SPI、转换类型、算法类型、密钥等) 。

示例代码:手动 SA 密钥控制

内置标注标识符

筛选层标识符

FWPM_ACTION0