陈茂科 刘鑫 黄辉 严程 李星
摘 要 隧道技术为IPv6端到端的分组穿越广泛分布的IPv4 Internet提供了虚拟链路。手工配置隧道效率很低,不适应于用户较多情况下IPv6虚拟网络的配置管理。隧道代理(TunnelBroker)技术实现了隧道的自动配置和管理。本文实现的隧道代理系统在可扩展性方面进行了改进。该系统已经在CERNET IPv6试验床上使用。
关键词 隧道 隧道代理 IPv6演进
1 引言
IPv6(Internet Protocol Version 6)[1]是面向下一代Internet设计的网络层协议。由于IPv6和IPv4的报文格式并不兼容,人们设计了多种过渡机制,令IPv6能够在今天广泛使用的IPv4基础设施上实现虚拟网络互连[2]。隧道(tunneling)技术由于满足IPv6端到端通信的要求得到广泛的使用。无状态的隧道技术——6 to 4需要特定的地址空间(2002::/16),形成的虚拟网络规模单一(只有/48)[3],而拓扑结构又太过于自由——任何两个IPv4节点之间都可以随时使用6 to 4的无状态虚拟链路,不适用于自治系统(AS)内有层次的IPv6网络的组织,而且IPv6其网络标识也依赖于IPv4的地址。因此在很多场合下,有状态的隧道技术[4]仍然得到重视,并且广泛应用于今天的IPv6试验网络和早期商用网络。
“隧道”技术的核心是把IPv6的报文封装在IPv4的报文中,使用现有的支持IPv4的互联网传送IPv6的报文。如果两个IPv6节点A和B之间建立了一条隧道,那么当节点A要向节点B发送IPv6报文时,它把IPv6报文封装在以节点B的IPv4地址为目的地址的IPv4报文中发送出去,节点B收到此报文后则解除IPv4封装,取其中的IPv6报文放入自己的IPv6协议栈。因此,一条隧道的配置至少隧道两端交换各自的IPv4地址信息。对于有状态隧道的配置而言,两对参数需要由双边网络管理员相互约定、手工配置和维护。管理工作量大、工作效率低、容易出错。尽管相对于无状态的6 to 4技术来说,有状态隧道技术有上面提到的优点,它的应用却因为上述手工配置的缺点而受到很大限制。一般,只在大网之间进行IPv6互连并且隧道的数目并不太多的时候,才会考虑采用手工方式管理和配置隧道。
因此,对于用户比较多的中等规模的ISP以及最终的网络来说,实现隧道的自动配置管理是很有必要的。隧道代理(Tunnel Broker)是实现这种自动配置管理的技术。RFC3053描述了隧道代理的基本原理和构成框架[5],具体实现时一般需要对细节部分进行重新设计。本文讨论为中国教育和科研计算机网(CERNET)IPv6试验床[6]主干网设计的隧道代理模型和软件实现的要点,着重阐述该设计不同于RFC3053的部分以及导致这些不同的原因。相对于早期的简化原型实现[7],现在运行的系统则完善了RFC3053涉及的所有主要功能模块,并在提高系统的可扩展性方面进行了重要的改进。实际的运行表明,本文所设计的隧道代理系统能够适应CERNET主干网以下快速组建简单IPv6虚拟网络的需要。
2 CERNET IPv6隧道代理系统的特点
RFC3053描述了隧道代理系统的主要构成和基本工作原理,但是并没有规定所有的实现细节;而对于其规定的部分,也并不一定适用于任何具体环境的需要。因此在设计实现隧道代理系统之前,必须给定设计的目标和界限,以确定对于RFC所建议的各项功能,是遵照实现还是进行调整、省略或增加。
在CERNET IPv6试验床上实现隧道代理的服务系统,是希望这个系统能够在试验床的学生实验部分的网络中担负NLA(Next-Level Aggregation)级别的地址分配和主干网接入,提供虚拟链路以及默认路由。因此,这样一个系统具有以下不同于一般隧道代理系统的特点。
首先,该系统是在主干网上运行的,这意味着系统的用户很可能不是简单的最终节点,而是不同规模的IPv6网络。这要求系统除了能够实现RFC3053提到的分配各种大小的网络前缀以外,还要能够妥善管理可供使用的地址空间,能够有效而经济地使用。因此,系统设计中增加了地址池(address pool)管理的功能。所实现的用户接口也允许用户选择希望拥有的地址块大小,考虑到IPv6地址空间聚类的要求[8],系统默认允许分配/48、/64和/128三种网络前缀;然而鉴于该建议并非强制的,所以允许不同的网络提供者在管理隧道代理系统的时候根据自己对IPv6地址聚类的理解配置地址池允许的使用方式。
其次,该系统的使用环境是教育和学术网络,由于IPv4地址资源的紧张,在这样的网络中动态分配IPv4地址的技术,如DHCP[9]以及拨号网络等,已经广泛使用。换言之,同一用户的IPv4地址很可能不是永久的,而是经常变化的。而IPv6地址空间的扩大提供了足够的空间,使得每个用户有理由获得至少一个相对恒定的IPv6地址。这意味着在CERNET的隧道代理系统当中,必要将IPv6的地址同用户的唯一标识相关联。而不是像一般的做法那样,将隧道的IPv6地址同它的IPv4地址相关联。这么做还会带来另外一个好处,即当用户变换其在IPv4基础网络中的位置的时候,它还能够使用同一个IPv6的地址访问全球的IPv6网络。RFC3053提到这种要求并建议了几种解决的办法,并不是十分理想。本文的工作则通过分离隧道注册和隧道激活的过程,充分利用隧道注册数据库来实现了这种功能。
系统同时遵循RFC3053的要求,为用户分配域名,同其相对恒定的IPv6地址相绑定。作为对RFC3053的一个扩展,系统同时具有对所分配的地址或地址块提供反向名字解析的功能。
第三,该系统提供的服务是试验性质而非商业运营,因此用户信息的法律问题、隐私问题、安全问题都不在重视的问题之列,也不要求用户填写复杂的地址使用注册表。相反,本系统强调提供快速组建IPv6虚拟网络的能力,效率即体现在服务端处理请求方面,也体现在用户端的操作方面。因此,在本系统设计中,不要求用户提交过于详细的注册信息,而是按照最少必要的要求规定用户必要提供身份标识、口令、请求的IPv6主机地址或网络前缀以及它的IPv4网络地址。用户的鉴权通过标识和口令的机制来实现。
系统采用C语言编写,以获得更高的执行效率和良好的可移植性。系统遵循RFC3053的建议,为客户端提供可以自动运行的脚本程序,以进一步简化隧道建立和维护的人工干预。
3 设计和实现
本隧道代理系统采用了客户/服务器模式。对隧道代理用户来说,整个系统是一个黑盒子,它接受用户的请求,执行用户需要的操作,然后向用户返回执行结果。如图1所示。
图1 隧道代理系统工作模型
3.1 基本工作单元
整个隧道代理系统的服务端由4部分组成,图2显示了图1中黑盒子的细节。
(1) 隧道服务器
隧道服务器的功能是提供到IPv6互联网的实际接入。在一个隧道代理系统中,隧道服务器可以有若干台,均接在IPv6互联网上并且同时支持IPv6和IPv4协议,用户与隧道代理系统之间的IPv6/IPv4隧道实际上是建立在用户的路由器或者主机与隧道服务器之间。隧道服务器通过监听某一特定TCP端口的进程来接受从隧道代理前端发来的指令,建立或者撤销与用户之间的IPv6/IPv4隧道。在隧道建立的同时,隧道服务器上的IPv6路由表也会做相应的修改,使得到用户所获得IPv6地址的路由指向用户的路由器或者主机;如果撤销隧道,同时也撤销到用户所获得IPv6地址的路由。同时,隧道的建立和删除均有记录,这样可以使得隧道代理服务器能够在任何时候恢复与用户之间的隧道,从而保持与整个隧道代理系统相一致的状态。
(2) 隧道信息数据库
隧道信息数据库是保存所有重要数据的地方。保存在隧道信息数据库中的信息包括:
· 用户注册信息:用户的唯一身份标识、用户口令。
· 用户状态信息:是否已建立隧道、上一次向隧道代理系统发送请求的时间、用户当前使用隧道的IPv4和IPv6地址。
· 隧道代理系统的IPv6地址分配策略:地址池信息、允许分配给主机和网络的前缀。 在实现上,数据库管理系统选择的是MySQL,其主要考虑是因为MySQL是一个运行在Linux和FreeBSD平台上的代码公开的免费数据库系统,同时又完整实现了关系数据库管理系统和SQL语言的全部标准。在具体编制C程序的时候,所有MySQL的API函数均封装在一套自定义的数据库操作函数中,这样大大增强了系统的可移植性:如果以后采用其它关系数据库管理系统,只需要重新定义这些数据库操作函数,而不需要再更改隧道代理系统的其它部分和数据库操作有关的代码。
(3) 域名服务器
域名服务器主要用来负责解析分配给每个用户的指向其某个IPv6地址的域名。同时,考虑到用户内部IPv6子网上的机器很有可能没有IPv4地址、无法使用IPv4网络中的域名服务器,此域名服务器配置为一台同时支持IPv4和IPv6的机器,以便用户的计算机可以通过IPv6使用此域名服务器的域名解析服务。
考虑到域名是非常有用的网络资源之一,隧道代理系统只给每个用户分配一个域名,而不给获得较大IPv6地址块的用户分配子域,因为子隧道代理系统完全无法控制用户对其子域的使用。
在本隧道代理系统中,用于提供域名服务的软件是BIND9。本系统的设计同时提供反向域名的解析和动态更新,这能够适应客户网络中某些需要验证域名和地址一致性的场合。
(4) 隧道代理前端
隧道代理前端是整个隧道代理系统与用户交互的部分,同时也是整个系统的核心控制部分。它通过HTTP协议与用户交互,接受用户的请求,控制隧道代理服务器等部分完成必要的操作,然后向用户返回操作执行的结果。如果用户是通过WWW浏览器发送的请求,则返回结果为完整的HTML页面;如果用户是通过使用隧道代理客户端程序发送的请求,则返回结果为一个特定格式的字符串。
隧道代理前端接受用户的如下请求:
· 查询隧道代理系统信息,包括域名服务器的IPv6地址、可分配哪几种大小的IPv6地址块等;
· 注册/撤销账号;
· 修改注册信息(包括用户密码);
· 查询用户注册信息;
· 建立/撤销IPv6/IPv4隧道;
· 查询用户当前状态。
隧道代理前端的软件主要由Apache服务器、一组CGI程序以及HTML页面组成,通过WWW服务的方式提供客户的访问。
为进一步实现隧道操作的自动化,隧道代理系统还提供一个客户端程序供运行Linux或者FreeBSD操作系统的用户使用。如果用户通过用WWW浏览器发送请求的方式建立或者撤销隧道,虽然隧道代理系统能够自动完成服务器一方的隧道设置,用户却还需要手工完成自己一方的隧道设置。隧道代理客户端程序的作用就是帮助用户完成本地的隧道设置。如果用户使用隧道代理客户端来发送操作隧道的请求,它就可以完成所有本地隧道配置和IPv6缺省路由设置的工作。并且,用户可以把使用隧道代理客户端建立/撤销隧道的命令写到启动/终止脚本里去,这样一开机就能自动接入IPv6互联网。
客户端程序仍然是通过访问隧道代理系统的WWW服务实现的。
3.2 隧道代理系统的工作流程
图2 隧道代理模型的构成和工作流程
图2同时描述了隧道代理系统的工作流程。用户使用隧道代理系统之前必须先请求注册(①),由隧道代理前端根据地址分配策略和用户的请求确定用户的IPv6地址(②),并动态更新域名解析(③),然后再将名字和地址信息写回数据库(④)并给予用户以应答(⑤)。用户需要使用隧道时,再发出请求给隧道代理前端(⑥),系统根据数据库中提供的信息(⑦)向服务器发出隧道操作的指令(⑧)并将隧道状态信息写入数据库(⑨),最后通知隧道的用户以完成隧道的设置(⑩)。
用户获得的IPv6地址可自由分配,并可随时向隧道代理系统发出请求建立IPv6/IPv4隧道以接入全球范围的IPv6互联网、或者拆除IPv6/IPv4隧道以脱离IPv6互联网。当不再需要使用隧道代理系统的时候,用户可以注销自己的账号以归还从隧道代理系统获得的IPv6地址。
4 结束语
综上所述,CERNET IPv6隧道代理系统的设计即遵循了RFC3053所提出的关于隧道代理的基本概念和基本结构,也为适应CERNET IPv6试验床的需要进行了必要的改进。所实现的系统具有以下的特点:(1)实现IPv6地址池和地址分配策略的定制,适应于不同规模的ISP的需要;(2) 在动态分配IPv4地址的环境中保持用户拥有固定的IPv6地址和域名,适应于IPv6地址时间上唯一性的要求;(3)不仅在服务器端实现自动配置和管理,也尽量提供客户端自动配置的手段,进一步提高操作效率;(4)采用标准的C语言在Linux和FreeBSD平台上实现,并且封装了数据库管理系统的API,整个系统易于移植到其它商用和非商用的UNIX类操作系统。
自2000年开发出第一个测试版本[7]以来,隧道代理的系统经过在CERNET IPv6试验床上使用测试后做了很大的改进,成为现在的版本。目前的隧道代理系统运行状况良好。用户反馈回来的主要意见集中在对网络连通性的抱怨,这是和IPv4基础设施的性能常常发生变化甚至出现故障有关的。因此,IPv6虚拟网络的构成如何适应IPv4基础网络的环境条件以及这种条件的变化就成为下一步努力的主要方向。这种努力对于任何虚拟网络互连的实践也将具有重大的意义。
摘自《电信科学》