近年来,随着互联网的飞速发展,IP地址的消耗速度惊人,据IANA测算,IPv4地址即将彻底消耗完毕。时至今日,IPv6已成为我国信息产业不得不做的一件事。
IPv6的由来
IPv6是下一版本的互联网协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽。为了扩大地址空间,计划通过IPv6重新定义地址空间。不过随着IPv6开始进入设计阶段,设计者们不再单纯的将目标定位在解决地址空间短缺的问题上,提供一个更为高效、更为安全并能更好支持不同业务和移动特性的新路由架构称为IPv6的最终目的。
为何要部署IPV6
IPv4的局限性:
1.地址空间的局限性:IP地址空间的危机由来已久,并正是升级到IPv6的主要动力。
2.安全性:IPv4在网络层没有安全性可言,安全性一直被认为是由网络层以上的层负责。
3.自动配置:对于IPv4节点的配置比较复杂,让很多普通用户无所适从。
4.NAT:破坏了Internet端到端的网络模型。
5.由于IPv4地址分配杂乱无章,没有层次性,网络设备需要维护庞大的路由表项。
6.IPv4包头过于复杂,使得网络节点处理的效率不高。
IPV6的好处:
1. 更大的地址空间
IPv6最明显的特征是它巨大的地址空间。在IPv4中地址位为32位,即总共的地址大小为4294967296。而在IPv6中,地址位大小为128位,它允许的地址空间为218或340 282 366 920 938 463 463 374 607 431 768 211 456(3.4×1038)个可能的地址。
2. 更高效的路由基础结构
现在基于IPv4的因特网,其路由结构在主干上是平面的,换句话说,现在的因特网主干网上的路由器,其路由表不能反映ISP之间的层次关系。地理上相邻的ISP之间所分配的IP地址空间是不连续的,比如一个从亚洲接入因特网骨干网的ISP所分配的地址空间,可能会与一个从欧洲接入因特网骨干的ISP在地址空间上是连续的。这样的显示造成在骨干网上很难实现路由汇总,并使得因特网骨干网上的路由表变得越来越大,最近的数据显示,骨干网上路由器的路由条目已经超过10万条,如此一来,路由的效率会越来越低下,而骨干路由器也越来越不堪负重。
IPv6从设计之处就考虑到了这个问题,IPv6的地址分配将比IPv4更严格,并且这种分配从一开始就考虑到了ISP之间的层次关系,其效果是:在IPv6的骨干路由上很容易就能够实现路由条目的汇总,在IPv6骨干路由器上的路由条目将大幅减少。因此,IPv6会是一个更高效的路由基础架构。
3. 更好的安全性
在像因特网这样的公共媒体上实现专用通信,需要安全服务保护数据在传输中免遭查看或修改。虽然存在用于为数据包提供安全传输的基于IPv4的标准(即IPSec),但是该标准只是可选的。而在IPv6中,IPSec支持是一个协议要求。该要求为设备、应用程序和服务的网络安全需求提供了基于标准的解决方案,并促进不同的IPv6之间实现互操作性。
4. 移动性
移动IPv6允许IPv6节点成为移动的(任意改变在IPv6网络上的位置),同时仍然保持现有的连接。使用移动IPv6,移动节点始终通过一个永久地址可达。连接是使用分配给移动节点的特定永久地址建立的,不管移动节点改变位置和地址多少次,该连接都得以保持。
5. 更好的服务质量(QoS)
IPv6报头中使用了一个被称为流标签(Flow Lable)的新字段,这个新字段用于定义如何处理和标识流量。同时,在IPv6的包头中,还定义了一个流量类型(Traffic Type)字段,能够用来区分不同的业务流。流类型和流标签的组合能够为IPv6提供强大的QoS。
6.包头简单,通过扩展包头技术可实现以后的新技术扩展
IPv6相对IPv4的变化概述
我们可以通过对IPv4和IPv6包头的比较,来研究为什么IPv6能够实现比IPv4更强大的功能,如下图所示:
IPv4中,所有包头以32个位(bit)为单位,即基本的长度单位是4个字节。上图为IPv4的包头格式。IPv6中,包头以64个位(bit)为单位,且包头的总长度是40个字节。IPv6的包头格式上图IPv6所示
比较两种包头格式可知,IPv6对IPv4进行了较大改进:首先,取消了IPv4包头的6个字段:IP包头长度(Header Length)、服务类型(Service Type)、标识(Identification)、标志(Flag)、标志偏移量(Fragment Offset)及头标校验和(Header Checksum);其次,在IPv6中有三个控制字段重新命名,并在一些条件下重新定义:长度(Length)、服务类型(Service Type)、生存时间(Time to Live) 最后,增加了两个新的字段:优先级(Priority)和流标识(Flow Label)。
IPv6对其包头定义了以下字段
版本:长度为4位,对于IPv6,该字段必须为6
流量控制:长度为8位,相当于IPv4中的TOS字段,规定了使用的服务类型
流标签:长度为20位,用于标识同一业务流的数据。中间转发路由器对于同一源和目的的一个业务流数据采用了相同的转发行为,来提高转发效率
载荷长度:长度为16位,其中包括包载荷的字节长度,意味着计算载荷长时包括了IPv6扩展头的长度
下一报头:与IPv4协议字段类似,指出了高层是TCP还是UDP协议
跳数限制:长度为8位,类似于IPv4中的TTL,但是跳数的限制由上层协议来规定
源地址:IP地址变为128位,指出了发送方地址
目标地址:为128位,指出了接收方地址,这个地址可以是一个单播、组播、或任意点播地址
IPv6基本术语
为了更好理解IPv6的相关概念,先来了解下IPv6网络的基本术语。有些容易和IPv4的概念混淆,要注意辨别。下面为一个最简单的IPv6网络,如图所示:
1. 局域网段:它是IPv6链路的一部分,由单一介质组成,以二层交换设备为边界。
2. 链路:以路由器为边界的一个或多个局域网段。IPv6已经定义了很多链路层技术,包括一些典型的局域网技术(如:以太网、令牌网和FDDI),还包括一些广域网技术(如:点到点协议PPP、帧中继和ATM)。
3. 子网:在IPv6中,使用相同的64位IPv6地址前缀的一个或多个链路被称为子网,这和IPv4中的子网有所不同。子网也被称为网段。一个子网可以被内部子网路由器分为几个部分。内部子网路由器能够为子网中的每个链路提供转发和配置功能。
4. 邻节点:连接到同一链路上的节点。这是一个非常重要的概念,因为IPv6的邻节点发现机制具有解析邻节点链路层地址的功能,并可以检测和监视邻节点是否可以到达。
5. 链路MTU:可以在一个链路上发送的最大传输单元(MTU)。对于一个采用多种链路层技术的链路来说,链路MTU是这个链路上存在的所有链路层技术中最小的链路MTU。
6. 路径MTU(PMTU):在IPv4的网络中,需要使用特别的设置才能启用PMTU,才会让数据包在经过的路由器上不会有分片和重装的行为发生。而在IPv6网络中,默认情况下就只会在源节点有分片的行为,在目标节点有重装的行为发生。PMTU是从源到目标路劲上所有链路的最小链路MTU。链路MTU是能够在这个链路上发送的最大长度的链路层有效载荷。
下图所示:显示了IPv6中的PMTU的发现过程
IPv6地址表示
1. IPv6的首选格式
其实,IPv6的128位地址是每16位划分为一段,每段被转换成为一个4位十六进制数,并用冒号隔开。这种表示方法叫冒号十六进制表示法。下面是一个二进制的128位IPv6地址。
0010000000000001000001000001000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000100010111111111
将其划分为每16位一段
0010000000000001 0000010000010000 0000000000000000 0000000000000001
0000000000000000 0000000000000000 0000000000000000 0100010111111111
将每段转换为十六进制数,并用冒号隔开
2001:0410:0000:0001:0000:0000:0000:45ff
这就是RFC2373中定义的首选格式
2. 压缩表示
上面的IPv6地址中有好多0,有的甚至一段中都是0,表示起来比较麻烦,其实可以将不必要的0去掉。对于“不必要的0”,以上面的例子来看,在第二个段中的0410省掉的是开头的0,而不是结尾的0,所以在压缩表示后,这个段为410,这是一个IPv6地址表示中的一个约定;对于一个段中中间的0,如2001,不做省略;对于一个段中全部数字为0的情况,保留一个0。根据这些原则,上述地址可以表示如下形式:
2001:410:0:1:0:0:0:45ff
这仍然比较麻烦,为了更方便书写,RFC2373中规定:当地址中存在一个或多个连续的16比特为0字符时,为了缩短地址长度,可用一个::(双冒号)表示,但一个IPv6地址中只允许有一个::。要注意的是:使用压缩表示时,不能将一个段内的有效的0也压缩掉。
例如:不能把FF02:30:0:0:0:0:0:5压缩表示成FF02:3:5,而应该表示为FF02:30::5。要确定::代表多少位零,可以计算压缩地址中的块数,用8减去此数,然后将结果乘以16。
例如:地址FF02::2有两个块(“FF02”块和“2”块),这意味着其他6个16位快(总共96位)已被压缩。
因此上述地址又可以表示为如下形式:
2001:410:0:1::45ff
3. IPv6地址前缀
前缀是地址的一部分,这部分或者是固定的值,或者是路由或子网的标识。作为IFv6子网或路由标识的前缀,其标识方法与IPvv4中用1的个数表示子网掩码的表示方法是相似的,IPv6前缀用“地址/前缀长度”表示法来表示。
例如:23EO:0:A4::/48是一个路由前缀,而23E0:0:A4::/64是一个子网前缀。在IPv6中,用于标识子网的位数总是64,因此,64位前缀用来标识节点所在的单个子网。对于任何少于64位的前缀,要么是一个路由前缀,要么就是包含了部分IPv6地址空间的一个地址范围。根据这个定义,FF0::/8被用于表示一个地址范围,而3FFE:FFFF::/32是一个路由前缀。
IPv6地址类型
IPv6有三种地址类型
1. 单播:单播地址用于从一个源到单个目标进行通信。一个单接口有一个单播地址标识符。发送给一个单播地址的包传递到由该地址标识的接口上。
2. 组播:组播地址用于标识多个接口。组播地址用于从一个源到多个目标进行通信,数据会传送到多个接口。
3. 任播:任播地址标识多个接口。使用适当的路由拓扑,定址到任播地址的数据包将被传送到单个接口,即该地址标识的接口中最近的一个。“最近的”接口是指最近的路由距离。任播地址用于从一个源到多个目标之一进行通信,数据将传送到单个接口。
IPv6地址总是标识接口,而不标识节点。节点由分配给其接口之一的某个单播地址标识。
RFC3513没有定义任何类型的广播地址,而换用了IPv6组播地址。例如,IPv4的子网和有限的广播地址被保留的IPv6组播地址FF02::1取代。
IPv6单播地址
以下地址类型都是单播IPv6地址:
全局单播地址
链路本地地址
站点本地地址
特殊IPv6地址
兼容性地址
1. 全局单播地址
全局单播地址相当于IPv4的公网地址,它们在因特网上的IPv6部分(称为IPv6因特网)是可全局路由和访问的。全局单播地址通俗的说就是IPv6公网地址。
全局单播地址的结构如下图所示:
如上图所示:以001作为前三位的地址称为可汇聚全局单播地址,其中各个字段的含义如下
TLA ID:顶级汇聚标识符,标识了路由层次结构的最高层,由因特网分配号码权威机构(IANA)来管理的,IANA负责将TLA ID分配给地区的Internet注册机构,地区Internet注册机构又把每个TLA ID分配给那些大的、永久的ISP。
目前由IANA负责进行IPv6地址的分配,主要由三个地方组织来执行:
* 欧洲区域的RIPE-NCC(www.ripe.net)
* 北美区域的INTERNIC(www.internic.net)
* 亚太区域的APNIC(www.apnic.net)
RES:未来扩展TLA ID或NLA ID的长度而保留的
NLA ID:下一级汇聚标识符,允许ISP在自己的网络中建立多级的寻址结构
SLA ID:站点汇聚标识符,被每一个单独的机构用于标识自己站点中的子网
Internet ID(接口ID):后64位表示了接口ID,相当于IPv4中的节点ID或主机ID
2. 本地单播地址
本地使用的单播地址分为以下两种:
链路本地地址:用于链路上的邻居之间以及邻居发现过程,它定义IPv6子网上的节点与主机和路由器的交互方式。
只能在连接到同一本地链路的节点间使用,不能在站点内的子网间路由。
注意:IPv6路由器绝对不会将链路本地通信量转发到链路外
站点本地地址:用于组织Intranet上的同一站点内不同节点之间的通信。
注意:“Internet Protocol Version 6 (IPv6) Addressing Architecture”(因特网协议版本6(IPv6)编址体系结构)标准的更新版本现已作为因特网草案发布,其中规定禁止使用站点本地地址。这一关于IPv6编址标准的新的因特网草案将淘汰RFC3513。禁止的原因是来源于这样的事实:在IPv6中不存在地址短缺的问题;要避免出现对端到端模型的破坏,这也是IPv4的网络中NAT使用时的最大缺陷。
3. 特殊IPv6单播地址
以下是特殊IPv6地址:
(1)未指定地址
未指定地址(0:0:0:0:0:0:0:0或::)表示地址缺失,相当于IPv4的未指定地址0.0.0.0。未指定地址通常作为数据包的源地址,用来验证临时地址唯一性。未指定地址从不分配给接口或用作目标地址。
(2)环回地址
环回地址(0:0:0:0:0:0:0:1或::1)标识一个环回接口。使用此地址,一个节点可以向自己发送数据包;此地址相当于IPv4的环回地址127.0.0.1。定址到环回地址的数据包从不在链路上发送,也不会由IPv6路由器转发。
4. 兼容性地址
为了帮助从IPv4向IPv6过渡,定义了以下地址:
(1)与IPv4兼容的地址
与IPv4兼容的地址,0:0:0:0:0:0:w.x.y.z或::w.x.y.z(其中的w.x.y.z是公用IPv4地址的点分十进制表示形式),供那些使用IPv6因特网进行通信的IPv6/IPv4节点使用。IPv6/IPv4节点是兼用IPv4和IPv6协议的节点。在IPv6节点要访问IPv4节点的时候,可以使用这种地址作为IPv6节点去访问IPv4节点的目的地址。NAT/PT网关处理时只要把低32位取出来作为IPv4包的目的地址即可。这种IPv6地址构成方法要求每个IPv6节点有一个对应的IPv4地址。
(2)IPv4映射地址
IPv4映射地址,0:0:0:0:0:FFFF:w.x.y.z或::FFFF:w.x.y.z,将仅使用IPv4的节点表示为IPv6节点。IPv4映射地址仅用作内部表示形式。IPv4映射地址从不用作IPv6数据包的源或目标地址。Windows Server 2003和Windows XP中IPv6不支持IPv4映射地址。
3)6to4地址
6to4是在RFC3056中描述的隧道技术。使用6to4时,在IPv4网络上发送IPv6通信之前,使用IPv4包头封装IPv6通信。6to4使用的全局地址前缀为2002:WWXX:YYZZ::/48,其中WWXX:YYZZ既是全局地址的“下一级汇聚标识符”(NLA ID)部分,又是指派给站点或主机的公用IPv4地址(w.x.y.x)的用冒号分隔的十六进制表示。6to4主机的6to4完整地址是2002:WWXX:YYZZ:[SLA ID]:[Interface ID]。与IPv4兼容地址不同的是,6to4在公网上运行IPv4协议。
值得注意的是,兼容地址并不只是上面所列举的几种,由于RFC关于兼容地址的定义还在进一步完善的过程中,还会出现更多的地址类型
IPv6组播地址
所谓组播,是指一个源节点发送的单个数据包能被特定的组播组的成员节点接受到,关于组播的概念要明确以下几个方面:
* 任何节点都能够作为一个组播组的成员
* 一个源节点可以发送数据包到组播组
* 组播组的所有成员收到发往改组的数据包
* 组播地址在IPv6包中不能用作源地址或出现在任何选路头中
在IPv6网络中,组播地址用特定的前缀来标识,其最高为前8位为1,如下图所示:
标志(Flags)字段有4个比特,目前只是用了最后一个比特(前3位必须置0),当该位置为0时,表示当前的组播地址是由IANA所分配的一个永久分配的组播地址,例如:
FF00:0:0:0:0:0:0:0
FF01:0:0:0:0:0:0:0
……
FF0E:0:0:0:0:0:0:0
FF0F:0:0:0:0:0:0:0
上面列出的是保留的组播地址,且永远不能分配给任何组播组。
当该值为1时,表示当前的组播地址是一个临时组播地址(非永久分配地址)。非永久分配的组播地址仅在给定范围内才有意义。
例如:在某个站点有非永久的站点本地组播地址FF15:0:0:0:0:0:0:101标识的组与一个不同站点中使用同一个组标识符的组没有关系,与不同范围内使用同一个组标识符分配非永久地址的组也没有关系。
范围(Scope)用来限制组播数据流在网络中发送的范围。该字段占4比特。RFC2373对该字段定义如下:
0:预留
1:节点本地范围
2:本地链路范围
5:本地站点范围
8:组织本地范围
E:全球范围
F:预留
其他的值没有定义
下图所示,显示了节点本地范围、链路本地范围、站点本地范围
IPv6任播地址
任播地址是IPv6特有的地址类型,它用来标识一组网络接口(通常属于不同的节点)。路由器会将目标地址是任播地址的数据包发送给距离自己最近的一个网络接口。适合于One-to-One-of-Mary(一对一组中的一个)的通信场合。接收方只需要是一组接口中的一个即可,例如移动用户上网就需要因地理位置的不同,接入离自己最近的一个接收站,这样才可以是移动用户早地理位置上不受太多的限制。
任播地址从单播地址空间中进行分配,使用单播地址的任何格式。仅看地址本身,节点是无法区分任播地址与单播地址的。所以,节点必须明确配置从而指明它是否为一个任播地址。目前,任播地址仅被用作目标地址,且仅分配给路由器。
任播地址的用途之一是标识一组路由器,该组路由器是属于提供因特网服务的一个组织的。这样的地址在IPv6选路头中可用作直接地址,能够使包的传递通过一个特定的汇聚地址系列。其他可能的用途是标识连到一个特定子网的一组路由器。关于任播地址的严格定义仍然还在讨论中,但以下特性是明确的:
(1)任播地址不能用作IPv6包的源地址
(2)任播地址不能指定给IPv6主机,只能指定给IPv6路由器
IPv6接口标识符
单播IPv6地址的最后64位是接口标识符,该标识符对于IPv6地址的64位前缀来说是唯一的。IPv6接口标识符有以下几种:
(1)由扩展唯一标识符(EUI-64)地址派生而来的64位接口标识符。
(2)随机生成的接口标识符,随时间而更改以提供一定的隐蔽性。
(3)在全状态地址自动配置(例如,通过动态主机配置协议IPv6版[DHCP6]过程中分配的接口标识符)。
IPV6的基本命令
1
2
3
4
5
6
7
8
9
10
|
R1(config)
# ipv6 unicast-routing //在路由器上开启IPV6路由功能
R1(config-
if
)
# ipv6 enable //在接口下启用IPV6,会自动生成一个link-local地址
R1(config-
if
)
# ipv6 address 2001::1/64 //指定一个IP地址,配置后会自动生成一个link-local地址
R1(config-
if
)
# ipv6 address FE80:0:0:0:0123:0456:0789:0abc link-local //手工指定link-local地址
R1(config-
if
)
# ipv6 address 2001:0410:0:1::/64 eui-64 //使用eui-64格式自动生成IPV6地址的低64位
R1(config-
if
)
# ipv6 unnumbered //让本接口使用另一个接口的MAC地址生成源地址
R1(config-
if
)
# ipv6 mtu 1500 //配置接口的MTU值
R1(config-
if
)
# ipv6 nd suppress-ra //关闭自动下发前缀
R1(config-
if
)
# no split-horizon //关闭水平分割 注意IPV6的水平分割是在进程下关闭,不是在接口下
R1
# show ipv6 interface e0 //显示IPV6接口的信息,包括IPV6地址,link-local地址,加入的组播地址及被请求节点组播地址
|
注意:串口和loopback口会借用以太口的MAC地址来生成link-local地址。
静态路由
1
|
R1(config)
#ipv6 route 2001::/64 e0 fe80::1234:abcd:1234:abcd (下一跳的link local地址)
|
RIP
在IPV6中使用UDP521端口,在IPV4中是520端口
使用组播地址:FF02::9
操作半径15跳
1
2
3
|
R1(config)
# ipv6 unicast-routing
R1(config)
# ipv6 router rip wolf //必须要有一个进程号
R1(config-
if
)
# ipv6 rip wolf enable //必须进入接口下开启接口的RIP
|
1
2
3
4
|
R1
# show ipv6 route
R1
# show ipv6 route rip
R1
# show ipv6 rip
R1
# show ipv6 rip database
|
IPV6的metric值在起源路由器发出时和入口加1.IPV4是在出接口加metric值。
IPV6的水平分割是整个路由器开启(在进程中关闭),IPV4是在接口下开关的,在帧中继的HUB-spoke模式中要关闭水平分割
OSPF
在IPV6中使用的是OSPFV3版
1
2
3
4
5
6
7
8
9
|
R1(config)
# ipv6 router ospf 110
R1(config-router)
# router-id 2.2.2.2 //必须手工指定一个IPV4地址的标识,不能自动选择
R1(config)
# int s0
R1(config-
if
)
# ipv6 ospf 110 area 0 //在接口下宣告
R1(config)
# int lo0
R1(config-
if
)
# ipv6 ospf 110 area 0 //环回口依然是主机路由,128位,可通过改网络类型来改动
R1
# show ipv6 route ospf
R1(config)
# int s0
R1(config-
if
)
# ipv6 ospf neighbor 2001::2 //OSPF手工指邻居在接口下做,而IPV4是在进程下做
|
is-is
1
2
3
4
5
|
R1(config)
# router isis
R1(config-router)
# net 49.0001.2222.2222.2222.00
R1(config-router)
# log-adjacency-changes all //当邻居起来时出个提示
R1(config)
# int s0
R1(config-
if
)
# ipv6 router isis //IPV4的ISIS也是在接口下启用
|
重分发直连
1
2
3
4
5
|
R1(config)
# router isis
R1(config-router)
# redistribute connected //在IPV4中直接在ISIS进程中重分布
R1(config)
# router isis
R1(config-router)
# address-family ipv6 //在IPV6中重分发必须进这一进程
R1(config-router-af)
# redistribute connected //重分发命令必须在address-family进程中用
|
BGP
使用TCP179端口,和IPV4中一样
1
2
3
4
5
6
7
8
9
10
11
12
|
R1(config)
# router bgp 3
R1(config-router)
# no autosummary
R1(config-router)
# bgp router-id 3.3.3.3
R1(config-router)
# no synchronization
R1(config-router)
# neighbor 2001:13::1 remote-as 1
R1(config-router)
# address-family ipv6 //进入address-family进程下
R1(config-router-af)
# neighbor 2001:13::1 activate //在address-family进程下激活,否则不起效
R1(config-router-af)
# network 3::/64
R1
# show bgp ipv6 neighbor
R1
# show bgp ipv6 summary //注意bgp与ipv6反过来了
R1
# show bgp ipv6
R1
# clear ip bgp * //清邻居的命令和IPV4中一样
|
IPV6 ACL
在IPV6中ACL只能用来过滤数据流,不能用来过滤路由。
在IPV6中,ACL必须命名,写法类似IPV4命名访问列表
1、标准的访问列表可以基于源和目的进行过滤
2、扩展的访问列表可以基于源地址、目的地址、传输层协议、源端口、目的端口及其他特性进行过滤。
事实上IPV6没有标准和扩展之分了,就只有扩展的,命名的ACL。
案例一:
1
2
3
4
5
|
R1(config)
# ipv6 access-list wolf
R1(config)
# deny ipv6 2001:12::2/128 any
R1(config)
# permit ipv6 any any
R1(config)
# int s0
R1(config-
if
)
# Ipv6 traffic-filter wolf out
|
案例二:在R1上,只允许2002:1::/64和2001:12::/64的路由传给R3
1
2
3
4
5
|
R1(config)
# ipv6 prefix-list wolf permit 2001:12::/64
R1(config)
# ipv6 prefix-list wolf permit 2002:1::/64
R1(config)
# ipv6 router rip xwx
R1(config-router)
# distribute-list prefix-list wolf out Serial1
R1(config)
# clear ipv6 rip xwx
|
在IPV6中,分布列表后只能跟prefix,不能跟ACL