×××技术漫谈之IPSec(附MPLS)

引:

前面有几篇文章谈了Open×××,在那些文章中好像把IPSec给贬的一文不值,实际情况下IPSec的设计非常好,只是太复杂了,这是Open×××胜出的原因。本文谈IPSec。宗旨还是纯技术的讨论。
     还是用我的一贯作风,用黄仁宇先生的大历史的观点谈论,在切入IPSec之前,首先是一个必要的理论,这些理论说明了一种长期合理性,内中又有一种进化的观点,这是我对大历史的修正。

1.理论:

1.0.自然是简单的:这个不必多说,大自然是简单的,所以人造就的东西就不能太复杂。
1.1.人的惰性:如果你已经习惯了一样东西,那么你就不想换完成同样功能的另一样东西。这是一个不争的事实,其本质正是在于人的惰性-大部分人的反应是慢的。这种行为固化了黄仁宇所谓的“长期的合理性”
1.2.人的懒性:虽然人一般不会主动去换新的东西,但历史还是在进化的,这是因为人除了“惰”之外,还懒,如果新的东西比旧的东西更方便了人的生活,那么人就不“惰”了,开始使用新的东西,这正是懒造成的,然而上述的“更”字却有一个阀值,只有这个“更”超过这个阀值,懒和惰之间的PK才会以懒胜而告终。懒的原因是什么?不是经济(我不同意经济是一切的基础),而是心理。注意:不是憧憬造成了改变,而是懒促成了改变。
1.3.人普遍没有前瞻性:人所有的行为都是为了解决当前问题的,根本没有为未来而未来的-这其实是人的懒和惰的结合导致的,但是我还是将其单列为一条。虽然你可能会搬出上世纪的电影《大都会》来反驳我,我也可以告诉你,那只是当时人对万恶社会的控诉。不管你承不承认,这条永远是真理,不信请自测。
1.4.我的一种历史观:历史是少数精英造就的,大部分人只是学习和模仿,正是这部分人数量很多,才使历史发展成这样,我们每一个人几乎都是在学习那几个精英创造的东西,而且更多的人还学不会。种麦子看似很简单,但是那是史前某年某批人灵机一动的结果,我们只是在学习!
1.5.分组交换网的核心协议:这条可能不能算是基本原理,而可以从上述4点推出来,然而由于本文讨论技术,而不是历史,因此算它一条理论。分组交换网是精英的成果,由于人的惰性,很多年它都和电路交换网并存,由于人的懒,最终大部分数据业务都使用了分组交换网。它的核心协议是IP协议,因为原理1.0,它处于分层模型的中间,使得整个协议栈成了一个沙漏状(世界上所有的东西,不是沙漏状就是飞梭状,不信请自测),最窄处是机制,而宽的地方是策略。
1.6.TCP/IP设计的失败:现在看TCP/IP,虽然在使用上,它很成功,然而它同时也很失败:为何TCP即使在并行环境也只能串行,为何如此重要的IP协议却一点也不安全也不可靠?别问了,因为人没有前瞻性。
1.7.安全性:IP协议设计之初,需求中没有安全性,人没有前瞻性,因此IP是不安全的。
1.8.修修补补又一年:人普遍喜欢修补昨日的错误而不喜欢直接推倒昨日的设计。这因为1.1/1.3
1.9.人的惰性:这里的惰性是1.1的加强版,修补后的东西让人更有惰性了。Intel直到现在还保留着段模式…如果说人由于懒接受了新东西,那么新东西则又开始了人们新一轮的惰性
1.10.进化:综合上述10条,历史的发展轨迹是一个楼梯状,根本不是螺旋状(螺旋状只是失败的借口),这完全归结于两点:人的懒,人的惰!

2.IP安全性-IPSec设计

2.1.纵观TCP/IP协议栈,只有网络层是高度统一的,几乎所有的通信都在走IP协议。所有其它层次都有很多的协议,只有IP层协议最少。
2.2.由于IP在设计之初使用于特定环境,没有安全问题,因此IP协议压根儿不安全。
2.2.1.摘自Cisco官方网站IPSec站点的一段文字:
IP-based data is vulnerable to hackers' tampering and eavesdropping. IP's strength is that it has small, manageable packets of electronic information that can be routed quickly and easily. These chunks of information create breaks in the data stream that allow them to be transmitted efficiently through the network. However, the way IP routes these packets causes large IP networks to be vulnerable to a number of security attacks, such as spoofing, sniffing, and session highjacking.
2.3.结论:网络到网络的安全在IP层做最好。一个解决方案就是IPSec,不必为名词所累,其实“安全的IP-修修补补又一年”,IPv6内置了安全性,然而我敢打赌,在IPv6普及后10年,又有新的问题。

3.安全的IP-IPSec?为何不一下子使用SSL

3.1.人不是神
3.2.人们面临的问题仅仅是“IP是不安全的”,人喜欢“就事论事”的原则使得人只会在IP协议上修修补补

4.上面的总结

4.1.从大的角度上看:IPSec的设计非常可以解决当前的安全需求,很多年里,成就了人们新的“惰”的“需求”,只要是×××,只用IPSec
4.2.从小的纯技术角度:IPSec还有美中不足。不要忘了,人不但惰,而且懒。所以当挖掘细节之后,人们发现有更简单的办法,于是就有了SSL等协议(本文不谈,详见前面关于OpenSSL以及Open×××的文章或者直接google)。
4.3.理性的人儿:人是懒惰的,能促进历史发展的唯一动力就是理性,当然这是精英们的特质,可能和我们无关。于是引出一系列的PK,SSL方面的,Open×××方面的大家都已经理解不少了,因此下面仅谈IPsec。

5.IPSec的技术细节以及评价(大量摘抄Cisco的文档,比较权威)

5.0.IPSec框架: IPSec其实根本不是一个协议,也正是这个特性决定了它很复杂。它实际上包含一个协议集合,该集合只要能实现IPSec的规范即可,也不一定非要是ESP/AH/ISAKMP/IKE。许多配置项在等着那些所谓CCNP/CCIE/HCSE们。在继续IPSec的讨论前,先给出两幅幅来自Cisco的IPSec图示:

 

 

5.1.基本概念
5.1.1.SA-安全联盟:
The Authentication Header and Encapsulating Security Payload protocols are the building blocks of IPsec. The encryption services provided by the AH and ESP are powerful tools for keeping data secret, for verifying its origin, and for protecting it from undetected tampering. But these tools will not work unless there is a carefully designed infrastructure to work with them. ××× security succeeds or fails depending on the reliability and scalability of this infrastructure.
Secure communication with authentication and encryption requires negotiation, an exchange of keys, and a capability to keep track of the keys. The way that IPsec keeps track of the details, as well as which keys and algorithms to use, is by bundling everything together in a Security Association (SA). An association is a one-way relationship between a sender and a receiver that affords security services to the traffic carried on it. The SA groups together all the elements needed for two parties to communicate securely.
5.1.2.IKE:
Internet Key Exchange (IKE) is a protocol of choice for protocol negotiation and key exchange through the Internet. IKE enables an agreement to be negotiated on which protocols, algorithms, and keys should be used. It ensures secure authentication services from the beginning of the exchange. It manages keys securely after they have been agreed upon, and it exchanges those keys safely.IKE provides four capabilities:
1).Provides the means for parties to agree on which protocols, algorithms, and keys to use.
2).Ensures from the beginning of the exchange that you are talking to the right person.
3).Manages those keys after they have been agreed upon.
4).Ensures that key exchanges are handled safely.
5.1.3.AH:AH协议只认证不加密。以下是协议头:

5.1.3.1.AH的传输模式
以下是一幅图,基本能说明一切了:

5.1.3.2.AH的隧道模式
以下是一幅图,基本能说明一切了:

5.1.4.ESP:ESP协议不但提供加密,还提供认证,以下是协议头:

5.1.4.1.ESP的传输模式
以下是一幅图,基本能说明一切了:

5.1.4.2.ESP的隧道模式
以下是一幅图,基本能说明一切了:

5.1.5.ESP/AH和NAT
通过上述的几幅图,发现只有ESP的隧道模式可以穿越NAT设备,路由如下:
1).AH协议中,不管隧道还是传输,全部认证ip头,而nat改变ip/端口,没戏!
2).ESP的传输模式中,nat时改变了IP,然则在到达终点的时候,计算传输层的校验和的时候需要ip层的“伪”头,亦没戏
3).ESP的隧道模式中,原始的ip头以及之上的头都一起封装了,因此没有问题。

5.2.综合评价
5.2.1.协议设计
IPSec使用三元组唯一区分一个安全联盟:SPI/IP/proto
spi和proto具有和tcp/udp+port的含义,这是后者识别一个应用层实体,而spi+proto识别一个ip层安全实体,也就是一个安全联盟-sa。
ip协议是无连接的,因此直接基于ip实现的***方案在协商好密钥等信息后,“keep track of the keys”就会显得很吃力,因此在本质层面上就使得IPSec非常“散”。虽然“安全联盟-SA”能帮助做到keep track of the keys,然而又是因为ip的无连接,导致sa采取单向的方式。
     ESP/AH是IPSec的实现中的一部分,如果我们把它认为是第四层的协议-毕竟它们的协议号由IP头识别,那么它们在处理了“安全”之后就无法再处理“流”,毕竟每一层协议只做一件事。TCP/UDP可以被识别为流,但是ESP/AH做不到。另外IPSec和ESP/AH的关系只是一个“框架和填充”的关系,类似Netfilter和nat,IPSec和ESP/AH在设计上仅仅通过SPI相耦合,因此综合上述两点,SA只能单向。
5.2.2.IKE握手与SSL握手
5.2.2.1.IKE握手
IKE握手分为两个阶段,第2阶段承接第1阶段,第1阶段保证第2阶段协商真正安全参数的安全性,这样的解耦分段可以使得第1阶段的协商参数能被重用,既然第2阶段的协商是在第1阶段协商的安全参数的保护下进行的,因此可重用的第2阶段阶段协商往往可以快速完成。
     IKE第2阶段握手协商出了两个SA,一个SA一个方向。这明显是一个很优秀的设计,然而可能被认为是过渡设计,因为它操作起来和理解起来太复杂了
5.2.2.2.SSL握手
SSL架设在TCP/UDP之上,因此底层协议可以保证连接性(udp上的ssl需要应用层自己处理连接),SSL握手是一个综合的握手,为什么这么说呢?其实这得益于它是一个传输层以上的协议。因此SSL握手要比IKE握手简单得多,一次SSL握手可以协商出两个方向的密钥,同时可以在两个方向相互认证(最流行的方式是基于X.509证书),难怪人们喜欢SSL胜于IKE呢,正是因为它的简单,有更简单的方法为何还要用复杂的呢?再加上虚拟网卡的提出,一切都可以在应用层完成了,IPSec的IKE因此败下阵来。
5.2.2.3.然而
然而SSL+虚拟网卡的×××解决方案并不是标准的,因此还是无法普遍应用(一流公司做标准,二流公司做品牌,三流公司做产品,实际上只要Microsoft提供OS级别的原生支持就可以了)。既然如此,IPSec还是一流的。
5.2.3.为IPSec平反
作为一名非精英资浅研发,我也有惰性,虽然我懒,然而还没有到达“惰-懒”的阀值,因此我认为IPSec还是很优秀的,在IPSec的框架上,出现了很多的优秀解决方案。
5.2.3.1.DM×××
设置一个中心HUB,通过这个中心HUB的协助在两个节点间建立IPSec隧道,这个方案省去了节点的维护开销。
5.2.3.2.GET ×××
所有的节点使用一组SA,这样就逃过了N的平方问题,SA不会因为安全连接的增加而增加,因此不修改IP头,而只是加密/认证裸数据。这个方案的优点就是可以完全使用可以信赖的路由为数据包找到最佳路径。

附:MPLS ×××

MPLS提供了一种快速转发数据包的方式,这就是事先为“一整条路径”准备一组特定的标签,一整条路径是通过路由发现的,也就是说,以往的路由转发都是走一跳是一跳,而现在却是事先就把完全的全局路径发现,然后数据包只能在这条路径上走,路由机制只在路径发现的时候有意义,真正传输数据时只看标签,不查路由。这非常类似于电路交换中的事先建立链路的行为,或者ATM中的虚拟通道的概念。由于到达某网络的数据包只能在特定的路径上通过,那么这就在另一种意义上实现了安全,完全不需要加密。传统的×××之所以需要加密是因为IP路由机制导致数据包完全在公共路径上传输,路径并不确定,而MPLS却能使数据包在特定路径上传输,这就类似于公共交通和铁路专线的区别。传统的×××是应用意义上的逻辑虚通道,而MPLS-×××却是链路意义上的逻辑虚通道。MPLS虚拟通道见下图:
!–>![endif]–>!–>![endif]–>!–>

转载于:https://blog.51cto.com/dog250/1270995

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注