Tuesday, May 8, 2007

Linux操作系统下IP隧道深入研究 -xxlinux.com

摘要

由于网络的日益普及,网络的安全成为目前的热门话题。本文对隧道技术的分析,就侧重安全领域,对利用隧道技术实现Linux下的虚拟专网提出建议。

VPN在表面上是一种联网的方式,比起专线网络来,它具有许多优点。在VPN中,通过采用一种所谓"隧道"的技术,可以通过公共路由网络传送数据分组,例如Internet网或其他商业性网络。

这里,专有的"隧道"类似于点到点的连接。这种方式能够使得来自许多源的网络流量从同一个基础设施中通过分开的隧道。这种隧道技术使用点对点通信协议代替了交换连接,通过路由网络来连接数据地址。隧道技术允许授权移动用户或已授权的用户在任何时间任何地点访问企业网络。

通过TUNNEL的建立,可实现以下功能:

将数据流量强制到特定的目的地;

隐藏私有的网络地址;

在IP网上传输非IP协议数据包;

提供数据安全支持;

协助完成用户基于AAA的管理。

隧道技术基础

隧 道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据桢(此字不正确)或包。隧道协议将 这些其它协议的数据桢或包重新封装在新的包头中发送。新的包头提供了路由信息,从而使封装的负载数据能够通过互联网络传递。

被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道。一旦到达网络终点,数据将被解包并转发到最终目的地。注意隧道技术是指包括数据封装,传输和解包在内的全过程。

隧道所使用的传输网络可以是任何类型的公共互联网络,本文主要以目前普遍使用Internet为例进行说明。此外,在企业网络同样可以创建隧道。隧道技术在经过一段时间的发展和完善之后,目前较为成熟的技术包括:

1. IP网络上的SNA隧道技术

当SNA的数据流通过企业IP网络传送时,SNA数据桢将被封装在UDP和IP协议包头中。

2. IP网络上的NovellNetWareIPX隧道技术

当一个IPX数据包被发送到NetWare服务器或IPX路由器时,服务器或路由器用UDP和IP包头封装IPX数据包后通过IP网络发送。另一端的IP-TO-IPX路由器在去除UDP和IP包头之后,把数据包转发到IPX目的地。

近几年不断出现了一些新的隧道技术,本文将主要介绍这些新技术。具体包括:

1. 点对点隧道协议(PPTP)

PPTP协议允许对IP,IPX或NetBEUI数据流进行加密,然后封装在IP包头中通过企业IP网络或公共互联网络发送。

2. 第2层隧道协议(L2TP)

L2TP协议允许对IP,IPX或NetBEUI数据流进行加密,然后通过支持点对点数据报传递的任意网络发送,如IP,X.25,桢中继或ATM。

3.安全IP(IPSec)隧道模式

IPSec隧道模式允许对IP负载数据进行加密,然后封装在IP包头中通过企业IP网络或公共IP互联网络如Internet发送。

隧道协议

为创建隧道,隧道的客户机和服务器双方必须使用相同的隧道协议。

隧 道技术可以分别以第2层或第3层隧道协议为基础。上述分层按照开放系统互联(OSI)的参考模型划分。第2层隧道协议对应OSI模型中的数据链路层,使用 桢作为数据交换单位。PPTP,L2TP和L2F(第2层转发)都属于第2层隧道协议,都是将数据封装在点对点协议(PPP)桢中通过互联网络发送。第3 层隧道协议对应OSI模型中的网络层,使用包作为数据交换单位。IP overIP以及IPSec隧道模式都属于第3层隧道协议,都是将IP包封装在附加的IP包头中通过IP网络传送。

提 供PPTP客户机和PPTP服务器之间的加密通信。PPTP客户机是指运行了该协议的PC机,如启动该协议的Windows95/98;PPTP服务器是 指运行该协议的服务器,如启动该协议的WindowsNT服务器。PPTP是PPP协议的一种扩展。它提供了一种在互联网上建立多协议的安全虚拟专用网 (VPN)的通信方式。远端用户能够透过任何支持PPTP的ISP访问公司的专用网。

通 过PPTP,客户可采用拨号方式接入公用IP网。拨号用户首先按常规方式拨到ISP的接入服务器(NAS),建立PPP连接;在此基础上,用户进行二次拨 号建立到PPTP服务器的连接,该连接称为PPTP隧道,实质上是基于IP协议的另一个PPP连接,其中的IP包可以封装多种协议数据,包括 TCP/IP、IPX和NetBEUI。PPTP采用了基于RSA公司RC4的数据加密方法,保证了虚拟连接通道的安全。对于直接连到互联网的用户则不需 要PPP的拨号连接,可以直接与PPTP服务器建立虚拟通道。PPTP把建立隧道的主动权交给了用户,但用户需要在其PC机上配置PPTP,这样做既增加 了用户的工作量,又会给网络带来隐患。另外,PPTP只支持IP作为传输协议。

第2层转发(L2F)

L2F 是Cisco公司提出隧道技术,作为一种传输协议L2F支持拨号接入服务器将拨号数据流封装在PPP桢内通过广域网链路传送到L2F服务器(路由器)。 L2F服务器把数据包解包之重新注入(inject)网络。与PPTP和L2TP不同,L2F没有确定的客户方。应当注意L2F只在强制隧道中有效。(自 愿和强制隧道的介绍参看“隧道类型”)。


第2层隧道协议(L2TP)

L2TP隧道协议是典型的被动式隧道协议,它结合了L2F和PPTP的优点,可以让用户从客户端或访问服务器端发起VPN连接。L2TP是把链路层PPP帧封装在公共网络设施如IP、ATM、帧中继中进行隧道传输的封装协议。

L2TP 主要由LAC(L2TP Access Concentrator) 和LNS(L2TP Network Server) 构成,LAC支持客户端的L2TP,用于发起呼叫、接收呼叫和建立隧道;LNS是所有隧道的终点,LNS终止所有的PPP流。在传统的PPP连接中,用户 拨号连接的终点是LAC,L2TP使得PPP协议的终点延伸到LNS。

L2TP 的好处在于支持多种协议,用户可以保留原有的IPX、Appletalk等协议或公司原有的IP地址。L2TP还解决了多个PPP链路的捆绑问题,PPP 链路捆绑要求其成员均指向同一个NAS(Network Access Server),L2TP可以使物理上连接到不同NAS的PPP链路,在逻辑上的终结点为同一个物理设备。L2TP还支持信道认证,并提供了差错和流量控 制。

L2TP 利用IPsec增强了安全性,支持数据包的认证、加密和密钥管理。L2TP/IPSec因此能为远程用户提供设计精巧并有互操作性的安全隧道连接。这对安 全的远程访问和安全的网关之间连接来说,它是一个很好的解决方案。因此,安全的VPN需要同时解决好L2TP和IPSec这两个不同的问题。L2TP协议 解决了穿过IP网络的不同用户协议的转换问题;IPSec协议(加密/解密协议)解决了通过公共网络传输信息的保密问题。

IP网上的L2TP使用UDP和一系列的L2TP消息对隧道进行维护。L2TP同样使用UDP将L2TP协议封装的PPP桢通过隧道发送。可以对封装PPP桢中的负载数据进行加密或压缩。 PPTP与L2TP

PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。尽管两个协议非常相似,但是仍存在以下几方面的不同:

PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接。L2TP可以在IP(使用UDP),桢中继永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。

PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道。使用L2TP,用户可以针对不同的服务质量创建不同的隧道。

L2TP可以提供包头压缩。当压缩包头时,系统开销(overhead)占用4个字节,而PPTP协议下要占用6个字节。

L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道。

IPSec隧道模式

IPSEC 是第3层的协议标准,支持IP网络上数据的安全传输。本文将在“高级安全”一部分中对IPSEC进行详细的总体介绍,此处仅结合隧道协议讨论IPSEC协 议的一个方面。除了对IP数据流的加密机制进行了规定之外,IPSEC还制定了IPoverIP隧道模式的数据包格式,一般被称作IPSEC隧道模式。一 个IPSEC隧道由一个隧道客户和隧道服务器组成,两端都配置使用IPSEC隧道技术,采用协商加密机制。

为 实现在专用或公共IP网络上的安全传输,IPSEC隧道模式使用的安全方式封装和加密整个IP包。然后对加密的负载再次封装在明文IP包头内通过网络发送 到隧道服务器端。隧道服务器对收到的数据报进行处理,在去除明文IP包头,对内容进行解密之后,获的最初的负载IP包。负载IP包在经过正常处理之后被路 由到位于目标网络的目的地。

IPSEC隧道模式具有以下功能和局限:

只能支持IP数据流;

工作在IP栈(IPstack)的底层,因此,应用程序和高层协议可以继承IPSEC的行为。

在Linux中,隧道的实现主要基于两个文件new_tunnel.c和ipip.c。同时Linux定义了一种新的协议类型--IPIP(IPPROTO_IPIP),与上面所说封包类型类似。

基本思路

在Linux中IP Tunnel的实现也分为两个部件:封装部件和解封部件,分别司职发送和接收。但这两个部分是在不同的层次以不同的方式实现的。封装部件是在数据链路层以虚设备的方式实现。所有源代码见:

  
  /usr/src/linux/drivers/net/new_tunnel.c

  

为实现封装,Linux实现一个称为tunl的网络设备(类似loopback设备),此设备具有其他网络设备共有的特征,对于使用此设备的上层应用来说,对这些网络设备不加区分,调用及处理方法当然也完全一样。

tunnel_init()和tunnel_xmit()是new_tunnel.c中的两个主要过程。

tunnel_init ()初始化与设备tunl相关的device结构。而tunnel_xmit()在从tunl设备发送数据时被调用,tunl设备作为实现IP隧道技术的 封装部分,在此过程中完成对相应的数据报进行封装所需的全部操作,形成IPIP类型的IP包,并重新转发此数据包(ip_forward())。

解码器在IP的上层实现,系统把它作为一个虚的传输层(实际上与传输层毫无关系),具体处理见文件:

  
  /usr/src/linux/net/ipv4/ipip.c。

 

我 们知道,每一个IP数据包均交由ip_rcv函数处理,在进行一些必要的判断后,ip_rcv对于发送给本机的数据包将交给上层处理程序。对于IPIP包 来说,其处理函数是ipip_rcv(就如TCP包的处理函数是tcp_rcv一样,IP层不加区分)。也就是说,当一个目的地址为本机的封包到达后, ip_rcv函数进行一些基本检查并除去IP头,然后交由ipip_rcv解封。ipip_rcv所做的工作就是去掉封包头,还原数据包,然后把还原后的 数据包放入相应的接收队列(netif_rx())。

从 以上IP Tunnel实现的思想来看,思路十分清晰,但由于IP Tunnel的特殊性,其实现的层次并不单纯。实际上,它的封装和解封部件不能简单地象上面所说的那样分层。tunl设备虽应算进链路层,但其发送程序中 做了更多的工作,如制作IPIP头及新的IP头(这些一般认为是传输层或网络层的工作),调用ip_forward转发新包也不是一个网络设备应当做的 事。可以说,tunl借网络设备之名,一把抓干了不少工作,真是‘高效’。而解封部件宏观上看在网络层之上,解出IPIP头,恢复原数据包是它分内的事, 但在它解出数据包(即原完整的协议数据包)后,它把这个包放入相应的协议接收队列。这种事可不是一个上层协议干的,这是网络设备中断接收程序的义务。看到 了,在这点上,它好象到了数据链路层。

三、为实现VPN的扩展

实 际上Linux只为实现隧道机制提供了一个框架,图二中的封包协议头在Linux中被忽略了,也就是说,封包头只含封包IP头,其后紧跟原IP数据包。这 样的结构用于传输公开数据没有关系,但对于一个VPN来说,安全保密是不可缺少的重要功能。我们希望通过隧道的数据可靠且不可窃取和冒充的,那么,加密和 认证就必不可少。为实现这一构想,设计以下封包协议头:

  
  
   0 4 8 16 24 31
   +-----+-----+-----------+------------------------+
   | ver |type | hlen | OldPacketLen |
   +-----------------------+------------------------+
   | DeviceID | EncapID |
   +-----------------------+------------------------+
   | Flags | CheckSum |
   +------------------------------------------------+
   | IPIP Options( If any ) |
   +------------------------------------------------+
   . | padding |
   . .
   +------------------------------------------------+
  
图三 IPIP头设想图

ver: 版本号,利于扩展;

type: 用于建立不同目的的隧道(可能处理上有差别);

OldPacketLen: 进入隧道的原数据包长度;

DeviceID: 对数据包进行封装的设备标识;

EncapID: 此封包的ID号。

Flags: 标志位,共16位,初步定义如下:

0 保留;

1 有否加密;

2 有否做摘要;

3 有否签名;

4 保留;

5 有否传送消息密钥;

6 消息密钥有否加密;

7 消息密钥是否需保留;

8-15 保留。

CheckSum: 头校验

IPIP Options: 用来传送一些必要的数据,比如消息密钥、签名等。

格式:

  +-------------------------------------+
  | 类型 | 长度 | 数据 ... |
  +-------------------------------------+

好了,有了这个东西,我们就可以扩展Linux IP Tunnel为我们的VPN服务了。首先,改写new_tunnel.c和ipip.c两个文件,加入对IPIP头的处理。

接着,我们要实现一种密钥的管理和传送机制。当然,对称密钥是必需的,而对IP数据包加密要使用序列密码。从全体考虑,我们可以提出建立VPN的逻辑步骤;

1、准备工作:建网安装系统完成配置等等;

2、隧道的两端分别向对方发送自己的公开密码和设备号;

3、如有必要,产生序列密码,后加密签名传给对方;

4、正常通信,----放心,你的数据已经很保险了。

在一个VPN的隧道中,一个封包的格式应如图四所示。

 

 
  
   / +-----------------+
   | | 封包IP头 |
   封包头 | +-----------------+
   | | 封包协议头 |
   +-----------------+
   / | |
   | | 原协议头 |
   | | 及 |
   封包数据 | | 原协议数据 |
   | . (密文) .
   | . .
   | | |
   +-----------------+
  
图四 VPN封包结构

你的几种使用方法

事情往往不能两全其美,你在安全强度和通信速度上必须作出选择,(不然你就需要在安全强度和Money的耗费中做选择。)使用这样的协议,根据你的需求不同,你可有不同的使用方法,下面列举一些:

跨Internet的公司多个内部网之间进行通信,保密性并不重要直接使用原框架机制,无任何加密措施这样速度快、效率高,公司也不用申请多个IP地址,方便可行

一般性的商业应用,具有保密要求利用事先产生的序列密码,每次对原数据包加密安全度提高了,是一种十分实用的方法。只要强度足够,一般很难破译速度快

密码不变的方式你认为不够安全你可以自己实现一种密码传送方法,每隔一段时间更换一次密码。其中一些握手关系需要完善,有兴趣的欢迎探讨。如果发展成熟,此法相信很有前途。

高 度机密领域:敬请使用一次一密,并进行每次签名。每次产生新密钥和签名十分费时,在目前我国Internet网络的速度下几乎不可行。但相信有此需要的部 门也能够设法提高其网络带宽,让网络状况适合这种应用。另外,当然还可以就加密强度自身作出选择,比如选择128位,还是512位、1024位

四、待完善

主 要牵涉到隧道的管理,在封包的传送过程中如果出现错误是十分正常的,当一台路由器检测到错误时,它会发送一个ICMP包给隧道的发送端,但遗憾的是 ICMP返回的数据除了IP头外,只含8个字节的上层协议信息。只凭这个难以对ICMP信息作出反应,因此,在隧道端保留一些状态信息是必须的。这些信息 主要包括:

隧道的另一端的可达性;

隧道的拥塞状况;

隧道的MTU。

同时所发送的封包信息也是需要保留的,举例说,当一个路由不可达信息到来时,封包的发送者要能够找出所封装的数据来自何方,并发送相应的ICMP包。

No comments:

如何发掘出更多退休的钱?

如何发掘出更多退休的钱? http://bbs.wenxuecity.com/bbs/tzlc/1328415.html 按照常规的说法,退休的收入必须得有退休前的80%,或者是4% withdrawal rule,而且每年还得要加2-3%对付通胀,这是一个很大...