前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【All In One】一文详解IPsec隧道

【All In One】一文详解IPsec隧道

原创
作者头像
于顾而言SASE
发布2024-04-29 16:25:31
1950
发布2024-04-29 16:25:31
举报
文章被收录于专栏:网络安全随笔网络安全随笔

1. 引言

IPsec(Internet Protocol Security)是为IP网络提供安全性的协议和服务的集合,用于在不安全的网络上(一般是互联网),建立安全的网络通信,一个很常见的场景就是,我们可以通过IPsec隧道将分公司和总部的内网连接起来,使分支的员工安全的访问总部的资源,按照传统的做法,公司需要租用运营商的专线,专门拉一条网线将总部和分公司组网,虽然更安全,体验更好,但这个价格也灰常的恐怖。

IPsec隧道可以帮助我们安全的从互联网的两端传递数据,主要依靠四大特点(CIAA):

  1. 保密性(Confidentiality):传输的数据是加密的
  2. 完整性(Integrity):传输的数据是无法被无感知的篡改,我一眼能看出数据有没有人改过
  3. 认证性(Authentication):发生和接收方互相能够认证,明确的知道对端是对的人
  4. 防重放(Anti-Replay):每个包都是独一的,会有一个SPI序号,如果攻击方将我们的请求原封不动地再发送一次,企图骗过认证服务器,这是绝对不可能的。

开始介绍IPsec隧道前,我们先整点冷盘,讲讲会涉及到的知识点。

2. 一些涉及的概念

2.1 对称加密

对称加密是指用一把密钥对数据进行加密和解密,我举个最简单的对称加密的例子:

凯撒密码是罗马扩张时期朱利斯• 凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动 2 位,则 字母 A 将变为 C,字母 B 将变为 D,…,字母 X 变成 Z,字母 Y 则变为 A,字母 Z 变为 B。因此,假如有个明文字符串“Hello”用这种方法加密的话,将变为密文:“Jgnnq” 。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq”每个字母左移两位变为“Hello” 。这里,移动的位数“2”是加密和解密所用的密钥,只要凯撒事先将移动的位数告诉手下的大臣们,那么双方就能对作战命令进行加密和解密。

我们通过上述例子可以发现对称加密的两个特点:

  1. 加密和解密处理起来非常的快
  2. 这个密钥不好交换,因为一旦泄露给敌军,他们就能够对数据进行破译

目前,比较有名的对称加密算法有3种:

  • DES(Data Encryption Standard) DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 安全性是三种里面最弱鸡的。
  • 3DES(Triple DES) 3DES是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的 DES,3DES更为安全,目前还没有关于攻破3DES的报道。 该方法使用两个密钥,两个密钥合起来有效密钥长度有112bit,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
  • AES(Advanced Encryption Standard) 又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特,对应得加密轮数是10,12和14轮。 2003年6月,美国政府宣布AES可以用于加密机密文件。

2.2 非对称加密

非对称加密就是加密和解密使用的不是相同的密钥:只有同一个公钥-私钥对才能正常加解密。

这玩意非常巧妙,就是说存在一对keyA和keyB,keyA只有我自己知道,所以称为私钥,keyB可以交给任何人,所以称为公钥,我想输出得信息可以用私钥加密,然后其他拿到公钥的人可以对这段信息解密,更为巧妙地是,其他人使用公钥也可以加密信息,对应的只有手持私钥的我可以对其进行解密。非对称加密一般有两种功能:

  1. 主体保存私钥,公钥可在网络中转播,双方进行数据传输的加密和解密
  2. 数字签名,用于验证是否是真实的主体,拥有真正的私钥,不是中间人伪造的

比较有代表性的就是RSA算法,三个麻省理工的大神在1977年提出,具体过程如下:

  1. 选择一对不同的、足够大的素数p,q。
  2. 计算n = pq。
  3. 计算r = (p-1)(q-1),同时对p, q严加保密,不让任何人知道。
  4. 找一个与r互质的数e,且1< e < r。
  5. 计算d,使得de ≡ 1 mod r。
  6. 公钥KU=(e, n),私钥KR=(d, n)。
  7. 加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:C = Me (mod n)。
  8. 解密过程为:M = Cd (mod n)。

两个整数a,b,若它们除以正整数m所得的余数相等,则称a,b对于模m同余,记作: a ≡ b (mod m);

为了举例方便,我们取两个小的质数:

代码语言:javascript
复制
p = 3 ,q = 11
->
n = pq = 33
r = (p-1)(q-1) = 20
在1到20中取e与20互质,取e=3(也可以取其他)

3*d 与 1对20取模后,余数要相同,一下子就能看出来是21,d是7

至此公钥 e, n : 3, 33
至此私钥 d, n : 7, 33

我现在开始发送数据: 2 0 2 4 
则私钥加密如下:M^e (mod n) -> (2^3 mod 33)  (0^3 mod 33)  (2^3 mod 33) (4^3 mod 33)
密文:8 0 8 31

公钥解密:c^d (mod n) -> (8^7 mod 33) (0^7 mod 33) (8^7 mod 33) (31^7 mod 33)
解密的密文:2 0 2 4

现在对方也可以用公钥进行加密:1 3 1 4
用公钥加密如下:M^e (mod n) -> (1^7 mod 33)  (3^7 mod 33)  (1^7 mod 33) (4^7 mod 33)
密文:1 9 1 16 

我用私钥解密:c^d (mod n) -> (1^3 mod 33) (9^3 mod 33) (1^3 mod 33) (16^3 mod 33)
解密的密文:1 3 1 4

可见啊,假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到2020年为止,世界上还没有任何可靠的攻击RSA算法的方式。

2.3 Diffie-Hellman(DH)密钥交换

正如上文提到的那样,对称密钥是不好在互联网中交换的,因为中间人可以轻易的窃取到。1976年两位密码学家,发表了一个密钥交换的文章,它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通信中作为对称密钥来加密通讯内容。

我们再回到凯撒的那个通过字母左移几位来加密命令的故事,现在他们可以通过DH进行协商移位的个数:

凯撒

军队的leader

双方公开p和g,p是质数,g是整数

我说一个p吧,p=11

我知道了,那我说一个g吧,g=5,陛下记一下

双方都要自己想一个秘密数字a和b,打死也不告诉人

脑海中想了a=6

脑海中想了b=4

双方交换数字,s = (g ^ a或b ) mod p

我算好了,是(5^6) mod 11 = 5,这个s=5给你

我也算好了,是(5^4) mod 11 = 9,这个s=9给你

双方通过 key= (对方的s ^ a或b ) mod p算出对称密钥

k = (9 ^6 ) mod11 = 9, okk移位的个数就9

k = (5 ^4 ) mod11 = 9,好的,我就逆向移位9个就能解密了

​Diffie-Hellman(DH)组确定密钥交换过程中使用的密钥的强度。在一组类型(MODP或ECP)内,较高的Diffie-Hellman组号通常更安全。

  • Diffie-Hellman Group 1 (768-bit)
  • Diffie-Hellman Group 2 (1024-bit)
  • Diffie-Hellman Group 5 (1536-bit)
  • Diffie-Hellman Group 14 (2048-bit)
  • Diffie-Hellman Group 15 (3072-bit)

2.3 哈希

哈希算法可以保证数据的完整性,这个算法能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要),且若输入的消息不同,它们对应到不同字符串的几率很高,也就是说我们可以很大概率认为这个哈希算法生成的字符串可以代表是源数据。

我们比较熟悉的就是MD5算法,当我们下载完某个电影时,迅雷会做一个MD5值(生成32位长度的字符串)校验,如果和下载源写的MD5值一致,那就认为下载的电影是没有损坏的,但现在MD5有一些脆弱了,我们可以用彩虹表做一个逆向的破解。

代码语言:javascript
复制
hello
B1946AC92492D2347C6235B4D2611184

SHA(安全散列算法,Secure Hash Algorithm)是一个密码散列函数家族,是FIPS所认证的安全散列算法。其中最新的SHA-3 ,2015年正式发布,由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。SHA生成的哈希字符串长度巨长无比,可以是512位长度的字符串,这出现碰撞的概率几乎没有了,可以认为被哈希的字符串和哈希值是一一对应的了:

代码语言:javascript
复制
hello
52fa80662e64c128f8389c9ea6c73d4c02368004bf4463491900d11aaadca39d47de1b01361f207c512cfa79f0f92c3395c67ff7928e3f5ce3e3c852b392f976

我们做个实验,一个很小的改变都会产出几乎完全不同的散列值。举例来说,把一句话中的dog 改成 dof,生成的散列值天差地别:

代码语言:javascript
复制
SHAKE128("The quick brown fox jumps over the lazy dog", 256)
f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e
SHAKE128("The quick brown fox jumps over the lazy dof", 256)
853f4538be0db9621a6cea659a06c1107b1f83f02b13d18297bd39d7411cf10c

2.4 认证

认证就是让通信的双方,都确定是真正双方,而不是中间人之类的伪造者。一般有两种方法:

  • 预共享密钥:Pre-shared PSK,这个类似于私下约定好一个密码,好比你只要有文书,我的兵就给你调
  • 数字签名,这个就是之前讨论的私钥的另一个功能,双方互相交换公钥,然后双方再发送一串明文消息,并在末位加一个checksum,这个checksum使用各自的私钥,然后双方再用对方的公钥把checksum解密,再自己算一把明文消息的checksum如果一致,那就认为对端是拥有真实的私钥的。当然这玩意也不行,因为中间人也可以中间和双方各自交换密钥,所以一般会有一个CA证书,这玩意很权威,如果你想提供网站服务之类的,就要花钱去CA注册进去,里面内含申请者网站的主机名、主机公钥,同时 CA​ 机构会用自己的私钥对整个证书进行签名,然后双方交换时,就交换CA证书,因为目前浏览器或者操作系统中都内置了CA的公钥,所以就可以检测出证书是否是伪造的,既然证书是对的,那么我们就可以认为对端也是真实的。

2.5 AH与ESP协议

AH协议(Authentication Header,验证头部协议):可以证明数据的起源地、保障数据的完整性以及防止相同数据包在因特网重播,使用IP协议号51。AH公共摘要算法(单向散列函数)MD5和SHA1实现此功能。

  • 下一个头(8位):表示紧跟在AH头部后面的协议类型。在传输模式下,该字段是处于保护中的传输层协议的值,如6(TCP),17(UDP)或50(ESP)。在隧道模式下,AH保护整个IP包,该值是4,表示是IP-in-IP协议。
  • 有效载荷长度(8位):其值是以32位(4字节)为单位的整个AH数据(包括头部和变长验证数据)的长度再减2。
  • 保留(16位):准备将来对AH协议扩展时使用,目前协议规定这个字段应该被置为0。
  • 安全参数索引SPI(32位):值为[256,232-1]。实际上它是用来标识发送方在处理IP数据包时使用了哪些安全策略,当接收方看到这个字段后就知道如何处理收到的IPsec包。
  • 序列号(32位):一个单调递增的计数器,为每个AH包赋予一个序号。当通信双方建立SA时,初始化为0。SA是单向的,每发送/接收一个包,外出/进入SA的计数器增1。该字段可用于抗重放攻击。
  • 验证数据:可变长,取决于采用何种消息验证算法。包含完整性验证码,也就是HMAC算法的结果,称为ICV,它的生成算法由SA指定。

ESP协议(Encapsulating Security Payload,封装安全载荷协议):具有所有AH的功能(除了ESP不会对整个IP包进行验证),还可以利用加密技术保障数据机密性,使用IP协议号50。ESP通常使用DES,3DES,AES和其他加密算法来加密数据。使用MD5或SHA1。实现数据完整性。

  • 安全参数索引SPI(32位):值为[256,232-1]。
  • 序列号(32位):一个单调递增的计数器,为每个AH包赋予一个序号。当通信双方建立SA时,初始化为0。SA是单向的,每发送/接收一个包,外出/进入SA的计数器增1。该字段可用于抗重放攻击。
  • 报文有效载荷:是变长的字段,如果SA采用加密,该部分是加密后的密文;如果没有加密,该部分就是明文。
  • 填充项:是可选的字段,为了对齐待加密数据而根据需要将其填充到4字节边界。
  • 填充长度:以字节为单位指示填充项长度,范围为[0,255]。保证加密数据的长度适应分组加密算法的长度,也可以用以掩饰载荷的真实长度对抗流量分析。
  • 下一个头:表示紧跟在ESP头部后面的协议,其中值为6表示后面封装的是TCP。
  • 验证数据:是变长字段,只有选择了验证服务时才需要有该字段。

ESP的验证灵活,不验证外侧IP头部,这使得它能很好的兼容NAT。但是,这也使得接收端无法检测IP头部被修改的情况(只要保证校验和计算正确),故ESP的验证服务没有AH的验证服务强大。所以,AH主要用于验证IP头部,ESP主要用于加密,通常会将两者嵌套使用。

3. IPSec隧道

有了上文介绍的知识储备,就可以出新手村,挑战一下IPSec隧道这个boss了。

ipsec是一组协议,用于在不安全的网络上(互联网),建立安全的网络通信。

我们可以通过ipsec隧道将分公司和总部的内网连接起来,使分支的员工通过互联网安全的访问总部的资源,这里面的总部和分公司被称为two peers(local和remote),我们一般远程办公都会使用IPSec隧道或者SSL隧道。

两端会定义一些感兴趣的流量,这个流量是指满足一系列规则的流量,比如说某个网段或更复杂的acl策略,无论规则如何,如果一端发起的流量与其中这些规则匹配,则它就会被归为感兴趣的流量,并且会创建ipsec隧道,将该流量送到其目的地。当没有感兴趣的流量时,那么隧道最终被会被拆除,只有下次系统检测到感兴趣的流量来临时,隧道才会重新建立。

ipsec隧道提供了认证功能,因此只有相互验证的对等方才能连接,并且对于旁观者或中间人来说,ipsec隧道所承载的安全数据是加密的,且无法在不被检测到的情况下更改数据的内容。

ipsec隧道的常见架构如下:

3.1 隧道建立的两个阶段

3.1.1 (IKEv1 SA) Phase 1

  • Step1 :- 认证 双方交换证书或者使用预共享密钥进行认证,确认双方是对的人
  • Step2 :- 公钥交换 双方大大方方的交换彼此的公钥
  • Step3 :- DH密钥交换 双方通过自己的私钥和对方的公钥生成DH对称密钥
  • Step4:- 二阶段对称密钥生成 这个时候双方用DH密钥进行了加密通信,主要是交换了一些信息,协商了一下对称加密算法,用DES还是3DES,至此双方用DH密钥和交换的信息生成了一个新的对称密钥,我们称之为二阶段对称密钥

一阶段协商有两种模式,主模式和积极模式。主模式是IKEv1的默认模式,用6条消息完成协商,更加安全,积极模式用3条消息,虽然不太安全,但是快。

3.1.2 (IPSec SA) Phase 2

当主机使用主模式建立了相互的IKE SA后,这些SA被用来保护后续的密钥交换,使这个过程更轻量级。后续的交换称为快速模式或IKE第二阶段。

快速模式的目的是建立IPsec SA,即用于加密和解密应用数据的通道。

在预定的时间间隔(例如按时间或数据量)内,这些IPsec SA会被刷新,即生成和交换新的IPsec SA密钥。

  • Step1 :- HAGLE参数协商 这个阶段,双方使用一阶段产生的对称加密算法进行通信,会协商以下几个参数: Hashing哈希算法,用MD5还是SHA Authentication认证双方,是RSA数字签名还是PSK预共享密钥 DH Group用dh key的位数 Lifetime隧道生存的时间 Encryption加密算法,是DES,3DES还是AES
  • Step2 :- IPSec对称密钥生成 使用dh key加交换的信息,生成新的IPSec对称密钥
  • Step3 :- 多隧道创建 这部分隧道才是用来后续传输用户数据的通道,每个隧道是可以基于策略或路由的vpn生成多条IPSec安全关联路径的,比如定义哪些是感兴趣的流量。基于路由模式是统一用一个ipsec key,基于策略模式每个policy有自己独有的ipsec key

这也是种分层的设计思想,因为第一阶段非常缓慢且繁重,第二阶段相对就很快,所以当感兴趣流量没有时,IPSec隧道会将二阶段断开,但一阶段仍保留,这样感兴趣流量再来时可以迅速的重新立phase2。

3.2 隧道的两种模式

  • 传输模式 用于end-to-end模式,报文的ip头是原始的ip头 ESP/AH + IP头 + 数据(加密)
  • 隧道模式 用于site-to-site模式,用于网关之间,原始的报文已经被加密了,隧道模式会加上一个新的IP头,这有一个好处就是可以做nat穿越,相比于传输模式它不去校验原始ip头 新IP头 + ESP/AH + IP头(加密) + 数据(加密)

3.3 wireshark抓包IKEv2可视化

IKEv2简化了安全联盟的协商过程。IKEv2正常情况使用2次交换共4条消息就可以完成一个IKE SA和一对IPSec SA,如果要求建立的IPSec SA大于一对时,每一对SA只需额外增加1次交换,也就是2条消息就可以完成。

实验背景

  • 网关A(SiteA-Vpn10) 和 网关B(SiteB-Vpn30)
  • 使用的参数 SHA1-AES128-ESP
  • 双端公网IP: 217.182.214.221(A), 217.182.218.56(B)
  • 感兴趣的流量规则:Left 10.0.10.0/24 - Right 203.0.113.0/24

IKEv2协议是4条消息,这4条报文中,前两个报文是不加密的,使用的是UDP端口号500,这一阶段称为IKE_SA_INIT。后两个报文是加密的,使用的是UDP端口号4500,这一阶段称为IKE_AUTH。

第一个报文 初始方SPI设定一个随机值 响应方SPI设定为0

SA,KE,Nonce信息交换

​ 双方使用的安全套件提议

Nonce(Number used ONCE)数据用于增加安全性和防止重放攻击。Nonce是一个只使用一次的随机数或计数器,用于在密钥交换和认证过程中。​

DH算法以及互相交换的数字​

​ IKE版本,message id,通过使用Message ID,可以在IPsec会话中跟踪和识别不同的消息。它允许发送方和接收方在交换多个消息时进行匹配和关联,确保消息的正确顺序和处理。

​ 是否做nat探测​

第二个报文 和第一个报文差不多,回应发起方的给出安全套件信息,以及用于生成dh key的data​

第三个报文和第四个报文是用DH密钥对称加密的,我们装上插件,解开看看里面有什么信息

这部分涉及以下几个信息: 双方标识​

​ 感兴趣的流量范围,traffic selector​

认证信息,可以看出是用的PSK

IPSec SA用户隧道的一些HAGLE参数提议,算法之类的

后续的报文就是ESP加密的用户数据,两端是有SPI标识和ESP序列号了​

​ 解密后可以看到内层的用户报文​

Reference

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
  • 2. 一些涉及的概念
  • 2.1 对称加密
  • 2.2 非对称加密
  • 2.3 Diffie-Hellman(DH)密钥交换
  • 2.3 哈希
  • 2.4 认证
  • 2.5 AH与ESP协议
  • 3. IPSec隧道
  • 3.1 隧道建立的两个阶段
    • 3.1.1 (IKEv1 SA) Phase 1
      • 3.1.2 (IPSec SA) Phase 2
      • 3.2 隧道的两种模式
      • 3.3 wireshark抓包IKEv2可视化
      • Reference
      相关产品与服务
      验证码
      腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档