什么是IPsec
IPsec是给IP和上层协议提供安全的IP协议扩展。最初是为IPv6标准而开发的,后来返过来又支持IPv4。RFC2401描述了IPsec的体系。下面简单介绍一下IPsec。
IPsec使用两个不同的协议——AH和ESP来确保通信的认证、完整性和机密性。它既可以保护整个IP数据报也可以只保护上层协议。适当的模式称为:隧 道模式和传送模式。在隧道模式下,IP数据报被IPsec协议完全加密成新的数据报;在传送模式下,仅仅是有效负荷被IPsec协议将IPsec头插入 IP头和上层协议头之间来搬运(见图1)。
图1. IPsec 隧道模式和传送模式
为保护IP数据报的完整性,IPsec协议使用了“散列信息认证代码”(HMAC:hash message authentication codes)。为了得到这个“散列信息认证代码”,IPsec 使用了像MD5和SHA这样的散列算法根据一个密钥和数据报的内容来生成一个“散列”。这个“散列信息认证代码”包含在IPsec协议头并且数据包接受者 可以检查“散列信息认证代码”(当然前提是可以访问密钥)。
为了保证数据报的机密性,IPsec协议使用对称加密算法。IPsec标准需要NULL和DES执行者。如今经常使用像3DES、AES和Blowfish这样更加强的算法。
为了避免拒绝服务攻击(DoS: denial of service attacks),IPsec协议使用了一个滑动窗口,每个数据包被分配到一个序号,并且只接受在不在窗口中的或新的数据包。旧的数据包立即丢弃。这可以 避免重复攻击,即:攻击者记录原始的数据并稍后再次重发。
通信的双方为了能够加密和解密IPsec数据包,他们需要一种方法来保存通信的密钥、算法和IP地址等有关信息。所有的这些用来保护IP数据报的参数保存 在一个“安全联盟”(SA:security association)中。“安全联盟”依次保存在一个“安全联盟”数据库(SAD:security association database)中。
每个“安全联盟”定义了以下参数:
• 结果IPsec头中的源IP地址和目标IP地址。这是IPsec双方保护数据包的IP地址;
• IPsec协议(AH还是ESP),有时也支持压缩(IPCOMP);
• IPsec协议用的加密算法和密钥;
• 安全参数索引(SPI)。这是一个32位的数据,用来识别“安全联盟”(SA)。
一些“安全联盟”数据库执行者允许存储更多的参数:
• IPsec模式(隧道模式或者传输模式);
• 用来避免重复攻击的滑动窗口大小;
• “安全联盟”的生命时间。
因为“安全联盟”定义了源IP地址和目标IP地址,在一个全双工IPsec通信中,它只能保护一个方向的通信。如果想保护双方的通信,IPsec需要两个单向的“安全联盟”。
“安全联盟”仅仅声明IPsec支持保护通信。需要定义另外的信息来声明什么时候通信需要保护。这些信息保存在“安全策略”(SP: security policy)中,“安全策略”又依次保存在“安全策略库”(SPD:security policy database)中。
一个“安全策略”通常声明下列参数:
• 被保护的数据包的源地址和目标地址。在传输模式下,这同SA的地址相同。在隧道模式下,他们可能不一样。
• 被保护的协议和端口。一些IPsec执行者不允许定义被保护的协议,这种情况下将保护所有涉及到的IP地址之间的通信。
• 用来保护数据包的“安全联盟”。
手动设置“安全联盟”十分容易出错并且不太安全。密钥和加密算法必须被共享到所有VPN(virtual private network)双方。特别是交换密钥给系统管理员造成危险的问题:在没有加密的情况下如何交换对称的密钥?
为了解决这个问题,又发明了互联网密钥交换(IKE:internet key exchange)协议。这个协议在通信的第一阶段鉴定双方身份。在第二阶段,商议好“安全联盟”并且对称密钥改变成使用一种Diffie Hellmann密钥交换。然后互联网密钥交换协议周期性地改变密钥来确保它们的机密性。
IPsec协议
IPsec协议包括两个协议:认证头协议(AH:Authentication Header)和封装安全负载协议(ESP:Encapsulated Security Payload)。两者都独立于IP协议。认证头协议使用IP协议的51,封装安全负载协议使用IP协议50(参考/etc/protocols)。下面 两节将简要地介绍它们的属性。
认证头协议(AH:Authentication Header)
认证头协议保护IP双数据报的的完整性。为了达到这一点,认证头协议计算了一个“散列信息认证代码”(HMAC)来保护完整性。当计算一个“散列信息认证 代码”时,认证头协议基于它的密钥、有效负载和IP头的不可变的部分(如IP地址)。然后它将认证头放到数据包里。下图显示了认证头的结构。
Figure 2. The AH Header protect the integrity of the packet
认证头共长24个字节。第一个字节是“下一个头”字段,这个字段指定了下边协议的头。在遂道模式下,一个完整的IP数据报被封装,因此这个字段的值是4。 在传送模式下,当被封装的是TCP数据报时相应的值是6。下一个字节指定了的有效负载的长度。这个字段下边是两个保留字节。再下边两个双节指定了32位长 的安全参数索引(SPI:Security Parameter Index)。安全参数索引指定了解安全负载封装使用的“安全联盟”。32位长的序号防止重复攻击。最后96位保存了“散列信息认证代码”(HMAC)。 “散列信息认证代码”保护了数据包的完整性,因为只有双方知道可以创建和检查“散列信息认证代码”的密钥。
因为认证头协议保护了IP数据包括IP头的不可变的部分(如IP地址),认证头协议不允许网络地址转换(NAT:Network Address Translation)。网络地址转换将了IP头的IP地址(通常是源IP地址)改为不同的IP地址,当改变后“散列信息认证代码”就不再有效了。 IPsec协议的“横越网络地址转换”(NAT-Traversal)扩展围绕这一限制实现了一条道路。
安全负载封装(ESP - Encapsulated Security Payload)
安全负载封装协议既可以使用“散列信息认证代码”来确保数据包的完整性,又可以使用加密算法保证机密性。在加密数据包并计算出“散列信息认证代码”后,生成安全负载封装头并加入数据包。安全负载封装头包括两部分,见下图:
Figure 3. The ESP header
安全负载封装头的第一个双字字段指定了安全参数索引(SPI),这个“索引”指定了解安全负载封装数据包用到的“安全联盟”。下一个双字字段保存序号。序 号被用来预防重复攻击。第三个双字字段指定了加密程序使用的“初始向量”(IV:Initialization Vector)。不使用“初始向量”对称加密算法可能被多次攻击。“初始向量”可以确保两个相同的负载被加密成不同的负载。
IPsec使用密码块来进行加密处理。因此,如果负载的长度不是声的整倍长时可能需要填补。这时需要增加填补长度。下边的两个字节是填补长度。“下一个 头”字段指定了下一个头。“安全负载封装”头的最后96位长是“散列信息认证代码”,用来确保数据包的完整性。这个“散列信息认证代码”仅仅统计数据包的 负载。IP头不包括在计算之列。
因此,使用网络地址转换不会破坏“安全负载封装”协议。尽管如此,大多数情况下网络地址转换不可能与IPsec结合。在这种情况下,“横越网络地址转换”(NAT-Travesal)提供了一个解决办法——把“安全负载封装”数据包封装到UDP包中。
因特网密钥交换协议(IKE Protocol)
“因特网密钥交换协议”解决了安全通信设备中的大多数突出问题:确认双方并交换双称密钥。它创建“安全联盟”并装入“安全联盟数据库”中。“因特网密钥交 换协议”经常需要一个用户空间守护进程并且不在操作系统核心中执行。“因特网密钥交换协议”使用UDP的500端口来进行通信。
“因特网密钥交换协议”功能分两个阶段。第一个阶段建立一个“因特网安全联盟密钥管理安全联盟”(ISAKMP SA:Internet Security Association Key Management Security Association)。第二阶段,“因特网安全联盟密钥管理安全联盟”用来商讨并配置IPsec的“安全联盟”(SA)。
双方的第一阶段认证经常使用基于“预先共享密钥”(PSK:pre-shared keys)、RSA 密钥(RSA keys)和 X.509证书(Racoon甚至支持Kerberos)。
第一阶段通常支持两种不同的模式:主模式和好斗模式。两种模式都鉴别对方并设置ISAKMP SA,但好斗模式只使用一半数量的信息达到这个目。这是它的缺点,因为好斗模块不支持身份保护,因此如果与预共享密钥一起使用,它容易受到“中间人攻击” (man-in-the-middle attack)。另一方面,这只是好斗模式的用途,因为主模式的内部工作形式不支持对未知的一方使用不同的预共享密钥。好斗模式不支持身份保护和用普通文 字传送客户的身份,因此在认证发生前,一方知道另一方,并且不同的预共享密钥可以被不同的一方使用。
在第二阶段,IKE协议交换“安全联盟建议”(security association proposal)并且基于ISAKMP SA商议的安全联盟。ISAKMP SA提供认证来避免“中间人攻击”(man-in-the-middle attack)。第二阶段使用快速模式。
通常双方只商议一个ISAKMP SA,然后它被使用商谈几个(最少两个)单向的 IPsec SA。
NAT-Traversal
什么是NAT-Traversal?为什么需要它?
通常VPN的一方位于NAT设备后面。假设有一个Source-NAT设备(下面只要说的NAT都指Source-NAT或Masquerading)。 这该如何连接到VPN?首先,一方的原始的IP地址被NAT设备隐藏,NAT设备隐藏原始的源IP地址,并把它换成自己的地址。
这使IPsec AH协议立即不可用,但是,如果双方配置正确的话,ESP仍可以使用。
那么,为什么你需要NAT-Traversal?因为位于同一NAT设备后的两台计算机尝试建立一个通往外界的隧道,它们都会失败。
为什么会这样?NAT设备需要记住“被NAT”后的通信,以便对返回原客户端的数据包进行“解NAT”。因此NAT设备在内部维护着一个保存了全部“被 NAT的连接”的表格。假设一个客户连接到了互联网上的一个WEB服务器,NAT设备隐藏它的原始地址并换成自己的地址,然后在它内部的表格上作记录,返 回到选择好的客户端口上的数据包都发往原始的客户。一旦第二个客户发起一个连接,它就作同样的处理。如果第二个客户同时选择了同样的客户端口,NAT设备 为明确客户端口也要修改客户端口。使用TCP和UDP时这工作的很好,因为这些协议支持端口。ESP不使用端口,因此NAT设备可以仅使用协议来区别数据 包。当第一个客户连接到它后,它在表格中保存相关信息,所有ESP数据包被进行“解NAT”到第一个客户端,当第二个客户端连接到它,它将用第二个连接的 适当条目重写这个条目,最后破坏了第一个连接。
NAT-Traversal能做什么?NAT-Traversal再次把ESP数据包装入UDP数据包,它可以非常容易地被NAT设备处理,因为它们提供 了端口号。默认情况下使用UDP 4500端口。在几个草案中声明了NAT-Traversal,不是RFC。NAT-Traversal的一个好特性是——在双方活动时会根据需要自动使 用它。
本人初中文化程度,翻译的不好,请不要嘲笑!
图1
图2
图3
IPsec使用两个不同的协议——AH和ESP来确保通信的认证、完整性和机密性。它既可以保护整个IP数据报也可以只保护上层协议。适当的模式称为:隧 道模式和传送模式。在隧道模式下,IP数据报被IPsec协议完全加密成新的数据报;在传送模式下,仅仅是有效负荷被IPsec协议将IPsec头插入 IP头和上层协议头之间来搬运(见图1)。
图1. IPsec 隧道模式和传送模式
为保护IP数据报的完整性,IPsec协议使用了“散列信息认证代码”(HMAC:hash message authentication codes)。为了得到这个“散列信息认证代码”,IPsec 使用了像MD5和SHA这样的散列算法根据一个密钥和数据报的内容来生成一个“散列”。这个“散列信息认证代码”包含在IPsec协议头并且数据包接受者 可以检查“散列信息认证代码”(当然前提是可以访问密钥)。
为了保证数据报的机密性,IPsec协议使用对称加密算法。IPsec标准需要NULL和DES执行者。如今经常使用像3DES、AES和Blowfish这样更加强的算法。
为了避免拒绝服务攻击(DoS: denial of service attacks),IPsec协议使用了一个滑动窗口,每个数据包被分配到一个序号,并且只接受在不在窗口中的或新的数据包。旧的数据包立即丢弃。这可以 避免重复攻击,即:攻击者记录原始的数据并稍后再次重发。
通信的双方为了能够加密和解密IPsec数据包,他们需要一种方法来保存通信的密钥、算法和IP地址等有关信息。所有的这些用来保护IP数据报的参数保存 在一个“安全联盟”(SA:security association)中。“安全联盟”依次保存在一个“安全联盟”数据库(SAD:security association database)中。
每个“安全联盟”定义了以下参数:
• 结果IPsec头中的源IP地址和目标IP地址。这是IPsec双方保护数据包的IP地址;
• IPsec协议(AH还是ESP),有时也支持压缩(IPCOMP);
• IPsec协议用的加密算法和密钥;
• 安全参数索引(SPI)。这是一个32位的数据,用来识别“安全联盟”(SA)。
一些“安全联盟”数据库执行者允许存储更多的参数:
• IPsec模式(隧道模式或者传输模式);
• 用来避免重复攻击的滑动窗口大小;
• “安全联盟”的生命时间。
因为“安全联盟”定义了源IP地址和目标IP地址,在一个全双工IPsec通信中,它只能保护一个方向的通信。如果想保护双方的通信,IPsec需要两个单向的“安全联盟”。
“安全联盟”仅仅声明IPsec支持保护通信。需要定义另外的信息来声明什么时候通信需要保护。这些信息保存在“安全策略”(SP: security policy)中,“安全策略”又依次保存在“安全策略库”(SPD:security policy database)中。
一个“安全策略”通常声明下列参数:
• 被保护的数据包的源地址和目标地址。在传输模式下,这同SA的地址相同。在隧道模式下,他们可能不一样。
• 被保护的协议和端口。一些IPsec执行者不允许定义被保护的协议,这种情况下将保护所有涉及到的IP地址之间的通信。
• 用来保护数据包的“安全联盟”。
手动设置“安全联盟”十分容易出错并且不太安全。密钥和加密算法必须被共享到所有VPN(virtual private network)双方。特别是交换密钥给系统管理员造成危险的问题:在没有加密的情况下如何交换对称的密钥?
为了解决这个问题,又发明了互联网密钥交换(IKE:internet key exchange)协议。这个协议在通信的第一阶段鉴定双方身份。在第二阶段,商议好“安全联盟”并且对称密钥改变成使用一种Diffie Hellmann密钥交换。然后互联网密钥交换协议周期性地改变密钥来确保它们的机密性。
IPsec协议
IPsec协议包括两个协议:认证头协议(AH:Authentication Header)和封装安全负载协议(ESP:Encapsulated Security Payload)。两者都独立于IP协议。认证头协议使用IP协议的51,封装安全负载协议使用IP协议50(参考/etc/protocols)。下面 两节将简要地介绍它们的属性。
认证头协议(AH:Authentication Header)
认证头协议保护IP双数据报的的完整性。为了达到这一点,认证头协议计算了一个“散列信息认证代码”(HMAC)来保护完整性。当计算一个“散列信息认证 代码”时,认证头协议基于它的密钥、有效负载和IP头的不可变的部分(如IP地址)。然后它将认证头放到数据包里。下图显示了认证头的结构。
Figure 2. The AH Header protect the integrity of the packet
认证头共长24个字节。第一个字节是“下一个头”字段,这个字段指定了下边协议的头。在遂道模式下,一个完整的IP数据报被封装,因此这个字段的值是4。 在传送模式下,当被封装的是TCP数据报时相应的值是6。下一个字节指定了的有效负载的长度。这个字段下边是两个保留字节。再下边两个双节指定了32位长 的安全参数索引(SPI:Security Parameter Index)。安全参数索引指定了解安全负载封装使用的“安全联盟”。32位长的序号防止重复攻击。最后96位保存了“散列信息认证代码”(HMAC)。 “散列信息认证代码”保护了数据包的完整性,因为只有双方知道可以创建和检查“散列信息认证代码”的密钥。
因为认证头协议保护了IP数据包括IP头的不可变的部分(如IP地址),认证头协议不允许网络地址转换(NAT:Network Address Translation)。网络地址转换将了IP头的IP地址(通常是源IP地址)改为不同的IP地址,当改变后“散列信息认证代码”就不再有效了。 IPsec协议的“横越网络地址转换”(NAT-Traversal)扩展围绕这一限制实现了一条道路。
安全负载封装(ESP - Encapsulated Security Payload)
安全负载封装协议既可以使用“散列信息认证代码”来确保数据包的完整性,又可以使用加密算法保证机密性。在加密数据包并计算出“散列信息认证代码”后,生成安全负载封装头并加入数据包。安全负载封装头包括两部分,见下图:
Figure 3. The ESP header
安全负载封装头的第一个双字字段指定了安全参数索引(SPI),这个“索引”指定了解安全负载封装数据包用到的“安全联盟”。下一个双字字段保存序号。序 号被用来预防重复攻击。第三个双字字段指定了加密程序使用的“初始向量”(IV:Initialization Vector)。不使用“初始向量”对称加密算法可能被多次攻击。“初始向量”可以确保两个相同的负载被加密成不同的负载。
IPsec使用密码块来进行加密处理。因此,如果负载的长度不是声的整倍长时可能需要填补。这时需要增加填补长度。下边的两个字节是填补长度。“下一个 头”字段指定了下一个头。“安全负载封装”头的最后96位长是“散列信息认证代码”,用来确保数据包的完整性。这个“散列信息认证代码”仅仅统计数据包的 负载。IP头不包括在计算之列。
因此,使用网络地址转换不会破坏“安全负载封装”协议。尽管如此,大多数情况下网络地址转换不可能与IPsec结合。在这种情况下,“横越网络地址转换”(NAT-Travesal)提供了一个解决办法——把“安全负载封装”数据包封装到UDP包中。
因特网密钥交换协议(IKE Protocol)
“因特网密钥交换协议”解决了安全通信设备中的大多数突出问题:确认双方并交换双称密钥。它创建“安全联盟”并装入“安全联盟数据库”中。“因特网密钥交 换协议”经常需要一个用户空间守护进程并且不在操作系统核心中执行。“因特网密钥交换协议”使用UDP的500端口来进行通信。
“因特网密钥交换协议”功能分两个阶段。第一个阶段建立一个“因特网安全联盟密钥管理安全联盟”(ISAKMP SA:Internet Security Association Key Management Security Association)。第二阶段,“因特网安全联盟密钥管理安全联盟”用来商讨并配置IPsec的“安全联盟”(SA)。
双方的第一阶段认证经常使用基于“预先共享密钥”(PSK:pre-shared keys)、RSA 密钥(RSA keys)和 X.509证书(Racoon甚至支持Kerberos)。
第一阶段通常支持两种不同的模式:主模式和好斗模式。两种模式都鉴别对方并设置ISAKMP SA,但好斗模式只使用一半数量的信息达到这个目。这是它的缺点,因为好斗模块不支持身份保护,因此如果与预共享密钥一起使用,它容易受到“中间人攻击” (man-in-the-middle attack)。另一方面,这只是好斗模式的用途,因为主模式的内部工作形式不支持对未知的一方使用不同的预共享密钥。好斗模式不支持身份保护和用普通文 字传送客户的身份,因此在认证发生前,一方知道另一方,并且不同的预共享密钥可以被不同的一方使用。
在第二阶段,IKE协议交换“安全联盟建议”(security association proposal)并且基于ISAKMP SA商议的安全联盟。ISAKMP SA提供认证来避免“中间人攻击”(man-in-the-middle attack)。第二阶段使用快速模式。
通常双方只商议一个ISAKMP SA,然后它被使用商谈几个(最少两个)单向的 IPsec SA。
NAT-Traversal
什么是NAT-Traversal?为什么需要它?
通常VPN的一方位于NAT设备后面。假设有一个Source-NAT设备(下面只要说的NAT都指Source-NAT或Masquerading)。 这该如何连接到VPN?首先,一方的原始的IP地址被NAT设备隐藏,NAT设备隐藏原始的源IP地址,并把它换成自己的地址。
这使IPsec AH协议立即不可用,但是,如果双方配置正确的话,ESP仍可以使用。
那么,为什么你需要NAT-Traversal?因为位于同一NAT设备后的两台计算机尝试建立一个通往外界的隧道,它们都会失败。
为什么会这样?NAT设备需要记住“被NAT”后的通信,以便对返回原客户端的数据包进行“解NAT”。因此NAT设备在内部维护着一个保存了全部“被 NAT的连接”的表格。假设一个客户连接到了互联网上的一个WEB服务器,NAT设备隐藏它的原始地址并换成自己的地址,然后在它内部的表格上作记录,返 回到选择好的客户端口上的数据包都发往原始的客户。一旦第二个客户发起一个连接,它就作同样的处理。如果第二个客户同时选择了同样的客户端口,NAT设备 为明确客户端口也要修改客户端口。使用TCP和UDP时这工作的很好,因为这些协议支持端口。ESP不使用端口,因此NAT设备可以仅使用协议来区别数据 包。当第一个客户连接到它后,它在表格中保存相关信息,所有ESP数据包被进行“解NAT”到第一个客户端,当第二个客户端连接到它,它将用第二个连接的 适当条目重写这个条目,最后破坏了第一个连接。
NAT-Traversal能做什么?NAT-Traversal再次把ESP数据包装入UDP数据包,它可以非常容易地被NAT设备处理,因为它们提供 了端口号。默认情况下使用UDP 4500端口。在几个草案中声明了NAT-Traversal,不是RFC。NAT-Traversal的一个好特性是——在双方活动时会根据需要自动使 用它。
本人初中文化程度,翻译的不好,请不要嘲笑!
图1
图2
图3