教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> Oracle >> 备份恢复 >> Linux中IP隧道的分析与建议 RSS订阅
Linux中IP隧道的分析与建议
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   

  作者: Wing
  摘要:由于网络的日益普及,网络的安全成为目前的热门话题。本文对隧道技术的分析,就侧重安全领域,对利用隧道技术实现虚拟专网提出建议。
  作者的话:
  
    本文系在阅读Linux源码及一些相关资料的基础上写成的。欢迎就文章的各个方面提出建议和批评意见,作者希望更多的交流和探讨。欢迎在保留原文完整性的前提下在网上转贴,需部分引用请通知作者。传统媒体转载和引用此文,请务必经过作者同意。欢迎在实际的应用中使用此文提出的思想,希望同时知会作者。
  
    作者信箱: xiaoman04@hotmail.com 欢迎来信!!
  
  **********************************************************************
    由于网络的日益普及,网络的安全成为目前的热门话题。本文对隧道技术的分析,就侧重安全领域,对利用隧道技术实现虚拟专网提出建议。
  
    为什么需要IP隧道?没有接触过这个概念的人自然提出这样的疑问。实际上概念最初的提出很简单,为了在TCP/IP网络中传输其他协议的数据包。设想IPX协议或 X.25封装的数据包如何通过Internet网进行传输,在已经使用多年的桥接技术中是通过在源协议数据包上再套上一个IP协议头来实现,形成的IP数据包通过Internet后卸去IP头,还原成源协议数据包,传送给目的站点。对源协议数据来说,就如被IP带着过了一条隧道。这种技术在业余无线网络(Amateur Packet Radio network,应该怎么翻,请告诉我)得到了最广泛的应用。
  
    利用IP隧道来传送的协议包也包括IP数据包,本文主要分析的IPIP封包就是如此,从字面来理解IPIP就对了,就是把一个IP数据包又套在一个IP包里。为什么要这么做呢?多此一举嘛。其实不然,见过一些应用就会明白,移动IP(Mobile-IP)和IP多点广播IP-Multicast)是两个通常的例子。目前,IP隧道技术在构筑虚拟专网( Virtual Private Network)中也显示出极大的魅力。本文也将对利用IP隧道技术构筑VPN做简单设想。
  
  背景:隧道的多种理解和实现
  
    Internet的研究者多年前就感到需要在网络中建立隧道,最初的理解是在网络中建立一条固定的路径,以绕过一些可能失效的网关。可以说,隧道就是一条特定的路径。这样的隧道是通过IP报头中的源路由选项来实现的,在目前看来,这个方法的缺 陷十分明显。要设置源路由选项就必须知道数据包要经过的确切路径,而且目前多数路由实现中都不支持源路由。
  
    另一个实现隧道的机制是开发一种新的IP选项,用来表明源数据包的信息,原IP头可能成为此选项的一部分。这种隧道的意义与我们所说的隧道已十分接近。但它的不足在于要对目前IP选项的实现和处理做较大的修改,也缺乏灵活性。
  
    最后常用的一种实现方法是开发一种新的IP封包协议,仍然套用当前的IP头格。通过IP封包,不须指明网络路径,封包就能透明地到达目的地。也可以通过封包 空间把未直接连接的机器绑在一起,从而创建虚拟网络。这种方法易行、可靠、可扩展性强,Linux采用了这一方法,这也是目前我们所理解的隧道思想。
  
  一、封包协议的结构和实现
  
    封包协议的实现原理十分简单。先看看通过隧道传送的数据报在网络中如何流动,如图一。
  
    为了叙述简便,我把在隧道中传送的IP数据包称为封包。
  
  
   -------------- -----------
   / 子网A / 子网C
   / /
   | | | |
   | & | | |
   | + +++++ | | ***** |
   | +++++ + | | * * |
   | + | | ***** * |
   + / ----------- * * / ----------
   ++> # * **>(#) * ***> # ++++
   -------------- / * * ------------ / +
   | * * | | + |
   | * * | | + |
   | ***** * | | +++++++ |
   | ***** | | V |
   | | | & |
   / /
   子网B / 子网D /
   ----------- ----------
   ++++++ 原数据报
   ****** 封装后的数据包(封包)
   # 封装/解封
   & 用户主机
   图一. 封包协议实现模型
  
    看图中的设备 #,分别处于隧道的两端,分别起打包(封装)和解包(解封)的作用,在整个数据包的传送路径中,除了隧道两端的 # 设备,其他网关把数据包看成一个普通的IP包进行转发。
  
    设备 # 就是一个封包基于的两个实现部件--封装部件和解封部件。封装和解封部件(设备)都应当同时属于两个子网。封装部件对接收到的数据报加上封包头 ,然后以解封部件地址作为目的地址转发出去;而解封部件则在收到封包后,还原原数据报,转发到目的子网。
  
    隧道的源端(封装部件)对进入隧道的数据包进行封装,形成封包。一个完整的封包如图二所示。
  
  
   / +-----------------+
   | | 封包IP头 |
   封包头 | +-----------------+
   | | 封包协议头 |
   +-----------------+
   / | 原协议头 |
   | +-----------------+
   | | |
   原数据报 | | 原协议数据 |
   | . .
   | . .
   | | |
   +-----------------+
   图二. 封包结构
  
  二、Linux中的实现
  
    本人分析的版本是Linux2.0.34(RedHat5.2采用)。
  
    在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头,恢复原
  
    数据包是它分内的事

来源:upschool.com.cn
作者:
关键字:分析,建议
发表日期:2007-1-6 0:43:22

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:OEM联机自动热备份全攻略(2)   下一篇:一起学习在linux下使用汇编语言(1)


2008-11-20 23:14:39
本文的相类似文章
  • 流氓软件及反流氓软件的技术分析
  • QQ蠕虫病毒原理分析与防御
  • 全面深入分析解剖恶意软件
  • 病毒杀不死的原因分析及对策
  • 江民公布“野兽”病毒分析报告
  • DDR2性能分析及展望
  • 内存条发生故障时的分析与解决
  • 光驱丢失的原因分析及解决办法
  • 鼠标典型故障的另类分析
  • 硬盘损坏全分析
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com