IPsec 目的是用来解决两个IP之间数据可靠,安全传输的问题。
这个问题可以拆分开为几个问题:
- 确保传输过来的数据是没有被篡改过的(data integrity)
- 确保数据是对方传过来的(data origin authentication)
- 数据不被其他人偷看(confidentiality)
另外一个要避免中途有人截取了这些数据然后故意重传,即重放攻击(replay attacks),这个问题先不讨论
为了解决上面这几个问题,我们先考虑下面几种情况: - 数据被无意中修改
假设我们使用知名的 md5 算法,把传输的数据算出一个哈希值,然后放在数据包的某个位置。收到数据后我们去算下其哈希是不是跟附带的哈希值一致,如果不一致则说明数据被改过了。如果有人恶意伪造数据,把哈希值也改了,这种技术就防止不了。 - 如何防止数据恶意被篡改
要防止数据被恶意篡改,我们假设数据传输双方都知道一个密码,然后把密码和数据拼接起来,算出一个哈希值作为验证。由于第三方不知道密码,无法伪造,因此通过这种方式,我们就解决了上面三个问题中的前两个问题。
在有密码的情况下,双方可以用加密算法来加密和解密,也就解决了第三个问题。
上面讲的是一个一个从技术理论角度来看 IPsec 的问题,而在实际上 IPsec 的应用中,往往会用到下面这些术语:
- 认证头(AH)
认证头是干什么的呢?其实际上就是解决了上面的第一,第二个问题。 - 封装安全载荷(ESP)
这个技术实际上是解决了上面的三个问题
从表面来看,似乎后者是可以完全替代前者,但是实际上后者算的哈希值只包括了 IP 包承载的数据(payload),而前者把 IP 头的部分信息也算在里面了。两者可以选着用或者只用其中一种,视情况而定。
上面这两个技术都需要密码和相关算法,其通过安全参数索引(SPI)这个字段来获得,那么想一下密码和算法这些信息保存在哪里?这就牵扯到另外一个技术,即安全关联(SA Security association),里面保存了密码以及相关算法信息。
讲到这里,其实还有问题,那就是前面提到的密码是怎么得到的,加密算法又是怎么协商的,常见的解决这个问题依赖 IKE([Internet Key Exchange) 这个组件,其通过协商,最终会生成安全关联。目前 IKE最新版本是 IKEv2。
IKE 交互过程分为两个阶段:
- 第一阶段,通过 DH 密钥交换算法根据原始信息生成一个密码,这个密码被用来加密后续的 IKE 数据。这个原始信息可以是预共享密钥(PSK),密钥对等。第一阶段可以工作在Main Mode或者Quick Mode,前者有加密,比较安全。
其中第一个阶段又分为两个步骤,第一步称作 IKE_SA_INIT,其主要作用是交换基本信息,包括要采用的哈希算法,加密算法,随机数(nonce)并且执行了一步 DH 交换。(出于简化起见,先不讨论公钥这种情况。)这步基础上,实际上两端可以得出了一个共识的密钥,这就是 DH 交换算法的功能。第二步则称为 IKE_AUTH,这一步中,双方用协商好的算法和共识算法对之前的消息进行了签名确认,最终创建了第一个 SA。推测这个 SA 并不为任何 IPsec 的连接使用,而只给 IKE 使用。 - 第二阶段,根据前面阶段的密码来协商和创建更多的安全关联(SA)信息。
第二阶段,虽然在配置层面上都是 IKE 的配置,但是在实际上所有的配置应该都是指 IPsec 的配置。这里又包括两个考虑点:第一是用 ESP 还是 AH,现实世界里面我们直接抛弃 AH 采用 ESP。第二是 ESP 用什么算法来加密。这个配置项在 openswan 里面叫做 phase2alg,在 strongswan 里面叫做 esp。注意这里要配置内核支持的算法。一旦两端协商完毕,新的 SA 就会创建,新连接的数据包的 SPI 就会该 SA,从而实现对数据的保护。
对于具体连接 SA 协商而言,在 strongswan 里面是通过 leftsubnet, rightsubnet 来定义的,其定义了哪些连接要由 IPsec 来保护,来封装。这个规则在 IPsec 规范里面叫做 Traffic Selectors,简写为 TS,发起方和接收方各称为 TSi,TSr。如果是 IKEv2 的情况下,遇到 TS_UNACCEPTABLE 的错误,那么往往是两端允许的网段配置不一致,需要双方技术人员协商解决。Juniper 设备如果在基于路由的 IPsec 下,TS是通过 proxy-id 来配置,如果是在基于策略的 IPsec 下,则是通过策略来配置。详细参考相关文档。
在 linux 下面,可以通过 ip xfrm state, ip xfrm policy 以及 strongswan 的 ipsec statusall 等命令来查看 IPsec 的状态。
在网络层面,实际上 IKE 是工作在 UDP 协议上的,端口 500 或者 4500. 而 IPsec ESP 默认工作在 IP 协议(协议号50)上,在需要经过 NAT 的情况下,该数据包会被封装在 UDP 包里面,通过端口 4500 进行收发。所以 4500 端口会混合着各路 IPsec 数据包以及 IKE 的包。感觉比较混乱。
网友评论