1、5. IP Traffic Processing5.1. Outbound IP Traffic Processing (protected-to-unprotected)Figure 2. Processing Model for Outbound TrafficIPsec MUST 按以下步骤来处理出方向的包:Step 1.当包从保护区接口进来,调用 SPD 选择功能来获得 SPD-ID,用这个 SPD-ID 来选择合适的 SPD。 (如果设备只需用一个 SPD,那该步可以忽略)Step 2.用该包的头来匹配从第一步中得到的 SPD 的缓存。注意这个缓存包含了 SPD-O 和SPD-S 中
2、的记录。Step 3.a.如果匹配上,用匹配上的缓存记录来确定该包是要被透传、丢弃或是被 AH/ESP 保护。如果 IPsec 处理应用后,就会产生一个从 SPD 缓存记录到 SAD 缓存记录的链接(用于指定模式、加密算法、密钥、SPI、PMTU 等) ,注意 SA PMTU 值,和分配状态检查标志位(出方向包的 IP 头中的 DF 位)来决定是要在 IPsec 处理前分片还是处理后分片,或者必须丢弃掉用 ICMP PMTU 消息发送。b.如果没有找到匹配的缓存,则查找 SPD-ID 指定的 SPD(SPD-S 和 SPD-O 部分) 。如果 SPD记录说是要透传或是丢弃,那么就创建一个或多个
3、新的出方向 SPD 缓存记录;如果 SPD 记录说是要保护,也就是说要创建一个 SA,那么就要用密钥管理机制(如 IKEv2)来生产一个 SA,如果 SA 成功生成,就创建一条新的出方向(SPD-S)缓存记录以及出方向和入方向的SAD 记录;如果不能成功生成 SA,就丢弃这个包。Step 4.这个包被传送到出口转发功能,来选择包要出去的接口。这个功能也许会使这个包被传回到 IPsec 边界,进行另外的 IPsec 处理,比如说支持嵌套 SAs。如果是这样,MUST在 SPD-I 数据库中有一条记录,允许入方向透传这个包,否则这个包将被丢弃。5.1.1. Handling an Outbound
4、 Packet That Must Be Discarded如果出方向的包要被丢弃,那么 SHOULD 有能力产生并发生一个 ICMP 消息给发生方,来表明这个包已被丢弃。丢弃原因需要记录在审计日志里。审计日志应该包括原因、当前时间/日期、包中的选择器值。The type and code of the ICMP 的设定如下:a.与包的选择器匹配上的 SPD 要求丢弃这个包时:IPv4 Type = 3 (destination unreachable) Code = 13(Communication Administratively Prohibited)IPv6 Type = 1 (des
5、tination unreachable) Code = 1(Communication with destination administrativelyprohibited)b1.IPsec 系统成功到达对端,但是无法协商出 SPD 记录所需的 SA 来与包进行匹配时:IPv4 Type = 3 (destination unreachable) Code = 13(Communication Administratively Prohibited)IPv6 Type = 1 (destination unreachable) Code = 1(Communication with des
6、tination administrativelyprohibited)b2.由于无法联系到交换中的另一端 IPsec 对等体,而导致 IPsec 系统无能建立 SPD 所需的SA 来匹配这个包时:IPv4 Type = 3 (destination unreachable) Code = 1 (hostunreachable)IPv6 Type = 1 (destination unreachable) Code = 3 (addressunreachable)注意当安全网关后的攻击者模仿从源地址 W.X.Y.Z 发包给 IPsec 实体,导致 IPsec 实体给真正的 W.X.Y.Z 发送
7、 ICMP 消息。这样就创建了一个机会,使得网关后的主机间受到 denial of service (DoS)攻击,所以,安全网关 SHOULD 有一个管理控制来允许管理员配置在这种情况下 IPsec implementation 是否发送 ICMP 消息,如果这个机制被选择,就会大大限制这种ICMP 响应的传输。5.2. Processing Inbound IP Traffic (unprotected-to-protected)入方向的 SPD 缓存(SPD-I)只用于透传或丢弃传输量。如果从非保护区接口来的包是IPsec 分片,要在 IPsec 处理前重新组装。(*) = 缓存在这里。
8、如果没有命中缓存,那么就检查 SPD。如果没有命中缓存不要求实现缓存这个包。(*) =这个处理包括用这个包的 SPI 等,在 SAD 中查找 SA,形成了一个入方向包的SPD 缓存。见下面的 step 3a。(*) = step4 中涉及到的 SAD 检查。在 AH 或 ESP 处理前,任何通过非保护区接口的 IP 分片都要被重新组装(by IP) 。IPsec 处理将被应用于每个入方向的 IP 数据报,它被 IP Next Protocol 域中的 AH 或 ESP 值(或 IPv6上下文中把 AH 或 ESP 当做一个 next layer protocol)来标识。IPsec 必须按以下
9、步骤执行:1. 当一个包到达时,如果有必要支持多重 SPD 和 SPD-I 缓存关联,这个包可能会被它所到达的接口(physical or virtual)的 ID 打上标签, 。(The interface ID is mapped to a corresponding SPD-ID.)2. 这个包被检测并分离成下面两类中的一种:- 如果这个包是要被 IPsec 保护的并且是发送给这台设备的,尝试通过 SAD 把它映射到一个活跃的 SA。注意这台设备可能会有多重 IP 地址,这些地址将被用于 SAD 的查找,如,在 SCTP 协议的情况下。- 如果通信量不是发送到这台设备的,或者是发送给这台
10、设备的但是不是 AH 或ESP,直接进行 SPD-I 的查找。 (这暗示了 IKE 流量 MUST 在 SPD 有一个明确的 BYPASS 记录。)如果用多重 SPD,把第一步中的标签分配给这个包用于选择合适的 SPD-I(和缓存)用来查找。SPD-I 的查找决定了这个包是要被丢弃或是透传。3a. 如果这个包要发送到 IPsec 设备,并且指定 AH 或 ESP 为协议,这个包在 SAD 中被查找。对于单播通信量,只用 SPD(或 SPD+协议) ,对于组播通信量,用 SPI+目的地址或 SPI+目的地址和源地址,如 4.1 节描述。如果没有匹配的,就丢弃。这是一个审计事件,这个事件的审计日志
11、 SHOULD 包含当前时间/ 日期,SPI,包的源和目的地址,IPsec 协议,和其他这个包中可用的选择器值。如果包在 SAD 中找到就按步骤 4 中描述进行处理。3b. 如果这个包不是发送到这台设备或是是发送到这台设备但是不是 AH 或 ESP,在(合适的)SPD-I 缓存中查找这个包的头。如果匹配上,这个包被丢弃或透传。如果没有缓存匹配,在 corresponding SPD-I 中查找这个包,并且创建一条适当的缓存记录。 (这种方式,接收到一个需要 IPsec 保护的包也不会创建 SA,只能创建透传或丢弃缓存记录。 )如果没有匹配,丢弃这个通信量。这是一个审计时间,应该记录当前时间或日
12、期,可用的 SPI,可用的IPsec 协议,包的源和目的地址,和其他这个包中可用的选择器值。3c. 处理 ICMP 消息假定发生在 IPsec 边界的非保护端。非保护 ICMP 消息被检查,并且本地策略被应用于决定是否接收或拒绝这些消息,如果接收作为结果采用什么行动。如,如果一个不可达 ICMP 消息被接收,这个实现必须决定是否在其上采取行动或拒绝他,或有约束的行动。 (See Section 6)4. 使用指定的 AH 或 ESP,用 step 3a 中选择的 SAD 记录。然后用这个包和 SAD 记录指定的入方向选择器匹配,来验证这个接收到的包适用于这个 SA,通过这个 SA 这个包被接收
13、。5. 如果一个 IPsec 系统接收到一个 SA 上的入方向的包,这个包头域与 SA 选择器不一致,必须丢弃这个包。这是一个审计时间,审计日志中需要记录当前时间,SPI,IPsec 协议,包的源和目的地址,包中可用的任何其他选择器,和有关的 SAD 记录中的悬着器值。系统应该可用生成或发送一个 IKE 通知 INVALID_SELECTORS 给发生者( IPsec peer)这个接收到的包被丢弃的原因是没有通过选择器检查。为了将 DoS 攻击或 mis-configured peer 减到最少,IPsec 系统应该包含一个管理控制功能来允许管理员配置 IPsec 实现发送或不发送 IKE
14、通知,如果这个机制被选择就会限制传输这样的通知。通信量被透传或通过 IPsec 处理后,要被入方向转发功能的处理。这个功能可能会导致这个包发送到 IPsec 边界再做一次入方向 IPsec 处理。如支持嵌套 SA 的情况就是这样。然后就像所有出方向流量一样如果要被透传,这个包必须与 SPD-O 记录匹配。最终这个包会被转发到目的主机或 process for disposition。6. ICMP Processing有两种 ICMP 传输:错误消息 error messages (e.g., type = destination unreachable)非错误消息 non-error mes
15、sages (e.g., type = echo)应该提供一个管理机制,允许管理员记录导致 ICMP 错误消息(selected, all, or none)的原因来帮助定位诊断问题。6.1. Processing ICMP Error Messages Directed to an IPsec Implementation6.1.1. ICMP Error Messages Received on the Unprotected Side of the BoundaryFigure 3 in Section 5.2 展示了一个明显的 IPsec 边界非保护端的 ICMP 处理模型,处理发送到
16、 IPsec 设备的 ICMP 消息(error or otherwise),这些消息没有经过 AH 或 ESP 的保护。这种 ICMP 消息是没有经过认证的,并且它的处理可能会导致拒绝或降低服务。所以建议忽略这种消息。然而,许多非源的 ICMP 消息将被主机或安全网关接收,如公网上的路由器。忽略这些 ICMP 消息会降低服务,如处理 PMTU 消息失败和重定向消息。因此仍然有接收ICMP 消息的动机。一个兼容的 IPsec 实现 MUST 允许一个本地管理员配置是要接收还是要拒绝非认证的 ICMP流量。这个控制必须是基于 ICMP type 或 ICMP code 和 ICMP type 的
17、。另外一个实现还应该机制和参数来处理这样的流量。如,可以有为通信量(on a per destination basis)建立最小PMTU 的能力用于阻止接收一个非认证 ICMP 不把 PMTU 设置为没有意义的大小。如果上述的 ICMP PMTU 消息通过了,并且被配置后的系统接收了,有两种可能。1.如果这个实现把分片应用在边界的密文一边(ciphertext side) ,那么这个被接收的 PMTU 信息被转发模块(outside of the IPsec implementation)通过,这个转发模块用于管理出方向的包分片。2.如果这个实现被配置为影响明文侧(plaintext sid
18、e)的分片,那么这个 PMTU 信息被传到明文一侧并且如 8.2 节描述进行处理。6.1.2. ICMP Error Messages Received on the Protected Side of the Boundary这些 ICMP 消息没有被认证,但他们确实是来自 IPsec 边界的保护端。主要的安全隐患是有一台被攻破的主机或路由器也许会发出错误的 ICMP 错误消息,这样也许会降低安全网关后其他设备的服务,或这会破坏机密性。如一个安全网关用了一个假冒的 ICMP 重定向,可能会导致保护端转发表被修改,从而吧流量发送到一个网关后不适当的目的。因此实现MUST 提供允许本地管理员限制
19、边界的保护端的 ICMP 错误消息的接收,指向这个 IPsec 实现。如 6.1.1 中的描述,非保护端也需要这样的控制。6.2. Processing Protected, Transit ICMP Error Messages当一个 ICMP 错误消息通过一个 SA 传输到 IPsec 实现后的一台设备上时,在访问控制的角度来看,这个载荷和这个 ICMP 消息头要被检查。IPsec 实现 MUST 可以配置检查载荷头信息是否和载荷所到达的 SA 一致。 (意思是这个载荷头,与源和目的地址、反转的端口域一起,匹配 SA 的传输选择器。 )不是所有上下文都需要这个检查,所以有必要让本地管理员来
20、配置是否实行这项检查。为了适应所有(both)策略,采用下面的规定:如果一个管理员想要允许 ICMP 错误消息不经过载荷检查就被一个 SA 携带,那么配置一个SPD 记录表明要携带这样的传输量。如果一个管理员想要 IPsec 来检查这个 ICMP 错误消息载荷的一致性,那么不创建任何 SPD条目来携带这样的机遇 ICMP 包头的交通量。这个规定促使了下面的处理。IPsec 发送者和接收者 MUST 支持如下 ICMP 错误消息的处理。这些消息是通过 SA 被接收或发送的。 如果一个与出方向 ICMP 错误消息适应的 SA 存在,那么这个消息被映射到这个 SA 并且只有 IP 和 ICMP 头被
21、检查,正如对其他流量一样。如果不存在与关于 ICMP 错误消息的传输选择器匹配的 SA,那么就查找 SPD 来决定是否要建立这样的一个 SA。如果建立了 SA,那么这个 ICMP 错误消息就通过这个 SA 进行传输。接收的时候,这个消息被接收者的常用的传输选择器的检查。如果一个 IPsec 实现接收一个 SA 上的 ICMP 错误消息,这个消息的 IP 和 ICMP 头不与这个SA 的传输选择器匹配,接收者 MUST 用特定的方式来处理这个接收到的消息。具体的,接收者必须从 ICMP 载荷中抽出这个触发包的头和反转域如上面描述的那样来决定是否这个包和接收到 ICMP 错误码的 SA 的选择器相
22、适应。如果这个包检查失败, IPsec 实现 MUST NOT 转发这个 ICMP 消息到目的地。这是一个审计事件。7. Handling Fragments (on the protected side of the IPsec boundary)这节描述一个实现怎样处理 IPsec 分界线保护端的出方向明文分片的处理。特别的,如下所述:o 把出方向 non-initial 分片映射到一个对的 SA 上。 (或者在对的 SPD 记录中查找)o 验证一个接收到的 non-initial 分片是否被接收它的 SA 认证。o 把出方向和入方向的 non-initial 分片映射到对的 SPD-O
23、或 SPD-I 记录上,或相应的缓存记录上,为了丢弃或透传流量。注:“non-trivial“被用来表示选择器的值为 OPAQUE 或 ANY 意外的值。注:“non-trivial“在这里被用于指明一个分片不包含访问控制可能需要的搜有选择器值。如4.4.1 节中所说,取决于 Next Layer Protocol,除了端口,ICMP 消息 type/code 或移动头类型可以被 non-initial 分片丢掉。同样的,对于 IPv6,尽管第一个分片可能不包含 Next Layer Protocol 或端口(or ICMP message type/code, or Mobility Hea
24、der type)这是由现有的扩展头号和种类决定的。如果一个 non-initial 分片包含了端口(or ICMP type and code or Mobility Header type)但是不包含 Next Layer Protocol,那么除非有一个 SPD 记录与 Local/Remote addresses 有关, With ANY for the Next Layer Protocol and Port (or ICMP type and code or Mobility Header type),这个分片不会包含所有访问控制所需的选择器信息。为了描述以上问题,定义了 3 种方
25、法:o 载有 initial 和 non-initial 分片的隧道模式 SA(See Section 7.1.)。o non-initial 分片各自的隧道模式 SA(See Section 7.2.)o 分片状态检查(See Section 7.3.)7.1. Tunnel Mode SAs that Carry Initial and Non-Initial Fragments多有的实现 MUST 支持隧道模式 SA,不考虑通过的传输量的 port field (or ICMP type/code or Mobility Header type)的值。如果这个 SA 携带的是指定协议的传
26、输量,这个 SA 选择器的设置必须指定 port fields (or ICMP type/code or Mobility Header type)为 ANY。这种形式的一个SA 将携带所有的传输量,包括 initial 和 non-initial 分片用于表示 Local/Remote addressesand specified Next Layer protocol(s)。如果 SA 携带传输量不考虑指定的协议值( i.e., ANY is specified)来作为(Next Layer)协议选择器值) ,那么这个端口域值就为么有定义的并且MUST 也被设为 ANY。 (As not
27、ed in 4.4.1, ANY includes OPAQUE as well as all specific values.)7.2. Separate Tunnel Mode SAs for Non-Initial Fragments一个实现也许支持隧道模式 SA,它只携带 non-initial 分片,把 non-initial 包和 initial 分片分开。用 OPAQUE 值来标识一个携带这种分片的 SA 的 port (or ICMP type/code or Mobility Header type) field selectors。接收者必须对 IPv4 (non-init
28、ial)分片执行一个最小偏移检查用于保护交叉分片攻击,当 SA 用这种类型的时候。因为这种检查不能在 IPv6 non-initial 分片上执行,为了安全起见,实现者也许会选择不在 IPv6 传输上支持这种 SA。同样的,一个这种SA 将携带所有的与一个特定的 Local/Remote address pair and protocol value 匹配的 non-initial 分片,换言之,这个 SA 上携带的分片属于没有分片的包,这些分片可能属于不同的SA 用于不同的安全。因此,建议用户和管理员用 ESP (with integrity)和“strongest“完整性和加密算法来保护这
29、个两个对等体间的通信流。特定的 port (or ICMP type/code or Mobility Header type) selector value 将被用于定义携带initial fragments 和 non-fragmented 包的 SA。这个可以被用于如果一个用户或管理员想要在同样的本地/对端地址间创建一个或多个隧道模式的 SA,相同的地址用 port (or ICMP type/code or Mobility Header type) fields 区别。这些 SA 必须有 non-trivial protocol selector values,否则要用上面的方法 1
30、.7.3. Stateful Fragment Checking实现将在一个传输模式 SA 上传输 non-initial 分片,用 non-trivial port (or ICMP type/code or MH type) selectors 必须通过 IKE NOTIFY NON_FIRST_FRAGMENTS_ALSO 载荷通知给一个对等体。接收者必须丢弃到达一个有 non-trivial port (or ICMP type/code or MH type) selector values 的 SA 的 non-initial 分片,除非这个特性已经被协商了。接收者也必须丢弃这样的
31、 non-initial 分片,它不符合应用于整个包的安全策略。丢弃这种包是一个审计事件。注意在网络配置中的包的分片可能通过不同的安全网关或 BITW implementations,被发送或接收,跟踪分片的状态策略可能会失败。7.4. BYPASS/DISCARD Traffic透传一个明文,non-initial 分片到一个 IPsec 实现上,会破坏指向相同目的的 IPsec 保护的流量的安全性。在网络配置中的包的分片可能通过不同的安全网关或 BITW implementations,被发送或接收,跟踪分片的状态策略可能会失败。8. Path MTU/DF Processing对出方向包
32、的 AH 或 ESP 的应用会增加一个包的大小,这样可能会导致一个包的大小超出了传输这个包的 SA 的 PMTU 大小。一个 IPsec 实现也可能接收一个非保护的 ICMP PMTU 消息,如果它选择处理这个消息,这将会影响出方向流量的处理,这节就是描述了一个 IPsec实现怎么处理这两种 PMTU 问题。8.1. DF Bit所有的 IPsec 实现必须支持 DF 位从一个出方向包复制到传输它的隧道模式头。当一个传输量被一个隧道模式 SA 携带时,这意味着它必须可以为每个 SA 配置实现的 DF 位的处理(set, clear, copy from inner header),这个应用于内
33、部头和外部头都为 IPv4 的 SA。8.2. Path MTU (PMTU) Discovery这节讨论 IPsec 处理非保护的 Path MTU Discovery 消息。这里用到的 ICMP PMTU 引用一个ICMP 消息为:IPv4 (RFC 792 Pos81b):- Type = 3 (Destination Unreachable)- Code = 4 (Fragmentation needed and DF set)- Next-Hop MTU in the low-order 16 bits of thesecond word of the ICMP header (la
34、beled “unused“in RFC 792), with high-order 16 bits set to zero)IPv6 (RFC 2463 CD98):- Type = 2 (Packet Too Big)- Code = 0 (Fragmentation needed)- Next-Hop MTU in the 32-bit MTU field of the ICMP6Comment F1: ICMP是(Internet Control Message Protocol)Internet 控制报文协议。它是TCP/IP协议族的一个子协议,用于在 IP主机、路由器之间传递控制消
35、息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP 协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。message8.2.1. Propagation of PMTU当一个 IPsec实现接收到一个没有认证的 PMTU消息,并且它被配置为处理(而不是忽略)这样的消息,它把这个消息映射到它对应的 SA。这个消息决定的 PMTU被用于更新SAD PMTU域,考虑到应用于 AH或 ESP头的大小,任何加密同步数据和一个强加的额外的IP头
36、,在隧道模式 SA的情况下。对于所有其他 IPsec实现选项,PMTU 数据必须通过一个合成的 ICMP PMTU传播。这些况下,这个 IPsec实现应该等待出方向的传输量映射到 SAD记录。当这样的传输量到达的时候,如果这个传输量超出更新的 PMTU值,这个传输量必须进行如下处理:Case 1: 初始的(cleartext)包为 IPv4并且设置 DF位。实现应该丢弃这个包并且发送一个 PMTU ICMP消息。Case 2: 初始的(cleartext)包为 IPv4并且清除 DF位。实现应该分片(加密每个配置前或配置后) ,然后转发这些分片。它不应该发送一个 PMTU ICMP消息。Cas
37、e 3: 初始的(cleartext)包为 IPv6.实现应该丢弃这个包,冰箱发送一个 PMTU ICMP消息。8.2.2. PMTU Aging(PMTU老化)在所有的实现中,与 SA相关的 PMTU是有生命期的,需要一些机制来定期更新PMTU,特别是发现 PMTU小于当前网络条件所需时。如果当前 PMTU太大会发送一个ICMP错误消息。实现应该用 the Path MTU Discovery document (RFC 1191 MD90, Section 6.3)中描述的方法,建议定期重置 PMTU到 first-hop data-link MTU,然后让普通的 PMTU发现处理根据需要
38、更新这个 PMTU。更新周期应该是可配置的。注:除非特别说明,SPD 的使用,涉及到策略信息部分有有序的( ordered)或解关联(decorrelated(unordered))两种状态,Appendix B提供了一个算法用于解关联 SPD记录。但也使用任何可以产生等效输出的算法。需要注意的是当一个 SPD记录被解关联后的所有记录结果都必须被链接到一起,这样所有这个组的成员都来自一个个人,SPD 记录(prior to decorrelation)可以被同一时间放入到缓存和 SAD中。如,假如从记录 A (prior to decorrelation)开始,解关联的时候产生 A1,A2 ,
39、A3 三条记录。当一个包过来匹配,匹配到 A2,并且触发产生一个 SA,这个 SA管理协议(e.g., IKEv2)协商 A。所有这三条被解关联的记录 A1,A2,A3,被放入一个合适的 SPD-S缓存并且链接到 SA。用一个解关联 SPD的目的是不应该创建出比非解关联 SPD时还多的 SA。如果大量的解关联记录被链接,可能会为 SA 协商创建一个很大的包,这样会产生分片问题给 SA 管理协议。(correlated) SPD 中原始的记录可能会被 SA 管理协议保留或传递。传递关联的 SPD 记录使得解关联 SPD 的使用是个本地问题,对对端不可见,并且避免可能的分片困扰,尽管它提供了更少的
40、精确信息给响应者来匹配这个响应者的 SPD。一个折中的方法是发送一套完整的链接和解关联 SPD 记录的子集。这种方法可以避免前面所述的分片问题,又可以提供比原始的、有关联的记录更好的信息。这种方法的主要缺点是可能事后会产生额外的 SA,因为只是一个链接的和解关联记录的子集发送到对端。实现可以用上面的任意一种。响应者用从 SA 管理协议接收到的传输选择器提议来在它的 SPD 中选择合适的记录。这个匹配的目的是选择一个 SPD 记录并且创建一个 SA,这个 SA 最接近发起方的意图,所以流量传输到这个产生的 SA 将被两端都接受。如果响应者提供了一个解关联 SPD,必须用这个解关联 SPD 记录来匹配,这样也会产生看起来和两端意图匹配的 SA。如果响应者有一个有关联 PD,那么应该用这个提议与有关联记录匹配。对于 IKEv2,用一个解关联 SPD 来提供更好的机会来为发起方产生一个“narrowed“响应。在所有的情况下,当一个解关联的 SPD 可用,解关联记录就被用于填充 SPD-S 缓存。如果SPD 不是解关联的,不允许缓存并且必须对 SPD 执行一个有序的查找来验证到达一个 SA 的入方向流量,和 SPD 中描述的访问控制策略一致。