手动 SA

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

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

注意

必须在已正确设置 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
    权重 FWPM_WEIGHT_RANGE_IKE_EXEMPTIONS

at 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
    权重 FWPM_WEIGHT_RANGE_IKE_EXEMPTIONS

设置入站和出站安全关联

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

示例代码:手动 SA 密钥

内置标注标识符

筛选层标识符

FWPM_ACTION0