IPSec VPN 原理(转)

IPSEC是一套比较完整成体系的VPN技术,它规定了一系列的协议标准。如果不深入探究IPSEC的过于详细的内容,我们对于IPSEC大致按照以下几个方面理解。     1. 为什么要导入IPSEC协议     导入IPSEC协议,原因有2个,一个是原来的TCP/IP体系中间,没有包括基于安全的设计,任何人,只要能够搭入线路,即可分析所有的通讯数据。IPSEC引进了完整的安全机制,包括加密、认证和数据防篡改功能。      另外一个原因,是因为Internet迅速发展,接入越来越方便,很多客户希望能够利用这种上网的带宽,实现异地网络的的互连通。      IPSEC协议通过包封装技术,能够利用Internet可路由的地址,封装内部网络的IP地址,实现异地网络的互通。      2. 包封装协议     设想现实一种通讯方式。假定发信和收信需要有身份证(成年人才有),儿童没有身份证,不能发信收信。有2个儿童,小张和小李,他们的老爸是老张和老李。现在小张和小李要写信互通,怎么办?      一种合理的实现方式是:小张写好一封信,封皮写上 “小张–>;小李”, 然后给他爸爸,老张写一个信封,写上“老张–>;老李”, 把前面的那封信套在里面,发给老李,老李收到信以后,打开,发现这封信是给儿子的,就转给小李了。小李回信也一样,通过他父亲的名义发回给小张。     这种通讯实现方式要依赖以下几个因素:     * 老李和老张可以收信发信     * 小张发信,把信件交给老张。     * 老张收到儿子的来信以后,能够正确的处理(写好另外一个信封),并且重新包装过的信封能够正确送出去。     * 另外一端,老李收到信拆开以后,能够正确地交割小李。     * 反过来的流程一样。     把信封的收发人改成Internet上的IP地址,把信件的内容改成IP的数据,这个模型就是IPsec的包封装模型。小张小李就是内部私网的IP主机,他们的老爸就是VPN网关,本来不能通讯的两个异地的局域网,通过出口处的IP地址封装,就可以实现局域网对局域网的通讯。      引进这种包封装协议,实在是有点不得已。理想的组网方式,当然是全路由方式。任意节点之间可达(就像理想的现实通讯方式是任何人之间都可以直接写信互通一样)。      Internet协议最初设计的时候,IP地址是32位,当时是很足够了,没有人能够预料到将来Internet能够发展到现在的规模(相同的例子发生在电信短消息上面,由于160字节的限制,很大地制约了短消息的发展)。按照2的32次方计算,理论上最多能够容纳40亿个左右IP地址。这些IP地址的利用是很不充分的,另外大约有70%左右的IP地址被美国分配掉了(谁让人家发明并且管理Internet呢?)所以对于中国来说,可供分配的IP地址资源非常有限。      既然IP地址有限,又要实现异地lan-lan通讯,包封包,自然是最好的方式了。      3.安全协议(加密)     依然参照上述的通讯模型。     假定老张给老李的信件要通过邮政系统传递,而中间途径有很多好事之徒,很想偷看小张和小李(小张小李作生意,通的是买卖信息)通讯,或者破坏其好事。     解决这个问题,就要引进安全措施。安全可以让小李和小张自己来完成,文字用暗号来表示,也可以让他们的老爸代劳完成,写好信,交给老爸,告诉他传出去之前重新用暗号写一下。      IPSEC协议的加密技术和这个方式是一样的,既然能够把数据封装,自然也可以把数据变换,只要到达目的地的时候,能够把数据恢复成原来的样子就可以了。这个加密工作在Internet出口的VPN网关上完成。      4.安全协议(数据认证)     还是以上述通讯模型为例,仅仅有加密是不够的。     把数据加密,对应这个模型中间,是把信件的文字用暗号表示。      好事之徒无法破解信件,但是可以伪造一封信,或者胡乱把信件改一通。这样,信件到达目的地以后,内容就面目全非了,而且收信一方不知道这封信是被修改过的。      为了防止这种结果,就要引入数据防篡改机制。万一数据被非法修改,能够很快识别出来。这在现实通讯中间可以采用类似这样的算法,计算信件特征(比如统计这封信件的笔划、有多少字),然后把这些特征用暗号标识在信件后面。收信人会检验这个信件特征,由于信件改变,特征也会变。所以,如果修改人没有暗号,改了以后,数据特征值就不匹配了。收信人可以看出来。      实际的IPSEC通讯的数据认证也是这样的,使用md5算法计算包文特征,报文还原以后,就会检查这个特征码,看看是否匹配。证明数据传输过程是否被篡改。      5.安全协议(身份认证)     还是假定小张小李通讯模型。     由于老张和老李不在一个地方,他们互相不能见面,为了保证他们儿子通讯的安全。老张和老李必须要相互确认对方是否可信。这就是身份认证问题。      假定老李老张以前见过面,他们事先就约定了通讯暗号,比如1234567890对应abcdefghij, 那么写个255,对应就是一个bee。      常见的VPN身份认证可以包括预共享密钥,通讯双方实现约定加密解密的密码,直接通讯就可以了。能够通讯就是朋友,不能通讯就是坏人,区分很简单。      其他复杂的身份认证机制包括证书(电子证书比如x509之类的),比较罗里罗嗦,这里就不具体展开了,怕有兄弟看了打瞌睡。如果需要,可以找我要更具体的技术白皮书以及相关的身份认证文档。      如果有身份认证机制,密钥的经常更换就成为了可能。      6.其他     解决了上述的几个问题,基本可以保证VPN通讯模型能够建立起来了。     但是并不完美,这是最简单的VPN。即通过对端两个静态的IP地址,实现异地网络的互联。美国的很多VPN设备就作到这一级,因为美国IP地址充裕,分配静态IP地址没有问题。苦的是我等中国客户,2端都需要静态IP地址,相当于2根Internet专线接入。    上面用一个简单的模型向大家描述了VPN通讯的原理。IPSEC通过包封装包的方法,通过Internet建立了一个通讯的隧道,通过这个通讯的隧道,就可以建立起网络的连接。但是这个模型并非完美,仍然有很多问题需要解决。  在讲述其他问题以前,我们对VPN定义几个概念。      VPN节点:一个VPN节点,可能是一台VPN网关,也可能是一个客户端软件。在VPN组网中间,属于组网的一个通讯节点。它应该能够连接Internet,有可能是直接连接,比如adsl、电话拨号等等,也可能是通过nat方式,例如:小区宽带、cdma上网、铁通线路等等。      VPN隧道:在两个vpn节点之间建立的一个虚拟链路通道。两个设备内部的网络,能够通过这个虚拟的数据链路到达对方。与此相关的信息是当时两个VPN节点的IP地址,隧道名称、双方的密钥。      隧道路由:一个设备可能和很多设备建立隧道,那么就存在一个隧道选择的问题,即到什么目的地,走哪一个隧道?      用前面的通讯模型来说,老李老张就是隧道节点,他们通过邮政系统建立的密码通讯关系,就是一个数据隧道,小张和小李把信发给他们老爸的时候,他们老爸要作出抉择,这封信怎么封装,封装以后送给谁。假如还有一个老王和他们的儿子,也要通讯,这时候隧道路由就比较好理解了。送给小王的数据,就封装给老王,送给小李的数据,就封装发给老李。如果节点非常多,那么这个隧道路由就会比较复杂。      理解了以上的问题,我们就知道,ipsec要解决的问题其实,可以分为以下几个步骤:     找到对方vpn节点设备,如果对方是动态IP地址,那么必须能够通过一种有效途径能够及时发现对方IP地址的变化。按照通讯模型,就是老李老张如果经常搬家的话,必须有一个有效的机制,能够及时发现老李老张地址的变化。    建立隧道,建立隧道说起来简单,作起来不容易。如果两个设备都有合法的公网IP,那么建立一个隧道是比较容易的。如果一方在nat之后,那就比较罗嗦了。一般通过内部的vpn节点发起一个udp连接,再封装一次ipsec,送到对方,因为udp可以通过防火墙进行记忆,因此通过udp再封装的ipsec包,可以通过防火墙来回传递。    建立隧道以后,就确定隧道路由,即到哪里去,走哪个隧道。很多VPN隧道配置的时候,就定义了保护网络,这样,隧道路由就根据保护的网络关系来决定。但是这丧失了一定的灵活性。      所有的ipsec VPN展开来讲,实现的无非就是以上几个要点,具体各家公司,各有各的做法。但是可以肯定,目前在市场销售的VPN,肯定都已经解决了以上的问题。  第一个问题   怎样找到vpn节点设备。      假如设备都是动态拨号方式的话,那么一定需要一个合适的静态的第三方来进行解析。相当于两个总是不停搬家的人,要合适找到对方,一定需要一个大家都认识的朋友,这个朋友不搬家,两个人都能够联系上他。  静态的第三方,常见的有3种实现方式:      通过网页,这是深信服公司发明的一种技术,通过Web页解析ip地址。大家可以登录一下http://www.123cha.com/ ,就可以查找到当前的IP地址。因此,动态的设备,可以通过这种方式,把自己当前的IP地址提交上去。其他设备可以通过网页再查询回来。这样,设备之间就可以互相通过这个网页找到。因为网页是相对固定的,所以这种方式能够很有效地解决这个问题。这种方式能够有效地分散集中认证的风险,而且很容易实现备份,属于比较巧妙的一种解决方案。当然,对于Web页可能存在比较多的攻击,因此,要注意安全防范。      通过一个集中的服务器,实现统一解析,然后给用户进行分组。每个vpn设备只能看到同组的其他设备,不能跨组访问。也可以通过目录服务器实现。这种方式适合集中式的VPN,在企业总部部署服务器,实现全局设备的统一认证和管理。它不太适合零散用户的认证,因为存在一个信任问题,客户会置疑管理服务器如果出现了问题,有可能其他设备就能够连接到自己的vpn域里面。这种大型的集中vpn管理软件,在很多国内外的vpn厂商都有专门的设备或软件,它除了能够进行动态IP地址解析,还能够实现在线认证等等功能。如果管理中心比较职能的话,可以集中制订通讯策略,下面的vpn设备配置参数比较少。      还有一种方式,是DDNS,即动态域名。动态域名是一种相对比较平衡的技术。Vpn设备拨号以后,把自己当前的IP地址注册给一级域名服务器,并且更新自己的二级域名IP地址,internet其他用户,通过这个二级域名就可以查找到它。例如:动态域名服务器的名称是99ip.net,是abc. 99ip.net,则vpn设备通过一个软件,提交给服务器,把abc.99ip.net,漂移成当前的IP地址。但是,有时也会遇到dns缓存问题。Vpn厂家如果自身提供ddns服务的话,就可以通过内部协议,把查询速度加快,并且避免dns缓冲带来的问题。      以上讲述了三种动态IP地址的解析方法,国内一般厂家提供的无外乎这几种方法。如果再有比较偏门的技术,也许就不是主流技术了。      解决了动态IP地址问题,按照之前的通讯模型,不考虑VPN设备很多的情况,就可以组网。因此,一旦这种技术被越来越多的厂家掌握,基于IPsec vpn设备和软件是一定会价格下降的。It技术从朝阳变成夕阳就是转眼之间的事情。  第二个问题 隧道如何建立     解决了Ip地址动态寻址的问题,现在来说一下Nat穿越的问题。我们知道,Udp和TCP是可以穿越防火墙的。直接的IPsec封装,不能穿越防火墙,因为防火墙需要更改端口信息,这样回来的数据包,才能转到正确的内部主机。用UDP显然比较合适,因为使用tcp的话,不仅三次握手占据时间很长,而且还有来回的确认。而实际上,这些工作属于ipsec内部封装的报文要干的事情,放在这里完成是不合适的。因此,用udp来封装ipsec报文,以穿越nat,几乎是唯一可以选择的方案。      用udp穿越nat防火墙,这只解决了问题的一半,因为这要求至少有一方处于Internet公网上面。有可路由的IP地址。而有时会发生两个vpn节点都在nat之后的情景,这只能通过第三方转发来完成。即两个设备都可以与第三方设备互通,第三方设备为双方进行转发。这个可以通过之前的模型解析,老张老李不能直接通讯,他们都可以与老王通讯,老王就可以在中间进行转发。凡是小李小张的通讯,交给他们老爸以后,老王最后再进行转交。这是隧道路由的概念就很清晰了,不能一个隧道直接到达,可以在几个隧道之间转发。      所以,IPsec vpn并不神秘。所有核心的工作无非就是围绕以下几个方面展开:     如何找到与本VPN节点相关的其他节点。     协商出一个可以通讯的隧道。如果是nat之后,应该怎么处理。     建立隧道路由表,确定不同的目标地址,走不同的隧道。      假定以上的问题都得到了解决,通过某种方式,动态IP地址的VPN节点可以相互找到对方,并且能够建立隧道,因此也能够实现隧道路由通讯。是不是一个完整的VPN就能够实现了呢??      答案仍然是否,解决了以上问题,并不代表一个很好用的VPN产品,仍然有其他很多问题。之后的问题是围绕着复杂性展开的,简单的原理实现之后,剩下的工作就是要解决掉全部相关的边缘问题。才能够实现一个好用的东西。能够用是一回事,好用是另外一回事。

Google home not responding to ‘Hey Google’ but ‘Okay Google’

Recently I found my Google home becomes a bit silly. It never responds to my Hey Google command any more like before. However Okay Google still works. Also while playing my Google music playlists, it randomly stops and drops songs which is quite annoying. Then I notice in the version, its language value is Japanese which I set…

npm git private repo auth

Our enterprise Github recently made a change so all anonymous access from work laptop are blocked. This causes problem as we have some private repo dependencies in our package.json like below: dependencies { … “sun”: “git+https://github.kdc.capitalone.com/NeX/sun-ng2-nex.git”, … } Whenever I try to do npm install, it gives me authentication error. I can get it installed…

oauth grant types

Recently we need to integrate our frontend spa with oauth(call third party apis), Need to figure out which grand type fit which use case. The specification describes five grants for acquiring an access token: Authorization code grant Implicit grant Resource owner credentials grant Client credentials grant Refresh token grant So most common is 1 and…

you should never use WEP in router

Today I received another mail from Verizon saying my speed is upgraded to 75/75. However every time I test it is always 20/20. I also restart my router and even push the reset button at the back to do reset still no luck. So i decided to call them to see whether they throttled my bandwidth….

stateful firewall with inbound outbound traffic

Background I have worked as Devops for cloud migration in the recent 3 months without really writing much code. Even though being exposed to many AWS services like EMR/EC2/ASG(auto scaling group)/LC(launch config)/CF(cloud formation) etc.. with the need of setting up security groups(SG), i find myself still a bit confusing with inbound and outbound traffic rules….

DNS原理以及A/NS Record Cname

阮一峰 老师的一篇关于DNS的好博客,尤其喜欢里面对于分级查询以及A-Record, NS-Record, CNAME的解释, 简单明了, 所以转载了这一部分如下:   四、域名的层级 DNS服务器怎么会知道每个域名的IP地址呢?答案是分级查询。 请仔细看前面的例子,每个域名的尾部都多了一个点。 比如,域名math.stackexchange.com显示为math.stackexchange.com.。这不是疏忽,而是所有域名的尾部,实际上都有一个根域名。 举例来说,http://www.example.com真正的域名是http://www.example.com.root,简写为http://www.example.com.。因为,根域名.root对于所有域名都是一样的,所以平时是省略的。 根域名的下一级,叫做”顶级域名”(top-level domain,缩写为TLD),比如.com、.net;再下一级叫做”次级域名”(second-level domain,缩写为SLD),比如http://www.example.com里面的.example,这一级域名是用户可以注册的;再下一级是主机名(host),比如http://www.example.com里面的www,又称为”三级域名”,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。 总结一下,域名的层级结构如下。 主机名.次级域名.顶级域名.根域名 # 即 host.sld.tld.root 五、根域名服务器 DNS服务器根据域名的层级,进行分级查询。 需要明确的是,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。 所谓”分级查询”,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下。 从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址) 从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址) 从”次级域名服务器”查出”主机名”的IP地址 仔细看上面的过程,你可能发现了,没有提到DNS服务器怎么知道”根域名服务器”的IP地址。回答是”根域名服务器”的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。 下面是内置的根域名服务器IP地址的一个例子。 上面列表中,列出了根域名(.root)的三条NS记录A.ROOT-SERVERS.NET、B.ROOT-SERVERS.NET和C.ROOT-SERVERS.NET,以及它们的IP地址(即A记录)198.41.0.4、192.228.79.201、192.33.4.12。 另外,可以看到所有记录的TTL值是3600000秒,相当于1000小时。也就是说,每1000小时才查询一次根域名服务器的列表。 目前,世界上一共有十三组根域名服务器,从A.ROOT-SERVERS.NET一直到M.ROOT-SERVERS.NET。 六、分级查询的实例 dig命令的+trace参数可以显示DNS的整个分级查询过程。 $ dig +trace math.stackexchange.com 上面命令的第一段列出根域名.的所有NS记录,即所有根域名服务器。 根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问math.stackexchange.com的顶级域名服务器com.的NS记录。最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。 接着是第二段。 上面结果显示.com域名的13条NS记录,同时返回的还有每一条记录对应的IP地址。 然后,DNS服务器向这些顶级域名服务器发出查询请求,询问math.stackexchange.com的次级域名stackexchange.com的NS记录。 上面结果显示stackexchange.com有四条NS记录,同时返回的还有每一条NS记录对应的IP地址。 然后,DNS服务器向上面这四台NS服务器查询math.stackexchange.com的主机名。 上面结果显示,math.stackexchange.com有4条A记录,即这四个IP地址都可以访问到网站。并且还显示,最先返回结果的NS服务器是ns-463.awsdns-57.com,IP地址为205.251.193.207。 七、NS 记录的查询 dig命令可以单独查看每一级域名的NS记录。 $ dig ns com $ dig ns…

bcrypt 加密算法

The prefix “$2a$” or “$2b$” (or “$2y$”) in a hash string in a shadow password file indicates that hash string is a bcrypt hash in modular crypt format.[3] The rest of the hash string includes the cost parameter, a 128-bit salt (base-64 encoded as 22 characters), and B184 bits of the resulting hash value (base-64…

2015 in review

The WordPress.com stats helper monkeys prepared a 2015 annual report for this blog. Here’s an excerpt: The concert hall at the Sydney Opera House holds 2,700 people. This blog was viewed about 31,000 times in 2015. If it were a concert at Sydney Opera House, it would take about 11 sold-out performances for that many…

Create an alias for your gmail without creating a new account

When I apply my google account, I did not include my name in the user name. In some scenarios this might be not easy for others to recognize my email address like for example in the church’s mailing list. However I donot want another gmail account since it is too much to manage 2 email…

git pull fetch merge

Difference In the simplest terms, git pull does a git fetch followed by a git merge. You can do a git fetch at any time to update your remote-tracking branches under refs/remotes/<remote>/. This operation never changes any of your own local branches under refs/heads, and is safe to do without changing your working copy. I…

Security Stocks Bond Equities Shares 区别

Securities:证券,是各类财产所有权或债权凭证的通称,是用来证明证券持有人有权依票面所载内容,取得相就权益的凭证。所以,证券的本质是一种交易契约或合同,该契约或合同赋予合同持有人根据该合同的规定,对合同规定的标的采取相应的行为,并获得相应的收益的权利。按其性质不同可将证券分为证据证券,凭证证券和有价证券。有价证券又可分为:(1)资本证券,如股票、债券等;(2)货币证券,包括银行券、银行票据等;(3)财物证券,如货运单、提单、栈单等。 An instrument representing ownership (stocks), a debt agreement (bonds) or the rights to ownership (derivatives). A security is essentially a contract that can be assigned a value and traded. Examples of a security include a note, stock, preferred share, bond, debenture, option, future, swap, right, warrant, or virtually any other financial asset. Securities are…