IPv6过渡阶段基于双栈反向代理技术的应用研究
2018-03-09邓庚盛鄢志辉邹伟平鲁喆
文/邓庚盛 鄢志辉 邹伟平 鲁喆
为了降低IPv6过渡阶段IPv4/IPv6 Web服务的部署难度,加快向IPv6过渡的进程,文章针对IPv6过渡的4个阶段制定了Web服务基于双栈反向代理方案和渐进式的过渡策略。通过在双栈环境下部署反向代理服务,同时分别监听IPv4和IPv6服务端口,并结合DNS域名设置,来实现支持IPv4/IPv6双栈的Web服务,使得纯IPv4和纯IPv6用户均可访问。文章对反向代理后Web内容可能存在跨站跨协议资源访问的问题提出了增加过滤转换器的解决方法。与其他常用的双栈、网络翻译等过渡机制相比,采用基于双栈反向代理方式对于Web应用的IPv6过渡有明显的优势,无需对现有网络进行任何变更就可以快速部署,不需要公网双栈和无状态网络翻译机制所要求的公网地址,而且在用户和服务之间增加了隔离屏障,提高了服务的安全性。
自从全球地址分配机构(IANA)于2011年2月3日正式宣布,将其最后的IPv4地址平均分配到全球5个地区的互联网络信息中心后,目前仅剩下非洲互联网信息中心(AFRINIC)可正常分配IPv4地址[1]。IPv4向IPv6的全面过渡更加紧迫,但由于互联网的复杂性和多样性,这个过渡必将是一个漫长的过程。由于IPv4协议和IPv6协议本质上不兼容,在过渡阶段如何快速有效的向纯IPv4和纯IPv6用户提供支持IPv4/IPv6的服务,最终实现平滑过渡,是必须要考虑和解决的问题。
本文首先介绍了IPv6过渡阶段的Web服务过渡机制,然后设计了采用双栈反向代理服务实现同时支持IPv4/IPv6的Web服务方案,并针对IPv6过渡的4个阶段制定了双栈反向代理的过渡策略,最后对基于双栈反向代理的方案与其他常用过渡机制进行比较并得出结论。
IPv6过渡阶段的Web服务过渡策略介绍
文献[2]将IPv6过渡分为4个阶段:纯IPv4(阶段0),IPv4为主、存在少量的IPv6(阶段1),IPv6为主、存在少量的IPv4(阶段2)和纯IPv6(阶段3)。由于阶段0和阶段3通信需求仅限于IPv4、IPv6同协议访问,其中阶段1和阶段2的不同点在于纯IPv4网络、双栈网络、纯IPv6网络接入类型所占比例的多少。本文主要讨论阶段1和阶段2的场景,需要同时满足终端IPv4/IPv6用户访问IPv6/IPv4 Web服务的需求。见表1,只有双栈方式接入的终端用户能够访问所有的IPv4/IPv6服务,纯IPv4用户不能访问纯IPv6服务,纯IPv6用户不能访问纯IPv4服务。要满足所有终端用户同时能够访问IPv4/IPv6服务,需要终端用户通过IPv4-over-IPv6或IPv6-over-IPv4隧道的方式建立另外一种协议的通信通道,隧道的建立需要终端用户做一定的配置,对于情况各异的用户来说难以大规模使用。
表1 终端用户在IPv6过渡阶段访问IPv4/IPv6Web服务的方式
因此,需要从Web服务端实现纯IPv4和纯IPv6用户的访问,通常有以下两种方法:(1)服务器基于双栈提供Web服务,原生支持IPv4/IPv6;(2)IPv4-IPv6翻译,通过一个翻译模块将IPv4 数据包和IPv6 数据包互相转换,翻译机制可以分为无状态翻译,如SIIT(stateless IP/ICMP translation)和IVI(IV stands for 4 and VI stands for 6),以及有状态翻译,如NAT-PT(NAT-protocol translation)和 NAT64。[3-5]
Web服务本身采用双栈方式是首选,它可避免因转换导致的任何复杂性,并为服务器提供最多信息。[6]双栈方式需要整个链路上的设备均支持双栈,包括服务器和应用本身,这意味着可能涉及到网络改造和软硬件设备更新,且公网双栈需要消耗公网IPv4地址。IPv4-IPv6翻译机制需要在边界部署路由或网关,无状态翻译机制不需要维护会话的状态,具有一定的灵活性,但它是以消耗IPv4地址空间的代价来实现双向通信,有状态翻译机制需要翻译器维护一个动态的地址(地址和端口)映射和一个IPv4地址资源池。
由于公网双栈方式和无状态翻译机制Web服务本身需要消耗公网IPv4地址空间,他们没有解决IPv6协议主要解决的地址空间的问题;私网双栈虽然不消耗公网IPv4地址但仍然需要链路上设备的支持;另外,私网双栈和有状态翻译机制需要部署路由或网关并维护会话状态,增加了网络复杂性。因此,为了降低IPv6过渡期间Web服务部署实施的复杂度,本文提出采用双栈反向代理的方式实现过渡时期对Web服务的访问,通过将反向代理服务器部署在双栈环境中,Web服务可以只接入纯IPv4或纯IPv6,不需要对现有网络结构做任何改变,进而逐步完成向IPv6的过渡。
双栈反向代理服务方案的设计
反向代理是指由代理服务器来接收来自互联网的访问请求,再把访问请求转发到对应的网站服务器,并从对应网站服务器获取结果返回给访问用户。[7]对于终端用户来说,用户正常访问网页即可,不需要做任何改变或配置。文献[7-10]介绍了反向代理在Web服务中的应用,并介绍了在安全、负载均衡、公网地址消耗等方面的优势,但这些文献均未涉及IPv4/IPv6双栈环境的场景。
双栈反向代理的方式是指将反向代理服务器部署在双栈环境中,同时分别监听IPv4和IPv6服务端口,Web服务可以只接入纯IPv4或纯IPv6网络,纯IPv4和纯IPv6终端用户可以通过反向代理服务器进行代理访问另一协议的Web服务。由于采用双栈代理后Web内容可能存在跨协议的资源引用问题,本文设计采用在反向代理服务内设置过滤转换器和通用代理器来实现跨协议访问。
1.双栈反向代理服务的网络设计
IPv6过渡阶段双栈反向代理部署网络结构如图1所示。双栈反向代理服务器部署在双栈网络中,同时监听IPv4/IPv6的服务端口:
(1) 对于纯IPv4用户,在一侧作为IPv4服务器,另一侧作为IPv6客户端,将来自IPv4客户端的请求代理到IPv6服务器。
图1 IPv6过渡阶段双栈反向代理部署网络结构示意
(2) 对于纯IPv6用户,在一侧作为IPv6服务器,另一侧作为IPv4客户端,将来自IPv6客户端的请求代理到IPv4服务器。
双栈反向代理服务器部署比较灵活,部署的位置取决于网络的哪个部分可以支持双栈,不需要对现有网络结构做任何变更,又实现了双栈Web服务。即使整个网络没有IPv6或IPv4,也可以在外部支持双栈的数据中心托管自己的反向代理服务器,实现IPv4/IPv6的服务。由于跨协议访问服务是由反向代理服务器中转完成的,因此服务内容的管理维护与之前没有变化,不需要考虑IPv4和IPv6不同的情况。
2.双栈反向代理服务的域名服务设计
在反向代理服务的部署实施过程中,结合DNS(域名服务)配置可以更好地实现Web服务的快速部署。本文中Web服务域名设计如下:域名为example.com和example6.com,其中example.com域下的子域名同时配置A记录和AAAA记录,example6.com域下的子域名仅配置AAAA记录,在实际应用中可以选择不使用example6.com域名。其中A记录是用来创建到IPv4地址的记录,AAAA记录是用来创建到IPv6地址的记录。
假定双栈反向代理服务器的IPv4和IPv6的地址分别为222.204.33.99和2001:250:6c00::3:99,以处于纯IPv4网络中域名为lib.example.com(ipv4地址为222.200.3.200)和处于纯IPv6网络中域名为6.example.com(IPv6地址为2001:250:6c00::210:201)的Web服务站点为例介绍域名设置方式。具体域名配置时将原本纯IPv4服务域名lib.example.com和lib.example6.com的AAAA记录指向反向代理服务器的IPv6地址2001:250:6c00::3:99,将原本纯IPv6服务域名6.example.com对应的A记录指向反向代理服务器的IPv4地址222.204.33.99。当纯IPv4或纯IPv6用户访问原本只有另一协议网络的Web服务时,域名将解析至反向代理服务器进行代理访问。
3. 双栈反向代理服务的数据处理流程
双栈反向代理服务部署后,纯IPv4用户可以通过反向代理服务器进行代理访问原本IPv6的Web服务,纯IPv6用户也可以通过反向代理服务器进行代理访问原本IPv4的Web服务,图2为用户通过双栈反向代理访问Web服务的数据流向示意图。
IPv6用户通过反向代理访问原本IPv4服务lib.example.com的主要过程如下。
步骤1:用户发起访问请求,DNS解析出该域名对应的AAAA记录2001:250:6c00::3:99,访问请求被定位至反向代理服务器的IPv6监听端口,这个过程基于IPv6协议;
步骤2:反向代理服务器得到用户访问请求,将访问请求转发至原本IPv4的Web服务,请求IP为反向代理的IPv4地址222.204.33.99,服务的IP地址为222.204.31.200,这个过程基于IPv4协议;
步骤3:Web服务器接收到转发的访问请求,将响应内容反馈至反向代理服务器,这个过程基于IPv4协议;
图2 双栈反向代理数据流向示意
步骤4:反向代理服务器通过IPv6地址2001:250:6c00::3:99的服务监听端口将内容返回给用户,这个过程基于IPv6协议。
类似的,IPv4用户通过反向代理访问原本IPv6服务6.example.com的过程如下。
步骤1:用户发起访问请求,DNS解析出该域名对应的A记录222.204.33.99,访问请求被定位至反向代理服务器的IPv4监听端口,这个过程基于IPv4协议;
步骤2:反向代理服务器得到用户访问请求,将访问请求转发至原本IPv6的Web服务,请求IP为反向代理的IPv6地址2001:250:6c00::3:99,服务的IPv6地址为2001:250:6c00::210:201,这个过程基于IPv6协议;
步骤3:Web服务器接收到转发的访问请求,将响应内容反馈至反向代理服务器,这个过程基于IPv6协议;
步骤4:反向代理服务器通过IPv4地址222.204.33.99的服务监听端口将内容返回给用户,这个过程基于IPv4协议。
由于双栈用户访问Web服务时只会选择其中一种协议进行通信,在此不另做考虑。
从反向代理访问Web服务的过程可以看到,对于用户来说反向代理服务器就是目的服务器,用户并不知道位于反向代理服务器之后的Web服务的真实IP地址,这样就很好地保护了后端Web服务的资源安全。
4.双栈反向代理服务跨站跨协议资源的处理
双栈反向代理使得原本在单一网络的Web服务有了双栈服务能力,但是当纯IPv4/IPv6用户通过代理访问Web服务时,如果被代理的Web服务内容中引用了外站的资源,使用代理服务后可能会遇到跨站、跨协议不能访问的问题。例如常用的jquery的官网提供的CDN服务code.jquery.com仅支持IPv4,当IPv4服务lib.example.com页面内容引用了脚本“http://code.jquery.com/jquery-3.2.1.min.js”,IPv6用户通过反向代理访问lib.example.com时就会遇到因引用失败而导致页面功能失效的问题。
为提高用户体验,解决此类跨站跨协议资源引用的问题,本文在反向代理服务器中设置了过滤转换器和一个通用代理Proxy模块,过滤转换器主要实现对Web服务返回的内容进行处理,通用代理Proxy模块主要用于实现代理访问过滤转换后的URL资源。通用代理Proxy同时监听IPv4和IPv6端口,同时配置域名proxy.example.com的A记录和AAAA记录指向反向代理服务器。
反向代理服务器处理跨站跨协议资源处理步骤如下。
步骤1:反向代理服务器接收到返回的服务内容;
步骤2:判断是否为“text/html”格式,如果是进入步骤3,否则进入步骤5;
步骤3:检测内容中是否包含绝对URL地址的资源引用,通常格式如src=http://a.b.c和href=http://a.b.c;
步骤4:将绝对URL地址替换为本地代理访问的URL,如将src=http://a.b.c替换为src=http://proxy.example.com/?url=http://a.b.c;
步骤5:反向代理服务器将过滤后的内容返回终端用户;
步骤6:用户浏览器接收到返回的内容进行展示,其中的跨站跨协议的资源由于URL地址已经替换,访问请求将自动解析至反向代理服务器中的通用代理Proxy;
步骤7:通用代理Proxy代理访问并将访问结果返回用户浏览器。
完成处理后,终端用户对这部分跨站跨协议的资源访问也通过双栈反向代理访问,如图3所示。
5. 双栈反向代理的过渡策略设计
根据Web服务区域的IPv6过渡的4个阶段,可制定如下双栈反向代理过渡策略,最终实现IPv6的过渡:
(1)阶段0(纯IPv4):这个阶段网络中没有IPv6网络,此时可以将反向代理部署在外部支持双栈的数据中心,将AAAA记录指向反向代理服务器,IPv4用户直接访问原有网站服务,IPv6用户通过反向代理访问。
图3 双栈反向代理跨站跨协议资源访问数据流向示意
图4 ab -n 1OOO -c 1O时代理前后服务响应时间
(2)阶段1(IPv4为主、存在少量的IPv6)和阶段2(IPv6为主、存在少量的IPv4):这两个阶段部署策略是一样的,在双栈区域部署反向代理,通过代理访问纯IPv6和纯IPv4的Web服务。当新建Web服务或升级改造时部署至双栈或纯IPv6区域,通过改变域名的A记录和AAAA记录的指向,使得IPv4用户访问时通过反向代理访问,IPv6用户直接访问,这样逐步完成向IPv6的过渡。
(3) 阶段3(纯IPv6):这个阶段网络中没有IPv4网络,如果需要可以将反向代理部署在外部支持双栈的数据中心,将A记录指向反向代理服务器,IPv6用户直接访问网站服务,IPv4用户通过反向代理访问。
基于双栈反向代理过渡方式对网络、设备和应用程序本身的要求不高,向IPv6过渡的Web应用可以成熟一个迁移一个,渐进式完成向IPv6的过渡。
与常用过渡机制评价比较
在IPv6过渡的前面三个阶段,通过双栈反向代理的部署,可以将原本纯IPv4的Web服务快速扩展至IPv6,使得IPv4/IPv6用户均可访问。该方案仅需要少量配置和代码,目前在笔者单位已经应用近百个二级站点并正常运行多年,反向代理服务器采用开源软件Nginx部署,过滤转换器采用ngx_lua模块编写代码实现,在Nginx的配置文件中配置二级域名的泛域名解析,可以实现在站点调整或IPv6切换时时仅需要对DNS设置进行变更。图4是采用Apache的ab工具对代理前后压力测试时的响应情况:可以看到由于加入了过滤转换器,代理后响应时间稍微有些增加,1000次的请求最高响应时间为8ms,在可以接受的范围之内。
文献[2]提出了针对IPv6 过渡机制的统一评价指标体系,主要体现在功能、应用、性能、部署和安全5个方面,表2是与其他常用过渡机制在部署方面的评价指标的对比。
从表2可以看出,采用基于双栈反向代理方式对于Web应用的IPv6过渡有明显的优势,可无需对现有网络进行任何变更,对设备没有特殊要求,可以不需要公网双栈和无状态网络翻译机制所要求的公网地址,而且在用户和服务之间增加了隔离屏障,提高了服务的安全性。
表2 与常用过渡机制评价比较
本文设计了IPv6过渡阶段双栈反向代理的Web服务方案和过渡机制,通过在双栈环境下部署反向代理服务,结合DNS域名设置,为纯IPv4和纯IPv6环境下的Web服务快速实现提供双栈服务的能力。该方案的优点是:无需对现有网络和设备做改变即可实现原本纯IPv4和纯IPv6的Web服务的双栈访问;在后端Web服务向IPv6切换时仅需要对DNS设置进行变更,易于管理和维护;反向代理服务的存在使得用户和Web服务之间增加了一道隔离屏障,提高了服务的安全性。本文在反向代理服务中设置增加了过滤转换器和通用代理器,用于解决代理访问后Web内容中跨站、跨协议资源不能访问的问题,目前过滤转换器对于各被代理网站的处理都使用统一的代码,后续将对过滤转换器进行优化和扩展,以提高过滤器的性能和实现对被代理的站点更细力度的处理。
(责编:杨洁)
[1] Huston G, IPv4 address report. Technical Report, 2017. http://www.potaroo.net/tools/ipv4
[2] 葛敬国, 弭伟, 吴玉磊. IPv6过渡机制:研究综述、评价指标与部署考虑[J]. 软件学报, 2014,25(4):896-912.
[3] Wu J, Wang JH,Yang J. CNGI-CERNET2: An IPv6 deployment in China. ACM SIGCOMM Computer Communication Review, 2011,41(2):48?52. [doi: 10.1145/1971162.1971170]
[4] Wu P, Cui Y, Wu J, Liu J, Metz C. Transition from IPv4 to IPv6: A state-of-the-art survey.IEEE Communications Surveys & Tutorials, 2012,PP(99):1?18.
[5] Aazam M,Huh E N.Impact of ipv4-ipv6 coexistence in cloud virtualization environment[J].Annals of Telecommunications,2016,69(9-10):485-496.
[6] Netze H. IPv6 Guidance for Internet Content Providers and Application Service Providers[J]. Work in Progress, 2013.
[7] 徐华宇. APACHE反向代理在校园网络中的应用[J]. 通讯世界, 2015(23):298-299.
[8] 冯贵兰, 李正楠. Nginx反向代理在高校网站系统中的应用研究[J]. 网络安全技术与应用,2017(6).
[9] 刘振昌, 陈诗明, 焦宝臣,等. 网站安全管理难题 用反向代理技术巧应对[J]. 中国教育网络,2017(Z1):92-93.
[10]徐长君, 林涛. 基于Nginx的负载均衡方式优化[J]. 河北工业大学学报, 2016, 45(6):48-52.