IPv6多出口和实名认证

目前,国内各网络服务商都提供了IPv6接入支持和地址分配,对于有多运营商接入或多链路接入的单位,该如何合理分配和使用多条IPv6线路,以达到链路分流和冗余的效果?由于IPv6地址的多样性和IPv6的NAT不推荐性,所以多IPv6的接入与多IPv4的接入大大不同,本章将给出多种多IPv6接入解决方案,以供读者参考。鉴于目前国内IPv6普遍无认证的现状,本章引入了广州热点的虚拟认证设备,针对双栈场景、多运营接入场景、纯IPv6场景,分别演示IPv6实名认证上网的配置。

1、IPv6多出口

下面我们一起来学习一下IPv6多出口存在的必要性和IPv6多出口的复杂性,然后结合RFC6724文档,对在多出口情况下,源和目的IPv6地址的选择进行详细解读。

1.1、IPv6多出口的必要性

一个单位有多个互联网出口一般是因为有多个运营商的存在,随着IPv6的普及,基本上所有运营商都开通了IPv6支持,这样一个单位就会有多个IPv6出口。一个单位接入多运营商,主要有这样一些原因。

1、受制于一些特殊需求,例如国内的高校一般有edu.cn的域名,要拥有这样的域名,必须要接入中国教育科研网(以下简称教育网),然后把edu.cn的域名分配到教育网的IP地址上。高校为何不能单一地接入教育网呢?这是因为教育网比一般的运营商(如中国电信、中国移动和中国联通等)的接入费用普遍偏高,且国内最大的运营商网络并不是教育网。由于各个运营商之间存在竞争壁垒,所以跨运营商的访问往往受到诸多限制,且速率较慢。结果就是哪家运营商的网络越大,网中的资源越多,网内的用户访问速度就越快,就能吸引更多的用户接入,基于此,一些小的运营商终将被淘汰,除非有特殊的政策支持。

2、前面讨论的是国内高校,一些企事业单位为何也要接入多家运营商呢?这同样受制于国内多家运营商运营的现状,例如某个公司的网站要服务全国的用户,由于全国的用户分散在多家运营商的网络中,为了更好的用户体验,该公司可能会申请接入多家运营商,给服务器分配多个运营商的IP地址,根据来访的用户IP,由DNS服务器返回对应的运营商的IP地址。此外,考虑到网络的稳定,有些单位也会接入多运营商,避免单一运营商网络故障造成单位网络中断。

3、在某些情况下,有些单位也会通过多条链路接入同一家运营商,例如某家运营商只提供千兆的接入,而用户却需要多条千兆接入。也有可能出于资费考虑,用户觉得千兆接入太贵,而采用几条百兆链路的叠加。综上所述,国内多运营商链路接入的情况普遍存在,随着IPv6的普及,IPv6多出口也将普遍存在。

1.2、IPv6多出口的复杂性

通过IPv6接入多家运营商,并配置多个IPv6地址,这样就会存在在多个候选地址之间选择一个地址的问题。

1.2.1、IPv4源地址选择的简单性

在IPv4中很少遇到源地址选择的原因是设备基本只有一个IPv4地址,这个地址可能是公网地址,但更有可能是私网地址。这里回顾一下IPv4环境的几种场景。场景一:单出口环境,且公网地址足够。此时直接给主机配置公网地址,以直接与外界通信。比如国内有很多高校教育网IP地址足够多,直接给主机配置教育网IP地址,即可从教育网访问互联网。场景二:单出口环境,但公网地址不够。此时给主机配私网地址,当主机与外界通信时,由边界路由器等设备做NAT地址转换,将内部私网源地址转换成公网地址。这可能是国内应用最广的一种,比如家庭宽带等,一般都会配置一台做NAT的路由器。场景三:多出口环境,且公网地址足够。这在国内不会太多,主要以一些大公司比如百度、腾讯、阿里等为代表。它们都申请了独立的AS号和足够的IP地址。然后与各家运营商以BGP进行互联。场景四:多出口环境,但公网地址不够。这种在国内也很常见,一般情况下,内部主机配置私网地址,由边界路由器负责做各种策略的路由去选路,然后做NAT,以保证内部主机从哪个出口走都能正常通信。从以上分析可以看出,IPv4普遍公网地址不足,主要依赖NAT。

1.2.2、IPv6源地址选择的复杂性

当网络升级到IPv6,地址不够的问题就不复存在了,此时还需不需要NAT呢?在单出口环境下,没必要使用NAT,如果是多出口呢?这有点类似于IPv4中场景三“多出口环境,且公网地址足够”,可以去申请独立的AS号和独立的IPv6地址段,然后与多家运营商BGP互联,这虽然是最理想的方案,但真正实施起来却很困难。首先一般单位根本申请不到独立AS号;其次,即使申请到了,运营商是否愿意BGP互联也不一定;最后就是BGP互联对网络设备的性能和网络管理人员的技术要求都比较高,很多单位满足不了,所以对一般单位来说,BGP互联是根本不可能的。IPv6多出口可否借鉴IPv4场景四“多出口环境,但公网地址不够”呢?即采用NAT66(IPv6地址之间的NAT称为NAT66)来实现,虽说NAT66是要被废除的技术,但包括笔者在内的很多人都认为,在相当长的一段时间内,NAT66仍是一种解决方案。

通过前面的学习,我们可以了解到IPv6主机单个接口就可以有很多IPv6地址,如链路本地地址、临时地址和全局地址等;这些地址各有用途,相比IPv4来说的确复杂了很多。通过IPv6接入多家运营商,终端用户的IPv6地址和解决方案可以有以下几种场景。

场景一:仅配置某个运营商的IPv6地址:这里举个例子,假设某单位通过教育网和中国电信网(以下简称电信网)接入了IPv6,终端用户仅分配到了教育网的IPv6地址,终端用户使用教育网分配的IPv6地址访问互联网。互联网也可以通过教育网分配的IPv6地址从教育网链路访问该终端,这实现了端到端的可达性。这里存在一个问题,电信的线路完全浪费了,尤其是在教育网链路故障时,内部终端不能通过电信链路访问互联网。那么这个问题如何解决呢?

解决办法:终端仅配置教育网的IPv6地址,在出口防火墙上根据目的地址配路由,例如,如果目的是教育网地址的则配置路由走教育网,除此之外的配置默认路由走电信出口。有关教育网和电信网的IPv6地址段,可以从苍狼山庄网站获得。截至目前,教育网的IPv6地址块有26个,电信网的IPv6地址块有34个,条目都不多,配置静态路由还是比较方便的。因终端用户配置的是教育网的IPv6地址,所以选择电信网出口时,需要进行NAT66地址转换,将教育网的地址转换成电信网分配的IPv6地址。如果可以简单地做一个前缀替换,即可把教育网分配的IPv6前缀与电信网分配的IPv6前缀直接替换,实现IPv6地址的一对一转换,这样从互联网访问电信网的IPv6地址流量到达防火墙后,就被转换成了教育网的IPv6地址,也实现了端到端的可达性。NAT66前缀的转换,有些防火墙还不支持,这样就不能自动实现电信IPv6地址到教育网IPv6地址的转换,但访问互联网是没有问题的。如果要实现端到端的可达,则需要配置静态的NAT66条目。少量的静态条目是可以的,如果大面积使用就不现实了。

异常处理:若某条链路故障,该如何处理呢?假如教育网链路故障,则在防火墙上再配置教育网链路监控,使静态路由失效,把所有的流量都切换到电信出口;假如电信网链路故障,则在防火墙上再配置电信网链路监控,使默认路由失效。配置管理距离大的默认路由,让其指向教育网出口,把所有流量都切换到教育网出口,当电信链路恢复时,管理距离小的默认路由恢复生效,管理距离大的默认路由失效,默认流量重新切换回电信网出口。

场景二:分别配置每个运营商的IPv6地址:这里仍以教育网和电信网的两个IPv6出口进行讲解,该如何为终端用户分配教育网和电信网的IPv6地址呢?终端先访问互联网,当目的IPv6确定后,终端将根据RFC6724选择源IPv6地址,默认将采用最长匹配。由于每家运营商的IPv6地址块比较接近,所以终端最终实现用电信网分配的IPv6地址访问电信网资源,用教育网分配的IPv6地址访问教育网资源。对于既不是教育网,也不是电信网的目的IPv6地址,仍然采用最长匹配的原则,有可能选择电信网分配的IPv6地址,也有可能选择教育网分配的IPv6地址。源和目的IPv6地址确定后,还要考虑防火墙上的路由配置,如果防火墙配置了像上一节那样的路由条目,那么默认路由选的是电信出口。这里存在一个问题,例如互联网上非教育网和非电信网的源IPv6访问内网终端教育网分配的IPv6地址,当数据包从内网返回时,根据默认路由,防火墙选择了电信出口,那么教育网分配的源IPv6地址从电信网出口发出时,会被电信网认为是非法来源的IPv6流量,很可能被丢弃。同样,如果内网终端主动访问互联网上非教育网和非电信网的资源时,根据最长匹配,假如选择了教育网的IPv6地址,由于出口是电信出口,所以电信同样会认为这是非法来源的IPv6流量。针对这个问题我们可以删除配置的静态和默认路由,在出口防火墙上配置源路由,即根据源IPv6地址选择路由,教育网的源IPv6地址选择教育网的出口,电信网的源IPv6地址选择电信网的出口。这样双链路都得到了利用。链路的使用情况取决于要访问的目的IPv6地址与源IPv6地址的最长匹配情况;但同样还是会有新的问题产生。

异常处理方法1:若某条链路故障,该如何处理呢?给防火墙的两条源路由分别配置链路监控,以监控对应的教育网和电信网。当链路故障时,源路由失效。同时在防火墙上再配置两条默认路由,分别指向教育网和电信网出口,默认路由也设置为与教育网和电信网的链路监控有关,若链路故障,对应的默认路由也失效。假如教育网故障,教育网的源路由和默认路由都失效,那么教育网分配的源IPv6地址将选择电信出口。在防火墙上再配置NAT66,对教育网分配的源IPv6地址进行转换(转换成电信网的IPv6地址)。同样,为了避免电信网链路故障,也要为电信网分配的源IPv6地址配置NAT66,以将其转换成教育网的IPv6地址。与使用单运营商分配的IPv6地址的配置方法相比,使用双运营商分配的IPv6地址配置起来要复杂些,但优势也比较明显。在网络正常时,IPv6终端不论走教育网出口还是电信网出口,都不需要进行NAT66转换,都满足端到端的可达性。只是在某条链路故障时,互联网不能通过该链路对应的运营商分配的IPv6地址主动访问内网终端,但终端访问互联网没有问题。使用双运营商分配的IPv6地址,两条运营商链路的负载由源IPv6地址确定,管理员不方便调整两条链路的负载,而使用单运营商分配的IPv6地址;管理员只要调整路由表,就可以调整两条链路上的负载。

异常处理方法2:这里再介绍一种异常处理的方法,让终端的网关设备(一般是三层交换机或路由器)探测每条运营商链路。当运营商链路故障时,网关设备通知IPv6终端设备,该运营商分配的IPv6前缀的首选寿命和有效寿命都是0,IPv6终端弃用该运营商的IPv6地址。与异常处理方法1相比,异常处理方法2一般适用于SLAAC(无状态自动配置)场合,此外还需要网关设备支持链路检测,并能根据链路通断事件执行相关脚本,方法1适用于各种场合;方法2需更改所有的网关设备和所有的网段,工作量较大,方法1只需要更改防火墙配置即可。两种方法对比下来,还是异常处理方法1更可行。

1.3、RFC6724解读

在主机与外界通信时,不仅有多个候选源地址选择的问题,也有可能面临多个目的地址选择的问题。面对这么多源和目的地址,甚至更复杂的组合,最终的结果如何?读者通过实验5-8和实验8-4了解了如何通过修改前缀策略表将双栈主机默认的IPv6优先改成IPv4优先,但为什么要这么做?它的原理又是什么?多个候选源地址或候选目的地址之间,系统到底是按照什么样的顺序去选择?前缀策略表在地址选择上又扮演什么样的角色?能否修改这个前缀策略表来达到想要的结果?本节参照RFC6724,并结合实验,将逐步揭晓这些答案。然后在此基础上,再提出一种可选的IPv6多出口方案。

RFC6724文档的开头部分介绍,IPv6主机接口允许分配多个IPv6单播地址,这些地址可以有不同的范围(链路本地地址、站点本地地址、全局地址),这些地址也可以有首选属性和废弃(非首选)属性。出于私密性的考虑又引入了公用地址和临时地址,移动架构又介绍了家乡地址和转交地址。特别地,在多宿主环境下往往单个节点就有更多的地址,比如隧道等虚拟接口的地址,以及每家运营商分配的一个全局可路由地址(前缀)。这么多地址的后果就是在主机与外界通信前,必须在多个候选源地址或多个候选目的地址中进行选择。需要有一个默认的地址选择策略,使开发者和管理员能够掌握通信的行为和结果。在双栈环境下,选择IPv4还是选择IPv6不是绝对的,这依赖节点拥有什么样的IPv4和IPv6地址。总之,RFC6724就是专门介绍在多个候选源地址以及多个候选目的地址中,按什么样的顺序、策略来选择通信地址的。

地址选择有两种情况比较好理解:一是通信应用程序直接指明了使用哪个源地址和哪个目的地址,比如Windows系统的ping –S可以指定使用哪个源地址;二是被动访问的主机(如各种服务器)会根据请求包的源地址和目的地址做一个交换,即在回包中将请求包源地址作为目的地址,请求包目的地址作为源地址。除这两种情况,当有多个地址的主机需要与外界主动通信时,就需要对源地址或目的地址做选择了。

下面我们来看看RFC6724是如何选择源地址和目的地址的。源地址选择有8条规则,这些规则是按选择顺序排列的,当前面的规则选不出源地址时,就按照下一个规则去选。

规则1:首选与目的地址相同的源地址。这个比较好理解,但这种应用基本只限于主机与主机本身的通信,如平时在主机上ping自己,源地址和目的地址都相同。

规则2:选择合适的范围(scope)。在RFC4291中对IPv6地址按范围从小到大进行定义:接口本地<链路本地<管理本地<站点本地<组织本地<全局。实际应用更多地关心链路本地地址、站点本地地址和全局地址。此条规则强调的就是更接近于目的地址范围的源地址将会被优选。比如当目的地址是全局可路由单播地址,且主机有FE80开头的链路本地地址和全局单播地址时,显然全局地址更适合。

规则3:避免使用过期的、废弃的地址。所谓废弃的地址,就是首选寿命是0,甚至有效寿命也是0的地址。在Windows下可以通过命令netsh interfaceipv6 show address查看到各个地址的有效寿命和首选寿命。此条规则在实际应用中还是比较有用的,当不想使用某个地址时,直接将其首选寿命设置为0即可。

规则4:选择家乡地址。家乡地址和转交地址属于移动IPv6讨论的范畴,这里不做讨论。

规则5:选择出接口地址。这里用例子来说明这条规则:比如主机有双网卡,双网卡都禁止自动配置地址。每个网卡连接一家运营商,需要手动配置相应的运营商地址。网卡1地址是2001:1::ffff/64,网卡2地址是2401:1::ffff/64,当在网卡1上设置默认网关2001:1::1时,主机所有的跨网段通信都会从网卡1这个接口发出,那么其源地址只能是网卡1的地址,不会选择网卡2的地址,这就是此条规则说的选择出接口的地址。但在现实环境中,不是所有主机都配置双网卡,更多的是单网卡配置多个全局运营商地址,此时出接口就只有一个,也就不适合这条规则了。还是刚才的例子,如果是单网卡配置这两个地址,默认网关地址被设置成2001:1::1,当主机与外界通信时,并不能保证源地址是2001:1::ffff,也可能是2401:1::ffff。回想一下IPv4的场景,假定单网卡配置192.168.1.254/24和192.168.2.254/24,默认网关如果设置成192.168.1.1,那么在默认情况下,主机与外界通信时会使用192.168.1.254这个地址,不会选择192.168.2.254(注意一下,这里是默认情况,但也有特殊情况,比如在Linux等系统中设置默认网关或路由时,可以指明使用与默认网关不在同一网段的地址)。

规则6:使用与目的地址有相同标签值的源地址。查询前缀策略表(prefix policy table),按照类似路由表的最长匹配原则,找到对应的标签值。Windows系统下可以使用netsh interface ipv6 show prefix命令来查看前缀策略表,也可以按需增加和修改此前缀策略表。先简单介绍一下规则6的意思:当目的地址确定后,主机会用目的地址与这个前缀策略表做最长匹配,找出对应的标签值,然后再拿自己的多个候选源地址分别与此前缀策略表做最长匹配,分别得出一个标签值,如果有一个源地址最长匹配出来的标签值与目的地址匹配出来的标签值相同,且其他源地址匹配出来的标签值与目的地址匹配出来的标签值不同,则选择唯一与目的地址具有相同标签值的源地址。这里也许不太好理解,没关系,后面通过实验来详细解释此条规则及其应用。

规则7:使用临时地址。这主要是从私密性来考虑的。如果主机有临时地址,且前面规则都没能选出源地址,则优选临时地址。

规则8:使用最长前缀匹配的源地址。到底怎样匹配呢?具体地说就是将源地址和目的地址都转成二进制数(这里是前缀的比较,转换前64位就可以了)。从首位开始,依次比较两个地址对应位置的二进制数是否相同,相同的话,则匹配的长度值就加1,再比较下一位,直至二进制数不同为止,此时就能得出匹配的长度值。哪个源地址与目的地址匹配的长度值大,就选择哪个源地址。比如目的地址是2401::1,候选源地址有2402::2和2001:1::1,2402::2与2401::1匹配的长度值是14,而2001:1::1与2401::1匹配的长度值是5,显然前者有更长匹配,源地址2402::2将被优选。为什么要使用最长匹配呢?其实包括规则2,都与IPv6层次化地址分配原则有关。举个简单的例子,某高校可能有2001:da8:xxxx::/48教育网地址和2401:1:1::/48电信网地址,如果访问的目的地址是以2001:da8:打头的地址,很显然,使用此条规则会选择以2001:da8:xxxx::打头的地址,不会选择以2401:1:1::打头的地址,它的假定是当目的地址与自己能达到最长匹配时两者属于同一家运营商网,当然这也是最优选择。

遗憾的是,当这8条规则都无法选择出源地址时,RFC6724只提了一下这需要由具体情况来决定,这就存在很大的不确定性。比如4.9节讨论的SLAAC地址(包括公用地址和临时地址)、手动地址、DHCPv6获得的地址,它们的前缀相同,默认情况下,除了使用规则7能选出临时地址优先,其他规则没什么用。

RFC6724也规定了目的地址选择规则。规则1:避免没用的目的地址。即如果目的地址已经不可达(如对应出接口已经坏(down)了),或者目的地址对应的源地址并没有定义,此目的地址就不应该被选择。规则2:选择匹配的范围。这与源地址选择的规则2有点类似,但这里是相同范围的地址。即如果一个目的地址与对应的源地址范围相同,且其他目的地址与对应的源地址范围都不同,则选择有唯一相同范围的目的地址做通信地址。规则3:避免使用废弃地址。这里的废弃地址并不是指目的地址是废弃地址,这很难判断,而是看目的地址对应的源地址是不是已经废弃了。规则4:使用家乡地址。涉及移动IPv6的概念,不讨论。规则5:选择有相同标签的目的地址。这跟源地址选择的规则6类似,也是要查询前缀策略表。这条规则很有用,比如访问某个网站,域名解析的结果有两个,一个是教育网地址,一个是电信地址,如果不做控制,则可能会随机选择一个地址,请求超时后,再选择另一个地址。但是如果教育网质量不好,就可以在主机上做策略,使访问该网站时总是使用电信地址,走电信出口去访问。后面会通过实验来演示怎么实现。规则6:选择高优先级。这一规则经常被用于实现IPv4优先还是IPv6优先,它实际上属于目的地址选择的问题,也是需要查询前缀策略表。需要说明的是,前缀策略表是IPv6,即前缀项都是IPv6地址前缀,它没有办法直接表示IPv4,于是系统用前缀::ffff:0:0/96来表示整个IPv4。当然,如果要具体指明哪个IPv4,比如只想让目的地址192.192.192.192比所有IPv6地址都优先,就可以在此策略表中添加一项 ::ffff:192.192.192.192/128,其优先级高于::/0即可。总结一下,主机的前缀策略表既可以用于源地址选择,也可以用于目的地址选择。规则7:优选本地传输。这个主要针对的是有协议封装的隧道机制,优选通过本地而不是隧道到达的目的地址。简单地说,就是能直达就绝不走隧道的原则。比如两个候选目的地址的路径,路由表中一个走隧道,一个不走隧道,则选择不走隧道的地址。规则8:选择更小范围的地址。举例来说,能用以FE80打头的范围更小的链路本地地址通信,就不选择范围更大的全局地址通信。规则9:最长匹配原则。这个同源地址选择的规则8类似,如果候选目的地址与对应的源地址有更长的匹配,则会被优先选择。规则10:保持原样,即哪个排前面就选择哪个,顺其自然。RFC6724也说了,规则9和规则10是可以改的,比如在明确了哪个目的地址的通信效果更好后,则可以直接选择该目的地址。

通过对RFC6724文档的解读可知,若某个单位通过IPv6多出口接入互联网,则源IPv6地址的选择默认就到了规则8“使用最长前缀匹配的源地址”。由于目的IPv6的多样性,源IPv6地址选择具有很大的不确定性,接下来通过实验演示如何通过修改前缀策略表控制源IPv6地址的选择。

2、IPv6多出口解决方案一(配单运营商IPv6地址+NAT66)

在下图中,某单位通过防火墙接入教育网和电信网,教育网给该单位分配了2001:da8:0::/48的IPv6前缀,电信网给该单位分配了2401:da8:0::/48的IPv6前缀。本实验将完成以下功能和测试。给内部用户Win10只分配教育网的IPv6地址,在出口防火墙上配置基于目的的路由,去往教育网2000::/8的路由选择教育网出口,除此之外的选择电信网出口。由于Win10使用的是教育网的IPv6地址,所以在选择电信网出口时,需配置NAT66,将地址转换成电信网分配的IPv6地址。

为了避免教育网或电信网出口故障,从而影响单位业务,并保障服务的高可用性,需要为服务器Winserver2016既分配教育网的IPv6地址,也分配电信网的IPv6地址。这样当某个出口故障时,另一出口仍能正常提供服务。

配置故障检测,在防火墙上配置链路检测,当教育网故障时,把内部用户的流量都切换到电信网上;当电信网故障时,把内部用户的流量都切换到教育网上。

image-20220406204916398

该实验的步骤如下。
设备配置。在EVE-NG中打开“Chapter 10”文件夹中的“10-2 Multi out_1”网络拓扑。配置图中的内网核心交换机Switch、出口防火墙HillstoneSG6000、教育网运营商路由器ISP-1、电信网运营商路由器ISP-2、互联网路由器ISP-3和测试路由器Test-Router。本实验中路由器Test-Router用来代替互联网中的服务器,这里选择路由器的第一个原因是路由器比服务器节省资源;第二个原因是在路由器上可以方便地查看来访的IPv6地址和指定外出IPv6地址。详见配置包“10\IPv6多出口解决方案一.txt”,Switch的配置如下:

Switch>enable
Switch#conf t
Switch(config)#ipv6 unicast-routing
Switch(config)#vlan 2
Switch(config-vlan)#int e0/1
Switch(config-if)#swi mode acc
Switch(config-if)#swi acc vlan 2
Switch(config-if)#int vlan 1
Switch(config-if)#ipv6 enable
Switch(config-if)#ipv6 add 2001:da8:0:0::1/64
Switch(config-if)#no shut
# 该VLAN是服务器所在VLAN,配置两家运营商的IPv6地址
Switch(config-if)#int vlan 2 
Switch(config-if)#ipv6 enable
Switch(config-if)#ipv6 add 2001:da8:0:8::1/64
Switch(config-if)#ipv6 add 2401:da8:0:8::1/64
Switch(config-if)#no shut
Switch(config-if)#int e0/2
Switch(config-if)#no switchport
Switch(config-if)#ipv6 enable
Switch(config-if)#ipv6 add 2001:da8:0:2::1/64
Switch(config-if)#no shut
Switch(config-if)#exit
# 配置默认路由指向防火墙
Switch(config)#ipv6 route ::/0 2001:da8:0:2::2 

ISP-1的配置如下:

Router>enable
Router#conf t
Router(config)#host ISP-1
ISP-1(config)#ipv6 unicast-routing
ISP-1(config)#int e0/0
ISP-1(config-if)#ipv6 add 2001:da8:1:1::2/64
ISP-1(config-if)#no shut
ISP-1(config-if)#int e0/1
ISP-1(config-if)#ipv6 add 2001:da8:1:2::1/64
ISP-1(config-if)#no shut
ISP-1(config-if)#exit
# 教育网配置去往该单位的明细路由
ISP-1(config)#ipv6 route 2001:da8:0::/48 2001:da8:1:1::1 
# 配置默认路由指向互联网路由器
ISP-1(config)#ipv6 route ::/0 2001:da8:1:2::2 
ISP-1(config)#

ISP-2的配置如下:

Router#conf t
Router(config)#host ISP-2
ISP-2(config)#ipv6 unicast-routing
ISP-2(config)#int e0/0
ISP-2(config-if)#ipv6 add 2401:da8:1:1::2/64
ISP-2(config-if)#no shut
ISP-2(config-if)#int e0/1
ISP-2(config-if)#ipv6 add 2401:da8:1:2::1/64
ISP-2(config-if)#no shut
ISP-2(config-if)#exit
# 电信网配置去往该单位的明细路由
ISP-2(config)#ipv6 route 2401:da8:0::/48 2401:da8:1:1::1 
# 配置默认路由指向互联网路由器
ISP-2(config)#ipv6 route ::/0 2401:da8:1:2::2 

ISP-3的配置如下:

Router>enable
Router#conf t
Router(config)#host ISP-3
ISP-3(config)#ipv6 unicast-routing
ISP-3(config)#int e0/0
ISP-3(config-if)#ipv6 add 2401:da8:1:2::2/64
ISP-3(config-if)#no shut
ISP-3(config-if)#int e0/1
ISP-3(config-if)#ipv6 add 2001:da8:1:2::2/64
ISP-3(config-if)#no shut
ISP-3(config-if)#int e0/2
ISP-3(config-if)#ipv6 enable
ISP-3(config-if)#ipv6 add 2001:da8:1:1::1/64
ISP-3(config-if)#ipv6 add 2401:da8:1:1::1/64
ISP-3(config-if)#no shut
ISP-3(config-if)#exit
ISP-3(config)#ipv6 route 2000::/8 2001:da8:1:2::1
ISP-3(config)#ipv6 route 2400::/8 2401:da8:1:2::1

Test-Router的配置如下:

Router>enable
Router#conf t
Router(config)#host Test-Router
Test-Router(config)#ipv6 unicast-routing
# 该接口连接测试路由器,分配两家运营商的IPv6地址
Test-Router(config)#int e0/0 
Test-Router(config-if)#ipv6 add 2401:da8:1:3::2/64
Test-Router(config-if)#ipv6 add 2001:da8:1:3::2/64
Test-Router(config-if)#no shut
Test-Router(config-if)#exit
# 默认路由指向互联网路由器,这里指向2001:da8:1:3::1或2401:da8:1:3::1都可以;
# 不影响测试结果,前面的RFC6724相关规则有过解释。
Test-Router(config)#ipv6 route ::/0 2001:da8:1:3::1 
# 配置远程登录
Test-Router(config)#line vty 0 4 
# 免登录
Test-Router(config-line)#no login 
# 授予管理权限
Test-Router(config-line)#privilege level 15 
#  允许使用Telnet连接
Test-Router(config-line)#transport input telnet

HillstoneSG6000的配置如下:

SG-6000# config
# 该接口连接内网
SG-6000(config)# interface eth0/0 
SG-6000(config-if-eth0/0)# no ip address dhcp
#允许使用HTTP通过该接口管理防火墙
SG-6000(config-if-eth0/0)# manage http 
# 把连接内网的区域定义为trust
SG-6000(config-if-eth0/0)# zone trust 
SG-6000(config-if-eth0/0)# ipv6 enable
SG-6000(config-if-eth0/0)# ipv6 add 2001:da8:0:2::2/64
SG-6000(config-if-eth0/0)# no shut
SG-6000(config-if-eth0/0)# exit
# 创建edu区域,表示教育网
SG-6000(config)# zone edu 
# 区域类型是外网
SG-6000(config-zone-edu)# type wan 
# 创建telecom区域,表示电信网
SG-6000(config-zone-edu)# zone telecom 
# 区域类型是外网
SG-6000(config-zone-telecom)# type wan 
SG-6000(config-zone-telecom)# exit
# 该接口连接教育网
SG-6000(config)# interface eth0/1 
SG-6000(config-if-eth0/1)# zone edu
SG-6000(config-if-eth0/1)# ipv6 enable
SG-6000(config-if-eth0/1)# ipv6 add 2001:da8:1:1::1/64
SG-6000(config-if-eth0/1)# no shut
# 该接口连接电信网
SG-6000(config-if-eth0/1)# interface eth0/2 
SG-6000(config-if-eth0/2)# zone telecom
SG-6000(config-if-eth0/2)# ipv6 enable
SG-6000(config-if-eth0/2)# ipv6 add 2401:da8:1:1::1/64
SG-6000(config-if-eth0/2)# no shut
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# ip vrouter "trust-vr"
# 这时配置的是源IPv6的NAT66,把符合2001:da8::/48前缀且外出接口是ethernet0/2,去往任何目的地址、任何服务的源IPv6地址转换成前缀为2401:da8:0:1::/120的IPv6地址。
# 若防火墙可以把2001:da8::/48前缀一一对应地转换成2401:da8::/48前缀,那么防火墙就可以是无状态的防火墙了,且从互联网可以通过电信网的IPv6地址端到端地访问到内网的IPv6主机。
# 遗憾的是山石防火墙尚不支持IPv6前缀的直接转换,且NAT66中目的IPv6地址条目受限,所以这里使用了电信网IPv6地址段中的部分地址2401:da8:0:1::/120。由于使用的是基于端口的转换,所以这里提供的28个IPv6地址也够了。
SG-6000(config-vrouter)# snatrule id 1 from "2001:da8::/48" to"::/0" service "Any" eif ethernet0/2 trans-to 2401:da8:0:1::/120 mode dynamicport 
# 去往内网教育网地址的路由
SG-6000(config-vrouter)# ipv6 route 2001:da8:0::/48 2001:da8:0:2::1 
# 去往内网电信网地址的路由
SG-6000(config-vrouter)# ipv6 route 2401:da8:0::/48 2001:da8:0:2::1
# 去往外网教育网地址段的路由,在真实环境中可以登录苍狼山庄查找教育网的真实IPv6地址块
SG-6000(config-vrouter)# ipv6 route 2000::/8 2001:da8:1:1::2
# 去往外网的默认路由
SG-6000(config-vrouter)# ipv6 route ::/0 2401:da8:1:1::2
# 这里配置的是源路由,也称基于源地址的路由,源路由优先于正常的路由。
# 2001:da8:0:8::/64是内网中使用教育网地址对外提供服务的地址段,所以出口只能是教育网出口。
SG-6000(config-vrouter)# ipv6 route source 2001:da8:0:8::/64 2001:da8:1:1::2
# 2401:da8:0:8::/64是内网中使用电信网地址对外提供服务的地址段,所以出口只能是电信网出口。
SG-6000(config-vrouter)# ipv6 route source 2401:da8:0:8::/64 2401:da8:1:1::2 
SG-6000(config-vrouter)# exit
# 在防火墙中配置策略,放行内网所有去教育网的流量
SG-6000(config)# rule id 1 
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "edu"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-edu"
SG-6000(config-policy-rule)# exit
# 放行内网所有去电信网的流量
SG-6000(config)# rule id 2 
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "telecom"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-telecom"
SG-6000(config-policy-rule)# exit
# 放行教育网到内网的所有流量,在真实环境中可以按需配置
SG-6000(config)# rule id 3 
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "edu"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "edu-to-trust"
SG-6000(config-policy-rule)# exit
# 放行电信网到内网的所有流量,在真实环境中可以按需配置
SG-6000(config)# rule id 4 
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "telecom"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "telecom-to-trust"
SG-6000(config-policy-rule)# exit
SG-6000(config)#

Winserver2016服务器配置:禁用IPv4协议,手动配置IPv6地址2001:da8:0:8::2/64和2401:da8:0:8::2/64,网关为空。然后我们开始测试、我们在Win10上禁用IPv4协议,使用ipconfig命令查看IP地址,可以看到获得了IPv6地址。分别追踪去往教育网和电信网流量的路由,如下图所示。

从下图的输出信息可以看到,Win10去往教育网2001:da8:1:3::2的数据包的第一跳是网关,第二跳是防火墙内网接口,第三跳是ISP-1的e0/0接口,第四跳是ISP-3的e0/1接口,第五跳到达测试路由器。还可以看到Win10去往电信网2401:da8:1:3::2的数据包,它的第一跳是网关,第二跳是防火墙内网接口,第三跳是ISP-2的e0/0接口,第四跳是ISP-3的e0/0接口,第五跳到达测试路由器。从输出中可以看到,出口防火墙根据目的地址做了分流,两条运营商链路都用了起来。

image-20220406210930263

在Win10上启用telnet客户端。先打开一个DOS命令行窗口,telnet连接2001:da8:1:3::2。再打开一个DOS命令行窗口,telnet连接2401:da8:1:3::2。然后在该窗口中使用show users查看登录的用户,如下图所示。

image-20220406211057095

从上图可以看出,当前登录的是2401:DA8:1:3::2地址,源地址是2401:DA8:0:1::35,这个源IPv6地址不是Win10计算机上的IPv6地址,是被防火墙转换后的电信网分配的一个IPv6地址。从图中也可以看到另一个用户2001:DA8::A931:5104:E49E:8122,可以验证这个用户就是Win10计算机上的教育网IPv6地址。从互联网可以通过IPv6地址2001:DA8::A931: 5104:E49E:8122主动访问Win10计算机,但不能通过IPv6地址2401:DA8:0:1::35访问Win10计算机,也就是说Win10计算机从两家运营商都可以访问互联网,但只支持从教育网访问该主机,除非电信网配置静态的NAT。

在Winserver2016服务器上安装telnet客户端功能。先打开一个DOS命令行窗口,telnet连接2001:da8:1:3::2;再打开一个DOS命令行窗口,telnet连接2401:da8:1:3::2。然后在该窗口中使用show users查看登录的用户。根据输出可以验证Winserver2016分别使用教育网和电信网分配的公用IPv6地址访问对应的教育网和电信网资源。在测试路由器上分别追踪到Winserver2016服务器教育网和电信网IPv6地址的路由,具体如下:

Test-Router#traceroute 2001:da8:0:8::2 
Type escape sequence to abort.
Tracing the route to 2001:DA8:0:8::2

  1 2001:DA8:1:3::1 0 msec 1 msec 4 msec
  2 2001:DA8:1:2::1 0 msec 1 msec 1 msec
  3 2001:DA8:1:1::1 1 msec 1 msec 1 msec
  4 2001:DA8:0:2::1 2 msec 2 msec 1 msec
  5 2001:DA8:0:8::2 3 msec 2 msec 2 msec
Test-Router#traceroute 2401:da8:0:8::2
Type escape sequence to abort.
Tracing the route to 2401:DA8:0:8::2

  1 2401:DA8:1:3::1 1 msec 0 msec 1 msec
  2 2401:DA8:1:2::1 1 msec 1 msec 0 msec
  3 2401:DA8:1:1::1 2 msec 1 msec 1 msec
  4 2001:DA8:0:2::1 2 msec 2 msec 2 msec
  5 2401:DA8:0:8::2 11 msec 2 msec 2 msec
Test-Router#

从上面的输出可以验证,在互联网中可以分别从教育网和电信网访问服务器。前面我们测试了在教育网和电信网出口都正常的情况下的网络访问,假如某个运营商出口出现故障呢?接下来分别讨论教育网和电信网出口出现故障的解决办法。

① 教育网故障:关闭ISP-1路由器的e0/0接口,模拟教育网故障。经测试我们发现,Win10和Winserver2016都不能访问互联网的教育网资源,但访问非教育网资源正常。

image-20220406222850966

这里配置防火墙的链路检测,从防火墙e0/1接口探测互联的教育网对端IPv6地址,若地址不可达,则认为链路故障,从而使防火墙e0/1接口的协议失效。防火墙e0/1接口失效后,基于该接口的目的路由2000::/8和源路由2001:da8:0:8::/64都会失效。Win10使用默认路由访问互联网,且会被转换成电信网的IPv6地址。Winserver2016服务器访问互联网时,如果源IPv6地址是教育网的地址,那么它会被转换成电信网的IPv6地址;如果源IPv6地址是电信网的IPv6地址,则保持不变。防火墙的对应配置如下:

SG-6000# configure 
# 创建监测对象edu
SG-6000(config)# track edu
# 使用防火墙ethernet0/1接口的IPv6地址,从ethernet0/1接口ping教育网的互联IPv6地址2001:da8:1:1::2
SG-6000(config-trackip)# icmp6 2001:da8:1:1::2 interface eth0/1 src-interface eth0/1
SG-6000(config-trackip)# exit
SG-6000(config)# interface eth0/1
# 配置对象监控,若edu失败,该接口协议失效
SG-6000(config-if-eth0/1)# monitor track edu
SG-6000(config-if-eth0/1)# end
SG-6000# sa

经过上述配置后,当教育网出口故障时,Win10和Winserver2016仍可以正常访问教育网和电信网资源。

image-20220406223007462

② 电信网故障:开启ISP-1路由器的e0/0接口,关闭ISP-2路由器的e0/0接口,模拟电信网故障。经测试可以发现,Win10和Winserver2016都不能访问电信网的资源,但可以正常访问教育网的资源。

image-20220406223135768

这里配置防火墙的链路检测,从防火墙e0/2接口探测互联的电信网对端IPv6地址,若地址不可达,则认为链路故障,从而使防火墙e0/2接口的协议失效。防火墙e0/2接口失效后,基于该接口的目的路由::/0和源路由2401:da8:0:8::/64都会失效。Win10访问教育网有具体的路由,访问其他资源没有路由。在防火墙上添加一条默认路由,下一跳指向教育网出口,但管理距离设成2,之前配置的电信出口的默认路由的管理距离是1。之前配置的默认路由失效,次优的默认路由生效,这样Win10访问任何互联网资源都会使用真实的教育网IPv6地址。思考一下,Winserver2016服务器访问互联网时会怎样呢?Winserver2016访问教育网资源时,源IPv6地址选的是教育地址,从教育网出口,正常。

Winserver2016访问非教育网资源时,将采用最长匹配,源IPv6地址选的很可能是电信网分配的地址。数据包到达防火墙后,防火墙选择次优的默认路由,然后从教育网出口发出。假如教育网骨干配置了源IPv6地址合法性检测,则数据包会被直接丢弃;假如教育网骨干没有配置源IPv6地址合法性检测,则数据包会被发往互联网。到达目的地后,数据包返回。由于电信的IPv6出口故障,数据包无法返回,通信失败。也就是说不管教育网骨干有没有配置源IPv6地址检测,Winserver2016使用电信网分配的源IPv6地址来访问互联网都会失败。解决的办法可以是在防火墙上配置NAT66,当源IPv6是电信网分配的地址、出口是教育网出口时,配置NAT66,把源IPv6转换成教育网的IPv6地址。一般服务器都不会主动访问外网,此时也可以不用配置NAT66。再思考一下,在电信网出口故障时,互联网上的电信IPv6主机能不能正常访问Winserver2016服务器的教育网IPv6地址呢?回答是可以的。互联网访问Winserver2016服务器的教育网IPv6地址时,Winserver2016会根据会话来使用教育网IPv6地址作为源IPv6地址进行回应,而不会采用最长匹配。

防火墙的对应配置如下:

# 创建监测对象telcom
SG-6000(config)# track "telcom" 
# 使用防火墙ethernet0/2接口的IPv6地址,从ethernet0/2接口ping电信网的互联IPv6地址2401:da8:1:1::2
SG-6000(config-trackip)# icmp6 2401:da8:1:1::2 interface ethernet0/2 src-interface ethernet0/2 
SG-6000(config-trackip)# exit
SG-6000(config)# interface ethernet0/2
# 配置对象监控,若telcom失败,则该接口协议失效
SG-6000(config-if-eth0/2)# monitor track "telcom" 
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# ip vrouter "trust-vr"
# 添加一条管理距离是2的默认路由,电信出口正常时,使用不到该路由,电信出口故障时,该默认路由生效
SG-6000(config-vrouter)# ipv6 route ::/0 2001:da8:1:1::2 2
# 这条配置的作用是,当电信网出口故障后,服务器访问的电信网资源将被转换成教育网的IPv6地址,2001:da8:0:9999:1::/120是随便配置的地址段,不与内网重叠即可
SG-6000(config-vrouter)# snatrule id 2 from "2401:da8::/48" to "::/0" service "Any" eif ethernet0/1 trans-to 2001:da8:0:9999:1::/120 mode dynamicport 
SG-6000(config-vrouter)# exit

经过上述配置后,在电信网出口故障时,Win10和Winserver2016仍可以正常访问教育网和电信网资源。至此,本实验实现了当教育网和电信网都正常时,防火墙根据用户访问的目的地址负载分担(服务器除外,服务器根据源IPv6地址选择出口)。当某个运营出口故障时,不管是服务器还是客户机,仍能正常访问互联网的所有资源;互联网也能正常访问服务器(通过出口正常的运营商分配的IPv6地址)。

image-20220406223243608

3、IPv6多出口解决方案二(配多运营商IPv6地址+NAT66容灾)

本实验仍然使用前面的实验场景,继续完成以下功能和测试。给内部用户Win10分配教育网和电信网的IPv6地址,在出口防火墙上配置基于源IPv6地址的路由。如果源IPv6地址是教育网分配的则选择教育网出口,如果源IPv6地址是电信网分配的则选择电信网出口。运营商出口的选择完全由源IPv6地址决定,不使用NAT66就可以实现端到端的可达性。

配置故障检测。在防火墙上配置链路检测,当教育网故障时,把内部用户的流量都切换到电信网上;当电信网故障时,把内部用户的流量都切换到教育网上。具体处理的方法是:当教育网出口故障时,内网中的Win10和Winserver2016并不知道教育网出口故障,继续根据最长匹配选择源IPv6地址,假如源IPv6地址选择的是教育网分配的IPv6地址,那么当数据包到达防火墙后,由于防火墙上配置了链路检测,教育网出口故障,对应的源路由失效,所以需配置去往电信网的默认路由。由于源IPv6地址是教育网的,运营商出口是电信网,所以此时还需要配置NAT66。同理,还需要配置去往教育网的默认路由和相关的NAT66。

本实验在前面实验完成的基础上,对配置做些修改,Switch的配置如下:

Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 给该VLAN增加一个电信网的IPv6地址
Switch(config)#int vlan 1
Switch(config-if)#ipv6 enable
Switch(config-if)#ipv6 add 2401:da8:0:0::1/64
Switch(config-if)#end
Switch#wr

ISP-1、ISP-2、ISP-3和Test-Router的配置不变。HillstoneSG6000的配置如下:

SG-6000# config
SG-6000(config)# ip vrouter "trust-vr"
# 删除原来配置的教育网路由
SG-6000(config-vrouter)#no ipv6 route 2000::/8 2001:da8:1:1::2
# 删除原来教育网的次优默认路由,原路由管理距离配置的是2
SG-6000(config-vrouter)#no ipv6 route ::/0 2001:da8:1:1::2
# 添加教育网的默认路由
SG-6000(config-vrouter)#ipv6 route ::/0 2001:da8:1:1::2
# 删除为原服务器教育网段配置的源路由
SG-6000(config-vrouter)#no ipv6 route source 2001:da8:0:8::/64 2001:da8:1:1::2 
# 删除为原服务器电信网段配置的源路由
SG-6000(config-vrouter)#no ipv6 route source 2401:da8:0:8::/64 2401:da8:1:1::2
# 添加全范围的教育网源路由
SG-6000(config-vrouter)#ipv6 route source 2001:da8:0::/48 2001:da8:1:1::2
# 添加全范围的电信网源路由
SG-6000(config-vrouter)#ipv6 route source 2401:da8:0::/48 2401:da8:1:1::2 

正常测试。在Win10上telnet测试路由器2001:da8:1:3::2,然后执行show users,可以看到源IPv6地址选择的是以2001打头的教育网地址;telnet测试路由器2401:da8:1:3::2,然后执行show users,可以看到源IPv6地址选择的是以2401打头的电信网地址。证明了在运营商出口都正常的情况下,终端用户无论选择哪个源IPv6地址,访问互联网都不需要NAT66转换。在测试路由器上追踪到Winserver2016服务器不同IPv6地址的路径,显示如下:

image-20220406224508147

在测试路由器上追踪到Winserver2016服务器不同IPv6地址的路径,显示如下:

Test-Router#traceroute 2001:da8:0:8::2
Type escape sequence to abort.
Tracing the route to 2001:DA8:0:8::2

  1 2001:DA8:1:3::1 1 msec 0 msec 1 msec
  2 2001:DA8:1:2::1 1 msec 1 msec 0 msec
  3 2001:DA8:1:1::1 2 msec 1 msec 1 msec
  4 2001:DA8:0:2::1 2 msec 1 msec 1 msec
  5 2001:DA8:0:8::2 3 msec 2 msec 2 msec
Test-Router#traceroute 2401:da8:0:8::2
Type escape sequence to abort.
Tracing the route to 2401:DA8:0:8::2

  1 2401:DA8:1:3::1 1 msec 0 msec 1 msec
  2 2401:DA8:1:2::1 1 msec 1 msec 1 msec
  3 2401:DA8:1:1::1 1 msec 1 msec 1 msec
  4 2001:DA8:0:2::1 1 msec 2 msec 2 msec
  5 2401:DA8:0:8::2 2 msec 2 msec 3 msec
Test-Router#

从上面的输出可以看到,互联网测试路由器可以直接访问在内网服务器上配置的不同IPv6地址。同样,若把内网测试IPv6地址换成Win10的临时或公用IPv6地址,互联网测试路由器仍都可访问。以上验证了在运营商出口都正常的情况下,可以实现端到端的可达性。

教育网故障:关闭ISP-1路由器的e0/0接口,模拟教育网故障。在Win10上telnet测试路由器2001:da8:1:3::2,然后执行show users,可以看到源IPv6地址选择的是以2401打头的电信网地址;telnet测试路由器2401:da8:1:3::2,然后执行show users,可以看到源IPv6地址选择的是以2401打头的电信网地址。以上证明了在教育网出口故障的情况下,终端用户访问教育网资源需要NAT66转换,访问电信网资源不需要NAT66转换。测试路由器也可以主动访问Win10和Winserver2016的电信网IPv6地址。

image-20220406230308332

电信网故障:开启ISP-1路由器的e0/0接口,关闭ISP-2路由器的e0/0接口,模拟电信网故障。经测试可以发现,Win10和Winserver2016都可以正常访问电信网和教育网资源,访问电信网资源需要NAT66转换,访问教育网资源不需要NAT66转换。测试路由器也可以主动访问Win10和Winserver2016的教育网IPv6地址。

image-20220406230639062

4、IPv6多出口解决方案三(配多运营商IPv6地址,禁用NAT66)

本实验仍然使用实验一的实验场景,继续完成以下功能和测试。给内部用户Win10分配教育网和电信网的IPv6地址,在出口防火墙上配置基于源IPv6地址的路由。如果源IPv6地址是教育网分配的则选择教育网出口,如果源IPv6地址是电信网分配的则选择电信网出口。运营商出口的选择完全由源IPv6地址决定,不使用NAT66就可以实现端到端的可达性。

我们在终端的网关设备(下图中的三层交换机)上配置链路检测,当教育网故障时,把教育网前缀的有效寿命和首选寿命设置成0,终端收到报文通告后,教育网IPv6地址失效;当教育网恢复时,取消前缀的有效寿命和首选寿命的0设置,终端的教育网IPv6重新生效。当电信网故障时,把电信网前缀的有效寿命和首选寿命设置成0,终端收到报文通告后,电信网IPv6地址失效;当电信网恢复时,取消前缀的有效寿命和首选寿命的0设置,终端的电信网IPv6重新生效。

本实验需要借助思科的两个互联网协议服务等级协议(Internet Protocol Service-Level Agreement,IP SLA)和嵌入式事件管理器(Embedded Event Manager,EEM)。IP SLA可用于网络连通性测试。EEM可实现进程级的自动策略控制,该功能可以利用智能网络帮助IT管理人员自动执行费时的任务,从而节约管理人员的时间。

实验拓扑如下,我们同时在新添加的路由器和防火墙之间多配置一个电信网的互联IPv6地址,用于测试网络。

image-20220408213119016

路由器配置信息如下:

Router>enable
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#int e0/0
Router(config-if)#ipv6 enable
Router(config-if)#ipv6 add 2001:da8:0:0::1/64
Router(config-if)#ipv6 add 2401:da8:0:0::1/64
Router(config-if)#no shut
Router(config-if)#int e0/1
Router(config-if)#ipv6 enable
Router(config-if)#ipv6 add 2001:da8:0:8::1/64
Router(config-if)#ipv6 add 2401:da8:0:8::1/64
Router(config-if)#no shut
# 使用该接口的IPv6地址作为源IPv6地址去探测运营商出口IPv6地址的可达性
# 默认使用的是RFC6724的最长匹配原则,即探测某家运营商就使用该家运营商分配IPv6地址
Router(config-if)#int e0/2 
Router(config-if)#ipv6 enable
Router(config-if)#ipv6 add 2001:da8:0:2::1/64
Router(config-if)#ipv6 add 2401:da8:0:2::1/64
Router(config-if)#no shut
Router(config-if)#exit
# 这里的下一跳指向2401:da8:0:2::2也可以,或者配置两条默认路由,分别指向2001:da8:0:2::2和2401:da8:0:2::2
Router(config)#ipv6 route ::/0 2001:da8:0:2::2 

ISP-1、ISP-2、ISP-3和Test-Router的配置与前面的实验相同,这里不再列出。HillstoneSG6000的配置如下:

SG-6000# config
# 该接口增加一个电信网IPv6的地址
SG-6000(config)# interface eth0/0 
SG-6000(config-if-eth0/0)# no ip address dhcp
SG-6000(config-if-eth0/0)# manage http
SG-6000(config-if-eth0/0)# zone trust
SG-6000(config-if-eth0/0)# ipv6 enable
SG-6000(config-if-eth0/0)# ipv6 add 2001:da8:0:2::2/64
SG-6000(config-if-eth0/0)# ipv6 add 2401:da8:0:2::2/64
SG-6000(config-if-eth0/0)# no shut
SG-6000(config-if-eth0/0)# exit
SG-6000(config)# zone edu
SG-6000(config-zone-edu)# type wan
SG-6000(config-zone-edu)# zone telecom
SG-6000(config-zone-telecom)# type wan
SG-6000(config-zone-telecom)# exit
SG-6000(config)# interface eth0/1
SG-6000(config-if-eth0/1)# zone edu
SG-6000(config-if-eth0/1)# ipv6 enable
SG-6000(config-if-eth0/1)# ipv6 add 2001:da8:1:1::1/64
SG-6000(config-if-eth0/1)# no shut
SG-6000(config-if-eth0/1)# interface eth0/2
SG-6000(config-if-eth0/2)# zone telecom
SG-6000(config-if-eth0/2)# ipv6 enable
SG-6000(config-if-eth0/2)# ipv6 add 2401:da8:1:1::1/64
SG-6000(config-if-eth0/2)# no shut
SG-6000(config-if-eth0/2)# exit
SG-6000(config)# ip vrouter "trust-vr"
# 指向内网教育网IPv6地址的路由
SG-6000(config-vrouter)#ipv6 route 2001:da8:0::/48 2001:da8:0:2::1
# 指向内网电信网IPv6地址的路由
SG-6000(config-vrouter)#ipv6 route 2401:da8:0::/48 2001:da8:0:2::1
# 内网教育网IPv6地址的源路由
SG-6000(config-vrouter)#iipv6 route source 2001:da8:0:8::/48 2001:da8:1:1::2 
# 内网电信网IPv6地址的源路由
SG-6000(config-vrouter)#iipv6 route source 2401:da8:0:8::/48 2401:da8:1:1::2 
SG-6000(config-vrouter)# exit
SG-6000(config)# rule id 1
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "edu"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-edu"
SG-6000(config-policy-rule)# exit
SG-6000(config)# rule id 2
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "trust"
SG-6000(config-policy-rule)# dst-zone "telecom"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "trust-to-telecom"
SG-6000(config-policy-rule)# exit
SG-6000(config)# rule id 3
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "edu"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "edu-to-trust"
SG-6000(config-policy-rule)# exit
SG-6000(config)# rule id 4
SG-6000(config-policy-rule)# action permit
SG-6000(config-policy-rule)# src-zone "telecom"
SG-6000(config-policy-rule)# dst-zone "trust"
SG-6000(config-policy-rule)# src-addr "IPv6-any"
SG-6000(config-policy-rule)# dst-addr "IPv6-any"
SG-6000(config-policy-rule)# service "Any"
SG-6000(config-policy-rule)# name "telecom-to-trust"
SG-6000(config-policy-rule)# exit
SG-6000(config)#

经过上述配置后,通过测试可知Win10和Winserver2016都可以正常访问互联网的教育网和电信网资源。默认使用的是最长匹配,即访问教育网使用以2001打头的地址,访问电信网使用以2401打头的地址。

现在我们开始配置SLA和EEM。第一步是在教育网和电信网都正常的情况下的配置,本步骤配置异常处理。当路由器(真实环境中是终端的网关设备,多数是核心交换机)探测到教育网出口故障时,就把所有分配的教育网前缀的有效寿命和首选寿命设置成0;探测到教育网出口恢复时,再取消所有分配的教育网前缀的有效寿命和首选寿命的0设置。同样,当路由器探测到电信网出口故障时,就把所有分配的电信网前缀的有效寿命和首选寿命设置成0;探测到电信网出口恢复时,再取消所有分配的电信网前缀的有效寿命和首选寿命的0设置。Router的配置如下:

# 配置探测条目1
Router(config)#ip sla 1 
# 使用ping测试,测试教育网出口的互联IPv6地址
Router(config-ip-sla)# icmp-echo 2001:da8:1:1::2 
# 探测的频率是5秒一次
Router(config-ip-sla-echo)# frequency 5 
Router(config-ip-sla-echo)#exit
# 探测条目1马上开始,一直有效
Router(config)#ip sla schedule 1 life forever start-time now
# 配置track条目100,追踪的对象是IP SLA 1的可达性
Router(config)#track 100 ip sla 1 reachability 
Router(config-track)#exit
# 创建事件管理器edu-up,教育网链路恢复
Router(config)#event manager applet edu-up 
# 日志事件追踪,当日志中出现“100 ip sla 1 reachability Down -> Up”这样的信息时,触发该事件,至于这个信息内容如何得来,稍后有解释。
# 这个日志显示的是track 100追踪到IP SLA 1的状态从down变成up,路由不可达变成可达了,也就是说教育网的出口又可达了。
# 教育网出口恢复后,要做接下来的一些配置。若是路由器这里可以使用event track 100 state up命令替换,那么直接追踪Track 100的状态是up还是down。
# 由于event track命令在一些型号的交换机上不被支持,没有event syslog pattern通用,所以这里使用了一种更通用的方法。
Router(config-applet)# event syslog pattern "100 ip sla 1 reachability Down -> Up" 
# enable的缩写,EEM代替手动配置,这里的10是行号,方便将来在中间插入
Router(config-applet)# action 10 cli command "en"
Router(config-applet)# action 20 cli command "conf t"
# 配置第一个内网接口,若是核心交换机,这里配置的就是第一个VLAN
Router(config-applet)# action 30 cli command "int e0/0"
# 取消教育网IPv6前缀通告中有效寿命和首选寿命的0设置
Router(config-applet)# action 40 cli command "no ipv6 nd prefix 2001:da8:0:0::/64 0 0"
# 配置第二个内网接口,若是核心交换机,这里配置的就是第二个VLAN
Router(config-applet)# action 50 cli command "int e0/1" 
# 取消教育网IPv6前缀通告中有效寿命和首选寿命的0设置
Router(config-applet)# action 60 cli command "no ipv6 nd prefix 2001:da8:0:8::/64 0 0" 
Router(config-applet)# action 70 cli command "end"
Router(config-applet)#exit
# 继续创建事件管理器edu-down,教育网链路故障
Router(config)#event manager applet edu-down 
Router(config-applet)# event syslog pattern "100 ip sla 1 reachability Up -> Down"
Router(config-applet)# action 10 cli command "en"
Router(config-applet)# action 20 cli command "conf t"
Router(config-applet)# action 30 cli command "int e0/0"
# 教育网链路故障,把通告中教育网IPv6前缀的有效寿命和首选寿命设置成0
Router(config-applet)# action 40 cli command "ipv6 nd prefix 2001:da8:0:0::/64 0 0" 
Router(config-applet)# action 50 cli command "int e0/1"
Router(config-applet)# action 60 cli command "ipv6 nd prefix 2001:da8:0:8::/64 0 0"
Router(config-applet)# action 70 cli command "end"
Router(config-applet)#exit
# 配置探测条目2
Router(config)#ip sla 2 
# 使用ping测试,测试电信网出口的互联IPv6地址
Router(config-ip-sla)# icmp-echo 2401:da8:1:1::2
Router(config-ip-sla-echo)# frequency 5
Router(config-ip-sla-echo)#exit
Router(config)#ip sla schedule 2 life forever start-time now
# 配置track条目200,追踪的对象是IP SLA 2的可达性
Router(config)#track 200 ip sla 2 reachability 
Router(config-track)#exit
# 创建事件管理器telcom-up,电信网链路恢复
Router(config)#event manager applet telcom-up 
Router(config-applet)# event syslog pattern "200 ip sla 2 reachability Down -> Up"
Router(config-applet)# action 10 cli command "en"
Router(config-applet)# action 20 cli command "conf t"
Router(config-applet)# action 30 cli command "int e0/0"
Router(config-applet)# action 40 cli command "no ipv6 nd prefix 2401:da8:0:0::/64 0 0"
Router(config-applet)# action 50 cli command "int e0/1"
Router(config-applet)# action 60 cli command "no ipv6 nd prefix 2401:da8:0:8::/64 0 0"
Router(config-applet)# action 70 cli command "end"
Router(config-applet)#exit
# 创建事件管理器telcom-down,电信网链路故障
Router(config)#event manager applet telcom-down 
Router(config-applet)# event syslog pattern "200 ip sla 2 reachability Up -> Down"
Router(config-applet)# action 10 cli command "en"
Router(config-applet)# action 20 cli command "conf t"
Router(config-applet)# action 30 cli command "int e0/0"
Router(config-applet)# action 40 cli command "ipv6 nd prefix 2401:da8:0:0::/64 0 0"
Router(config-applet)# action 50 cli command "int e0/1"
Router(config-applet)# action 60 cli command "ipv6 nd prefix 2401:da8:0:8::/64 0 0"
Router(config-applet)# action 70 cli command "end"
Router(config-applet)#

配置完成以后我们开始测试当教育网和电信网都发生故障的时候、网络联通情况。

教育网故障:在Win10上长ping 2001:da8:1:3::2,关闭ISP-1路由器的e0/0接口,来模拟教育网故障。大约丢了2个ping包后,教育网又恢复正常。此时我们注意到路由器的控制台显示下面的日志信息:

Router>
*Apr  8 20:45:35.277: %TRACK-6-STATE: 100 ip sla 1 reachability Up -> Down
Router>
*Apr  8 20:45:36.107: %SYS-5-CONFIG_I: Configured from console by  on vty0 (EEM:edu-down)
Router>

日志信息显示“100 ip sla 1 reachability Up -> Down”,这就是前面配置追踪事件中的日志显示。后面的信息显示执行了edu-down事件管理程序。然后我们在路由上查看此时e0/0接口的配置,显示如下:

Router(config)#do show run int e0/0
Building configuration...

Current configuration : 149 bytes
!
interface Ethernet0/0
 no ip address
 ipv6 address 2001:DA8::1/64
 ipv6 address 2401:DA8::1/64
 ipv6 enable
 ipv6 nd prefix 2001:DA8::/64 0 0
end

Router(config)#

从上面的输出可以看到,多出了一行“ipv6 nd prefix2001:DA8::/64 0 0”。我们在Win10上telnet测试路由器2001:da8:1:3::2,然后执行show users,可以看到源IPv6地址选择的是Win10上电信网分配的以2401打头的临时IPv6地址,并没有使用NAT66;telnet测试路由器2401:da8:1:3::2,然后执行show users,可以看到源IPv6地址与前面显示的一样。这证明了在教育网出口故障的情况下,终端用户不论访问的是教育网还是电信网,使用的都是电信网的IPv6地址。测试路由器也可以主动访问Win10和Winserver2016的电信网IPv6地址。

image-20220408215457375

我们在Win10上使用netsh interface ipv6 show address,结果如下图所示。从图中可以看到以2001打头的教育网的临时IPv6地址和公用IPv6地址的首选寿命都是0秒,状态是“反对”,教育网的IPv6地址失效,只有电信的IPv6地址可用。

image-20220408215534054

前面我们在Win10上使用的是无状态自动配置的测试。在Winserver2016上手动配置了教育网和电信网的IPv6地址,随着教育网链路的中断,互联网仍可以通过服务器上配置的电信IPv6地址访问服务器。教育网链路中断后,Winserver2016服务器主动访问教育网和电信网是否会受到影响?我们在Winserver2016上使用netsh interface ipv6 show address查看IPv6地址情况,显示结果如下图所示。

image-20220408220229891

从上图中我们可以看到手动配置的两个IPv6地址永久有效,但以2001打头的公用IPv6地址已经失效。此时,在Winserver2016上telnet测试路由器2001:da8:1:3::2,可以成功登录。显示telnet的来源IPv6地址是2401:da8:0:8:a070:ee02:4897:839,是电信的公用IPv6地址,可看出没有使用最长匹配。若是使用最长匹配,按理应该使用手动配置的2001:da8:0:8::2,但事实上却没有,使用的是公用IPv6地址(优于手动配置的IPv6)。

image-20220408220720467

注:这个知识点是RFC6724没有涉及的,希望将来RFC6724会作进一步修订。

电信网故障:开启ISP-1路由器的e0/0接口,关闭ISP-2路由器的e0/0接口,模拟电信网故障。Router上的显示如下:

Router>
*Apr  8 21:08:05.907: %TRACK-6-STATE: 100 ip sla 1 reachability Down -> Up
*Apr  8 21:08:06.736: %SYS-5-CONFIG_I: Configured from console by  on vty0 (EEM:edu-up)
Router>
*Apr  8 21:08:30.919: %TRACK-6-STATE: 200 ip sla 2 reachability Up -> Down
Router>
*Apr  8 21:08:31.753: %SYS-5-CONFIG_I: Configured from console by  on vty0 (EEM:telcom-down)
Router>

在上面的输出中,日志显示100 ip sla 1 reachability Down-Up,也就是教育网链路恢复了,然后调用edu-up程序。随后日志显示200 ip sla 2 reachability Up->Down,也就是电信网链路故障,然后调用telcom-down程序。在路由上查看此时e0/0接口的配置,显示如下:

Router#show run int e0/0
Building configuration...

Current configuration : 149 bytes
!
interface Ethernet0/0
 no ip address
 ipv6 address 2001:DA8::1/64
 ipv6 address 2401:DA8::1/64
 ipv6 enable
 ipv6 nd prefix 2401:DA8::/64 0 0
end

Router#

从上面的输出可以看到,路由器e0/0接口通告电信网IPv6前缀2401:da8:0::/64时,有效寿命和首选寿命都被设置成0。在Win10上使用netsh interface ipv6 show address,可以看到以2401打头的电信网临时IPv6地址和公用IPv6地址的首选寿命都为0秒,状态是“反对”,说明电信网的IPv6地址失效,只有教育的IPv6地址可用。在Win10和Winserver2016上不论telnet测试路由器2001:da8:1:3::2,还是telnet测试路由器2401:da8:1:3::2,使用的都是教育网的IPv6地址。

image-20220408221130712

本实验与前面两个实验最大区别就是:实验一在网络正常情况下也需要NAT66;实验二在网络正常情况下不需要NAT66,在网络异常时需要NAT66;本实验不论网络正常还是异常都不需要NAT66。但该实验对硬件有一定的要求,一些老的设备可能不支持IPv6 SLA,这一点通过更换设备可以克服。该实验的最大问题是配置复杂,如果内网没有采用扁平化,可能会有多个汇聚设备,那么需要在每个设备上针对每个VLAN进行配置,工作量巨大。

注:这里需要说明一下,我们选择的交换机镜像比如要能支持IPv6 SLA才可以满足本实验的需求。如果不行的话、可以把交换机替换成路由器来进行配置也是可以的。

5、IPv6实名认证

目前国内很多单位的主要任务是开通IPv6,对安全关注较少,以至于很多单位对IPv6并没有采取相关的安全措施,普遍存在“裸奔”的现状。下面我们将结合目前高校使用较多的认证设备(Dr.COM,广州热点)来演示IPv6实名认证上网的配置。

认证是对用户资料真实性进行的一种验证审核,有助于建立完善可靠的互联网信用基础。实名认证离不开认证设备,有的认证设备还兼有计费功能、限速限流功能、行为管理功能等。目前,支持IPv6认证计费的产品还不是很多,对很多厂家来说,IPv6是挑战,更是机遇。

5.1、认证方式

1、认证方式:目前认证的主要技术有以下3种:PPPoE、Web+Portal、IEEE802.1x。3种方式各有其产生的背景原因和技术特点,这里我们对这3种主要认证技术作一个简要的介绍。

PPPoE:服务提供商借助点对点以太网协议(Point-to-Point Protocol over Ethernet,PPPoE),可以在以太网上实现PPP的主要功能,包括采用各种灵活的方式管理用户。家用宽带普遍采用PPPoE接入认证。PPPoE的缺点也比较明显,主要体现在:PPP需要被再次封装到以太帧中,导致效率变低;PPPoE基于二层网络,在发现阶段会产生大量的广播流量,对网络性能产生很大的影响;PPPoE认证一般需要外置BAS,容易造成瓶颈和单点故障,且BAS设备通常较贵。

Web+Portal:客户浏览Web页面时,网址被重定向到特定的Portal认证页面。认证通过才可以访问网络。客户端使用浏览器认证,不需要安装客户端软件,从而可以降低网络维护工作量。Portal认证可以跨三层设备,应用更灵活,现在很多单位普遍使用这一认证方式。Web+Portal认证也有不足之处,例如,易用性不好,用户在访问网络前,不管是telnet、QQ、还是微信等其他业务,必须首先使用浏览器进行Web认证。Portal是三层认证,认证前的网络安全不好控制。

IEEE 802.1x:IEEE 802.1x协议为二层协议,业务报文直接承载在正常的二层报文上。用户通过认证后,业务流和认证流分离,对后续的数据包处理没有特殊要求。IEEE 802.1x协议也有不足之处,例如,要求终端交换机支持认证报文透传,这可能涉及全网交换机的改造等。综上所述,每种认证方式都有各自的优缺点,这里我们采用常用的Web+Portal认证。

2、认证设备的部署位置:认证设备一般部署在互联网出口,典型的位置在核心交换机的外侧,出口防火墙的内侧。

3、认证设备的部署模式:认证设备部署的模式可以是路由模式,也可以是网桥模式。网桥模式比较普遍,即串接在现有的网络环境中,不会改变已有网络的IP配置。

5.2、认证场景

本节分析各种常见IPv6场景下的实名认证需求,然后通过实验演示部分场景下实名认证的配置和测试。

1、场景一:纯IPv6(单IPv6前缀)认证客户端禁用IPv4协议,只启用IPv6协议,并被配置了单一前缀的IPv6地址。认证过程大致是这样的:客户端在浏览器中输入外网的IPv6地址或域名,连接请求的数据包到达认证设备后,认证设备查看数据包的源IPv6地址,发现该IPv6地址还没有被认证,认证设备把客户端请求重定向到自己的认证页。然后在客户端输入账号和密码,认证通过后,认证设备放行该源IPv6地址的外出流量。

2、场景二:纯IPv6(双IPv6前缀)认证客户端禁用IPv4协议,只启用IPv6协议,并被配置了两种前缀的IPv6地址。这里以实验10-3为例,假设在Win10浏览器中输入http://[2001:da8:1:3::2],默认使用最长匹配,Win10使用的源IPv6地址是以2001:da8:0打头的教育网地址,认证设备查看到以2001:da8:0打头的地址未被认证,接着重定向认证页面给客户端。该认证页面也有固定IPv6地址,假设是以2001打头。客户端访问认证页面,因该认证页面以2001打头,所以Win10使用的源IPv6地址是以2001:da8:0打头的教育网地址访问该认证页面,输入正确的用户名和密码认证成功后,认证设备放行以2001:da8:0打头的教育网地址。此后,假设Win10要访问http://[2401:da8:1:3::2],Win10默认使用的是以2401:da8:0打头的电信网地址,认证设备查看到以2401:da8:0打头的地址未被认证,接着重定向认证页面给客户端。因为认证页面的IPv6地址以2001打头,所以Win10使用以2001:da8:0打头的教育网地址访问该认证页面。认证设备查看源IPv6地址,发现以2001:da8:0打头的地址已经认证过,不会弹出用户名和密码的认证界面。Win10访问http://[2401:da8:1:3::]失败,以2401:da8:0打头的IPv6地址没有办法获得认证。

纯IPv6(双IPv6前缀)的认证无法通过Web+Portal认证解决,目前市面上也没有成熟的产品,毕竟纯IPv6(双IPv6前缀)的需求还比较超前。随着将来市场的需求,能支持纯IPv6(双IPv6前缀)认证的产品或解决方案一定会出现。这里笔者有一些思路:一是可以借助于MAC地址,认证设备通过类似SNMP的协议与核心交换机通信,获得IPv6地址与MAC地址的对应关系,第一个IPv6前缀认证通过时,记录该IPv6地址对应的MAC地址,第二个IPv6前缀认证需求到达时,认证设备向核心交换机查询该IPv6地址对应的MAC地址,若该MAC地址已经在认证列表中,放行第二个IPv6前缀的IPv6地址;二是在重定向报文中携带源IPv6地址的信息,Win10访问http://[2401:da8:1:3::],由于源IPv6地址以2401:da8:0打头且未被过,所以当认证设备给Win10重定向认证页面时,携带原IPv6地址信息(以2401打头的IPv6地址),Win10使用以2001打头的IPv6地址访问认证页面。认证通过后,认证设备放行以2001打头和以2401打头(认证报文携带的参数)的IPv6地址。

3、场景三:双栈(单IPv6前缀),IPv4与IPv6分开认证。客户端既启用了IPv4协议,也启用了IPv6协议,并被配置了单一前缀的IPv6地址。IPv4和IPv6分开认证,即访问IPv4站点时要认证一次,访问IPv6站点时再认证一次,这种方式比较麻烦,也不够友好;在真实环境中几乎不用。

4、场景四:双栈(单IPv6前缀),IPv6通过IPv4联动认证。客户端既启用了IPv4协议,也启用了IPv6协议,并被配置了单一前缀的IPv6地址。IPv6通过IPv4联动认证,即IPv6不单独认证,只要IPv4认证通过,IPv6也随之认证通过。客户端在浏览器中输入外网的IPv6地址或域名时,连接请求的数据包到达认证设备。认证设备查看数据包的源IPv6地址,发现该IPv6地址还没有被认证,随后认证设备把客户端请求重定向到自己的IPv4认证页面。认证设备发送给客户端的重定向报文中除了有重定向的IPv4网址,还附加了原来的IPv6地址参数。客户端使用IPv4地址并携带了原IPv6地址参数访问认证设备的IPv4认证页面,认证设备可以在客户端的请求中看到IPv4地址和IPv6地址。客户端输入用户账号和密码。认证通过后,认证设备放行该IPv4地址和IPv6地址的外出流量。IPv6通过IPv4联动认证,即只要认证一次,IPv4和IPv6都可以上网,这是目前常用的场景。

5、场景五:双栈(双IPv6前缀),IPv6通过IPv4联动认证。场景五与场景四比较像,第一个IPv6前缀地址和IPv4地址认证通过后,第二个IPv6前缀的报文到达认证设备。认证设备查看源IPv6地址不在认证通过的范围内,随后认证设备把报文重定向到IPv4认证页面。同样,被重定向的报文携带了第二个IPv6前缀的地址,认证设备从客户端的认证请求报文中看到了IPv4地址和IPv6地址。经查,IPv4地址已经通过认证,认证设备把第二个前缀的IPv6地址直接放行,这样两个前缀的IPv6地址都通过了认证。同样的原理,可以有第三个前缀的IPv6地址,只是实现起来更复杂,认证设备要把账号和所有认证通过的IPv4地址和IPv6地址关联起来。临时IPv6地址还存在有效寿命和首选寿命的问题,认证设备看到同样的IPv4地址和同样IPv6前缀的新IPv6地址时,用新IPv6地址替换过期的同IPv6前缀的旧IPv6地址。

5.1、纯IPv6单一前缀认证

本实验结合IPv6多出口解决方案一(配单运营商IPv6地址+NAT66)的实验数据,在核心交换机和防火墙之间添加Dr.COM认证设备,认证设备以网桥的模式部署,IPv6地址是2001:da8:0:2::3/64,如下图所示。Dr.COM的管理口默认是e0,IPv4地址默认是192.168.33.90/24(可以登录Dr.COM控制台,登录的用户名是root,密码是123456。登录成功后,使用ifconfig / more命令查看,真实的Dr.COM设备上有一个专门的物理管理口mgmt,在EVENG实验平台上可以将业务口当作管理口)。因为需要借助专门的服务器管理工具对Dr.COM进行配置,所以Dr.COM的e0要连接到EVE-NG的管理口网络,这样便于通过真实计算机对Dr.COM进行配置。在下图中,客户端Win10只分配了教育网前缀的IPv6地址,且上网需要实名认证。Winserver2016是服务器,需要对互联网提供服务,因此将服务器所在的两个网段均设置成直通(免认证)。

image-20220408222214164

我们打开“Dr.com管理员程序”窗口,然后单击菜单的“系统设置”,以打开“DRCOM-管理员”对话框,如下图所示。在IP地址中输入“192.168.33.90”,在用户账号中输入“ishare”,在密码中输入“123”,单击“系统设置”按钮。

image-20220409141229955

1、配置部署模式:连接成功后,我们打开“服务器管理工具”窗口,选择“设备管理”→“高级设置”,然后选中“启用桥接方式”,如下图所示。这时的部署模式是桥接模式,核心交换机和防火墙的IP配置无须改动。若不选中“启用桥接方式”,那么部署模式就是路由模式。在路由模式下,核心交换机或防火墙的IP地址及配置需要做出改变。

image-20220409141424374

2、配置IPv6地址:选择“网络设置”→“IPv6网络设置”,然后选中“服务器设置”选项卡。如下图所示,“端口地址”改成2001:da8:0:2::3,“网关”改成2001:da8:0:2::2(配置成外网防火墙的内网接口的IPv6地址),“模式”选择“IPV4与IPV6分别登录”(默认的是“IPV6通过IPV4联动登录”),单击“修改”按钮,系统提示修改IP地址,设备会重启,单击“是”按钮,重启设备。

image-20220409141652761

3、配置源地址直通:Winserver2016是服务器,需要对外提供服务且不能使用认证,因此需要将其配置成源地址直通。选择“网络设置”→“IPv6网络设置”,然后选中“源地址直通”选项卡。如下图所示,双击空白栏,将“子网开始地址”和“子网结束地址”修改成2001:da8:0:8::和2001:da8:0:8:ffff:ffff:ffff:ffff,后面的复选框选中Internet即可(其他选项是为真实环境中复杂网络考虑的,这里不用理会),单击“修改”按钮,完成第一条记录的修改。再双击第二行的空白栏,把“子网开始地址”和“子网结束地址”修改成2401:da8:0:8::和2401:da8:0:8:ffff:ffff:ffff:ffff,后面的复选框选中Internet,单击“修改”按钮,完成第二条记录的修改。

image-20220409142539498

4、配置路由设置:在上图所示的界面中为设备配置IPv6时,我们指定了对外的网关,此外还需要添加一些对内的具体路由。选择下图中的“路由设置”选项卡,单击选项卡中的“路由设置”,打开路由配置界面。双击空白栏,添加两条内网的明细路由,分别是2001:da8:0::/48和2401:da8:0::/48。网关地址是核心交换机的互联地址2001:da8:0:2::1,添加完后的结果如图10-19所示。单击“保存”按钮返回。单击图10-17中的“应用”按钮,使配置生效。

image-20220411091844682

配置完成以后我们开始测试,我们在Winserver2016上ping或telnet 2001:da8:1:3::2和2401:da8:1:3::2,都可以ping通,也可以通过telnet成功登录,这说明为服务器配置的源地址直通生效。在Win10上ping 2001:da8:1:3::2和2401:da8:1:3::2,ping不通。打开浏览器,在地址栏中随便输入一个IPv6地址,例如http://[2401::1],稍后弹出认证界面,如下图所示。

image-20220411094012047

我们在认证设备中预置了4个测试账号:drcom1、drcom2、drcom3、drcom4,密码都是123。使用drcom1登录成功后,可以成功ping通2001:da8:1:3::2和2401:da8:1:3::2。

image-20220411094251534

image-20220411094857640

验证成功之后,我们进入服务器管理工具中;选择“用户管理”→“用户资料查询”,可以看到在线的用户列表,如下图所示。选择某个在线用户,单击“注销”按钮,强制用户下线。

image-20220411095604505

在Win10上查看IPv6地址,可以验证上图使用的是临时IPv6地址。认证成功后,该临时IPv6地址可以访问外网,也可以被外网访问。因公用IPv6地址未被认证,所以外网不能主动访问Win10的公用IPv6地址。

image-20220411095724942

我们还可以登录管理后台http://192.168.33.90:809/查看用户和日志管理。登录账号是admin,密码是123。登录后可以查看或编辑用户资料,还可以查看日志等。注意该设备只有4个用户的license许可,超出的用户不能使用,如下图所示。要想新添加的用户可以使用,需删除已有的内置用户。

image-20220411100727746

5.2、IPv6多前缀联动IPv4认证

下面我们通过实验继续验证前面的场景二、场景四和场景五。本实验的拓扑如下图所示。我们在前面实验的基础上,给设备添加IPv4地址和配置路由,其中Vlan1配置了双IPv6前缀。因为本实验的重点是测试IPv6的连通性以及IPv4和IPv6的认证,所以防火墙右侧部分网络的IPv4地址不用配置。对于场景二,这里有一个新的思路:将来互联网全部都使用IPv6了,若单位内部想使用多运营商IPv6前缀,不妨在内网中继续使用IPv4,这样场景二就可以归属于场景五。

image-20220411101052140

我们配置IPv4和IPv6双前缀,给Win10配置静态的IPv4地址10.0.0.2/24,网关指向10.0.0.1。Switch的配置如下(这里仅列出IPv4地址和路由的配置,其他部分的配置参照上面的实验数据):

Switch(config)#int vlan 1
Switch(config-if)#ip add 10.0.0.1 255.255.255.0
Switch(config-if)#ipv6 add 2401:da8:0:0::1/64
Switch(config-if)#exit
Switch(config)#int e0/2
Switch(config-if)#ip add 10.0.2.1 255.255.255.0
Switch(config-if)#exit
Switch(config)#ip route 0.0.0.0 0.0.0.0 10.0.2.2

防火墙的配置如下(这里仅列出IPv4地址和路由的配置,其他部分的配置参照上面的实验数据):

SG-6000# conf
SG-6000(config)# interface ethernet0/0
SG-6000(config-if-eth0/0)# ip add 10.0.2.2 255.255.255.0
SG-6000(config-if-eth0/0)# exit
SG-6000(config)# ip vrouter "trust-vr"
SG-6000(config-vrouter)# no ipv6 route 2000::/8 2001:da8:1:1::2
SG-6000(config-vrouter)# no ipv6 route ::/0 2001:da8:1:1::2
SG-6000(config-vrouter)# ipv6 route ::/0 2001:da8:1:1::2
SG-6000(config-vrouter)# no ipv6 route source 2001:da8:0:8::/64 2001:da8:1:1::2
SG-6000(config-vrouter)# no ipv6 route source 2401:da8:0:8::/64 2401:da8:1:1::2
SG-6000(config-vrouter)# ipv6 route source 2001:da8:0::/48 2001:da8:1:1::2
SG-6000(config-vrouter)# ipv6 route source 2401:da8:0::/48 2401:da8:1:1::2
SG-6000(config-vrouter)# ip route 10.0.0.0 255.0.0.0 10.0.2.1
SG-6000(config-vrouter)# exit

配置完成以后我们开始测试场景二。我们在Win10上查看IP地址,可以发现它有一个包含两个前缀的IPv6地址和一个静态配置的IPv4地址。由于认证设备选择的是“IPV4与IPV6分别登录”,所以IPv4地址对实验没有影响。在Win10计算机上打开两个DOS窗口,分别长ping 2001:da8:1:3::2和2401:da8:1:3::2,结果ping不通。

image-20220411104107156

image-20220411104805694

下面我们来分析一下具体的认证过程:当我们在Win10的浏览器中输入“http://[2001::1] ”,Win10使用教育网的源IPv6地址去访问这个页面,认证设备截获这个请求,并重定向到认证页面http://[2001:da8:0:2::3]。Win10默认使用的是IPv6地址最长匹配,选择了以2001打头的教育网IPv6地址来访问认证页面。认证成功后,以2001打头的教育网IPv6地址被放行,在Win10上ping 2001:da8:1:3::2,可以ping通。

image-20220411110128571

在Win10的浏览器中输入“http://[2401::1]”,Win10使用电信网的源IPv6地址去访问这个页面,认证设备截获这个请求,并重定向到认证页面http://[2001:da8:0:2::3]。Win10默认使用最长匹配,选择了以2001打头的教育网IPv6地址访问认证页面。以2001:da8:0打头的地址已经认证过,因此不会弹出用户名和密码的认证界面。Win10的电信网IPv6地址无法获得认证,Win10也访问不了教育网以外的资源。在Win10上ping 2401:da8:1:3::2,不通。

1、配置IPv4地址:在“服务器管理工具”窗口中,选择“网络设置”→“以太网端口设置”,然后选中“以太网端口1”选项卡,如下图所示。单击“编辑”按钮,将以太网端口1的IP地址修改为10.0.2.3/24,网关为10.0.2.2,修改完后单击“保存”按钮,系统提示重启设备。

image-20220411115233902

注:我们编辑真实计算机的网卡,给该网卡再添加一个IP地址10.0.2.100/24,真实计算机通过该IP(IP是10.0.2.3/24)去管理Dr.COM设备。认证设备重启完成后,在真实计算机上重新运行“服务器管理工具”,注意连接的IP地址是10.0.2.3。

2、配置IPv4路由:再次连接成功后,打开“服务器管理工具”窗口,选择“网络设置”→“高级设置”,然后选择“路由设置”选项卡,如下图所示。注意下图左侧栏中的“源地址直通设置”,这里配置的是IPv4源地址直通,本实验中服务器没配置IPv4地址,这里不用配置。

image-20220411121753548

单击“路由表设置”按钮以打开路由表配置窗口,然后添加去往内网的IPv4路由,添加完成后的界面如下图所示。可单击“保存”按钮进行保存,单击“关闭”按钮返回。单击下图中的“应用”按钮,配置的IPv4路由立即生效,此时在Win10计算机上可以ping通10.0.2.3,ping不通10.0.2.2(因没有认证)。

image-20220411122143534

image-20220411131250977

3、配置联动认证:在下图的模式中选择“IPV6通动IPV4联动登录”,单击“修改”按钮,认证设备提示重新启动。

image-20220411131352947

配置完成以后我们开始测试场景四。我们在Win10上继续打开两个DOS窗口,分别长ping 2001:da8:1:3::2和2401:da8:1:3::2,都ping不通。在Win10的浏览器地址栏中输入http://[2001::1],此时Win10使用的源IPv6地址是以2001打头的教育网IPv6地址。认证设备发现该IPv6地址还没有被认证,认证设备将Win10重定向到IPv4的认证页面。重定向报文中除了包括重定向的网址http://10.0.2.3,还携带了原IPv6地址参数(这个参数没有显示,感兴趣的同学可以通过抓包查看),弹出的认证页面如下图所示。注意地址栏中显示的是IPv4的认证页面,也就是IPv6通过IPv4联动登录。在下图所示的认证页面中输入正确的账号和密码登录,随后认证设备放行原IPv4地址和携带的IPv6地址。认证成功后,ping 2001:da8:1:3::2的窗口显示已通,但ping 2401:da8:1:3::2的窗口仍然不通。

image-20220411132002915

image-20220411132127881

我们继续测试场景五。在Win10的浏览器地址栏中输入http://[2401::1],此时Win10使用的源IPv6地址是2401打头的电信网IPv6地址,认证设备发现该IPv6地址还没有被认证,认证设备将Win10重定向到IPv4的认证页面,重定向报文中除了包括重定向的网址http://10.0.2.3,还携带了电信网2401打头的IPv6地址参数。认证设备获知该源IPv4地址已经被认证过,认证设备放行认证报文携带的2401打头的电信网IPv6地址。此时,ping 2401:da8:1:3::2的窗口也显示通了。

image-20220411134119384

选择“用户管理”→“用户资料查询”,可以看到在线的用户列表,如下图所示。注意在线用户drcom1,登录IP是“10.0.0.2 2001:da8::837:52b3:7d61:8b67 2401:da8::837:52b3:7d61:8b67”,该用户使用了1个IPv4、2个IPv6。

image-20220411134345624

注:这里我并没有查询到到2个IPv6、可能是哪里的配置出了问题;有知道的小伙伴可以在文章后面留言。

这里我们思考一个问题、临时IPv6地址默认的有效寿命是1天,1天后会怎么样呢?1天后原来的临时IPv6地址失效,新的临时IPv6地址会触发新的认证重定向。由于IPv4地址没变,所以新的IPv6地址会被自动放行,同时替换掉同样前缀过时的IPv6地址。读者也不用等待1天,使用前面介绍过的netsh interface ipv6 set privacy maxvalidlifetime=20m maxpreferredlifetime=11m命令来将临时IPv6地址的有效寿命改为11分钟,这样很快就会生成新的临时IPv6地址了。

推荐文章