IPV6网络技术
由于IPv4
地址只有32bits,约43亿个地址,远远不足以供给当前互联网的使用需求。并且IPv4
的设计在现在的使用中存在一些突出的问题,如安全问题,无连接问题等。
IPv6
(Internet Protocol Version 6
)又称IPng
(IP Next Generation
),是IPv4
的升级版本,解决了IPv4
地址不足和目前IPv4
使用中出现的问题,并对其赋予了一些新的功能。
IPv6
比之IPv4
的升级:
- 地址空间:
IPv4
采用 32bits 标识,理论上最多可以提供43亿地址,由于地址划分问题,实际不到43亿IPv6
采用 128bits 标识,理论可以提供43亿*43亿*43亿*43亿
个地址,号称地球每一粒沙子都可以分到一个地址
- 报文格式:
IPv4
报文长度20-60字节,其中基础报头20字节,拓展报头40字节IPv6
报文长度固定40字节,并对IPv4
报头做了一些优化
- 自动配置和重新编址:
IPv4
自动配置和重新编址机制主要依靠DHCP协议IPv6
支持两种地址自动配置方式,并使主机可以主动发现网络
- 端到端安全:
IPv4
不支持端到端安全,只能配置IPSec保障安全传输IPv6
本身就支持IPSec,无需多余的隧道封装
IPv6报文格式
IPv6
报文在IPv4
的基础上做出了很大的改变:
IPv6
将报头分为了基本报头和拓展报头两部分,基本报头和IPv4对比如下
IPv6基本报头
字段对比解释:
Version
:版本【4bit】,Version
在v6和v4中意思一致,都是表示网络层协议版本,IPv4
是4,IPv6
是6IHL
:Internet Header Lenght
因特网首部长度【4bit】,在IPv4
中表示IPv4
报头长度,IPv6
报文长度固定40字节,所以弃用此字段区分服务字段(Tos or Traffic Class)【8bit/ IPv4和IPv6的区别就是改了个名字】:
- IPv4:
Tos/DS Field
字段用于区分服务,实现QOS - IPv6:IPv6改用
Traffic Class
字段用于区分服务,实现QOS
- IPv4:
Flow Label
:流标签【20bit】,IPv6新增的字段,用于区分流。通过流标签+源地址唯一标识一条数据流,中间设备可以以此提高转发效率(目前实际网络中还没有具体应用)IPv6取消了IPv4报文中用于分片的
Identification
字段、Flags
字段、Fragment Offset
字段分片功能改由拓展报头实现,并规定中间的转发设备不可对报文进行分片操作
这样做的原因主要有两点
- 数据传输时,有的报文需要分片、有的不需要分片,但IPv4中,无论需不需要,分片字段始终存在。此时每个设备收到报文后都会读取分片字段,这是对转发资源的一种浪费
- 由于分片只需要报文发送方(分片)和报文接收方(重组),所以中间的转发设备既不需要分片操作也不需要读取分片信息。IPv4中间设备也可以对报文分片,比较混乱。
通过拓展报文实现分片,就可以做到数据传输时除了接收方和发送方会处理分片信息,其他设备只通过基本报头转发报文,均不理会分片信息
TTL
/Hop Limit
:报文生存时间,IPv6中改名为Hop Limit
(跳数限制)【8bit】,功能都是定义了IP数据报所能经过的最大跳数。每经过一个设备,该数值减去1,当该字段的值为0时,数据报将被丢弃。TTL和Hop Limit 最开始定义时的含义是不同的。在互联网早期,由于设备性能太差,TTL定义时是指报文在网络中的生存时间,单位是秒而不是跳数。而后期随着网络发展,设备性能大幅提高,TTL的含义从生存时间变成了最大跳数
而现在IPv6将其特意更名为Hop Limit,也有这一层原因
Protocol
/Next Header
:上层协议号【8bit】,IPv4中用于标识上层所使用的协议,IPv6由于引入了拓展报头,上层很可能不是其他协议而是IPv6拓展报文,所以更名为Next Header
,两者含义一致如果基本报头后面是拓展报头,Next Header的值为拓展报头协议号,否则为下一个协议报文协议号
Payload Length
:载荷长度【16bit】,由于IPv6基本报头固定40字节,所以IPv6将IPv4中的Total Length
和IHL
统合为了Payload Length
字段,表示IPv6报文携带的数据长度(拓展报头+上层数据),该值不包括基本报文长度Source address
:源IP【128bit】,IPv6中占16字节Destination address
:目的IP【128bit】,IPv6中占16字节
Padding
字段:由于IP协议只需要将报文传递给对端设备,并且数据链路层、传输层、应用层都做了校验功能。所以IP协议的校验显得冗余,校验和Padding
字段被IPv6取消
Options
字段:IPv4使用Options
字段用于功能拓展,但实际网络并不常用,IPv6取消了这个字段,拓展功能全部交由拓展报头实现
IPv6拓展报头
IPv6将IPv4中Options
字段的功能放到了扩展报头中,扩展报头被置于IPv6报头和上层协议数据单元之间。
一个IPv6报文可以包含0到任意个扩展报头,只有当设备需要处理时才会进行读取
IPv6拓展报头不受40字节限制,但为了提高处理选项头和传输层协议的性能,单个扩展报头长度是8字节的整数倍。
当使用多个拓展报头时,IPv6基本报头Next Header
指向第一个拓展报头,第一个拓展报头Next Header
指向第二个…依次下指,最后一个拓展报头指向上层协议
一个拓展报头只有三个字段:
Next Header
:指明下一个扩展报头(如果存在)或上层协议的类型,长度8bitExtension Header Len
:拓展报头长度,不包括Next Header
字段,长度8bitExtension Head Data
:拓展报头数据,长度可变。为一系列选项字段和填充字段的组合。
拓展报头整体不足8字节整倍数时会填充Extension Head Data
字段
目前,RFC定义了6个IPv6扩展报头:
报头类型 | Next Header字段值 | 描述说明 |
---|---|---|
逐跳选项报头 | 0 | 告诉转发路径上所有路由器需要处理的参数 这些参数即使是转发路径的路由器也需要处理 比如提示信息参数,资源预留参数 |
目的选项报头 | 60 | 携带只有目的节点需要处理的参数 |
路由报头 | 43 | 控制报文强制经过指定路由器转发到目的节点 |
分段报头 | 44 | IPv6报文分片功能由此报头实现 |
认证报头 | 51 | 用于携带IPSec的AH报头,提供认证、数据完整性以及重放保护 |
封装安全静载报头 | 50 | 用于携带IPSec的ESP报头,提供认证、加密等功能 |
IPv6拓展报头必须按顺序出现(可以跳级出现),顺序和上表一致:逐跳选项->目的选项->路由->分段->认证->封装安全静载
ps:一个IPv6报文携带了目的选项和分段报头,那么目的选项必须出现在分段报头之前
除路由报文可以在IPv6报文中出现一次或者两次(后一个路由报头之前和上层协议数据之前),其他拓展报头在一个报文中都只能出现一次
IPv6地址空间
IPv6地址格式
IPv6地址长度128bit,一般使用冒号分割为8段,每一段16bit,使用16进制表示,如:
2001:A001:0D0B:0000:0000:0000:0000:0001
IPv6对大小写不敏感,A001
和a001
等效
IPv6和二进制快速转换的方法是:每一个16进制数都对应4bit二进制,如:
2001 --> 0010 0000 0000 0001
;其中2 --> 0010
IPv6支持简写,规则为:
原地址:FC00:0000:130F:0000:0000:09C0:876A:130B
每段16进制的前导0可以省略
简写:FC00:0:130F:0:0:9C0:876A:130B
如果有1个或者多个全0段,则可以使用双冒号
::
代替一个IPv6地址中有且只能出现一个
::
,其余全0段必须至少保留一个0简写:FC00:0:130F::9C0:876A:130B
和IPv4类似,IPv6同样使用地址/掩码
的形式唯一标识一个网段,如2001::1/64
IPv6接口标识生成方式
一个IPV6地址可以分为网络前缀【网络位】和接口标识【主机位】两部分,一般来说,约定前64bit为网络前缀,后64bit为接口标识。但具体要看管理员怎么划分(网络前缀由地址管理机构分配,接口标识由管理员自主划分)
IPv6地址接口标识可以使用三种方式生成:
- 手工配置:直接手工配置一条接口标识
- 系统自动生成:系统根据随机数算法自动生成一个接口标识(Windows XP之后的Windows系统就是用的这种方式)
- EUI-64规范生成:网络三层设备使用这种方式
EUI-64生成过程:
首先,在MAC地址中间插入16bit的FFFE
,然后将第7bit取反,即可得到一个EUI-64规范生成的接口标识
第7bit取反有两种方案:
- 华为:不管是0或者1,直接取反
- 思科:如果是0则变成1,如果是1则不变
这是因为在单播MAC中,第7bit是U/L位,表示地址唯一性,如果U/L=0,则该MAC为全局管理地址,由运营商分配;否则为本地管理地址,由网络管理员按需手动配置。
而EUI-64正好相反,第7bit为0表示本地管理地址,为1才是全局管理地址。
这就是需要取反的原因,无论思科还是华科,其目的都是让得到的EUI-64一定是全局管理地址
IPv6地址空间划分
IPv4将地址划分为网络位和主机位两部分,IPv6则将地址划分为网络前缀和接口标识。
网络前缀作用相当于IPv4的网络号,接口标识的作用相当于IPv4主机号
同IPv4一样,IPv6网络前缀和接口标识的长度由掩码决定
现阶段,IPv6常用的网络前缀如下:
IPv6单播地址
IPv6单播地址目前定义了5种前缀
未指定地址:::/128
- 接口没有IPv6地址时即为
::/128
,相当于IPv4的0.0.0.0
- 在动态获取IP地址或重复地址检测时作为报文源IP
- 在缺省路由中作为目的IP
不可配置,只能在路由中使用
环回地址:::1/128
- 作用和用法都和IPv4中
127.0.0.1
相同
不可配置,需要时直接用
全球单播地址:2000::/3
-3FFF::/3
全球单播地址相当于IPv4的公网IP地址,允许路由前缀聚合
**全球单播地址前导为001
**,所以范围是从0010 0000 0000 0000 ....
到0011 1111 1111 1111 ....
即2000::/3
到3FFF::/3
。并非只有2001::/3
在网络标识和接口前缀的基础上,全球单播地址再次被分为三部分:
前导001+Global rouing prefix
(全球路由前缀)构成网络前缀
Subnet ID
(子网ID)+Interface ID
(接口ID)构成接口标识【简单说,就是IPv4的网络号、子网号、主机号。多了一个子网划分】
001 + Global rouing prefix
:全球路由前缀,由提供商分发,一般至少48bit(前导001也是全球路由前缀的一部分)Subnet
:子网ID,作用同IPv4子网号,一般预留16bit。IPv6子网划分时建议以4bit为一跳做子网划分,这样正好对应16进制的一个数,便于管理
Interface ID
:接口标识,一般64bit,再细分由用户自己决定
配置命令:
ipv6 # 全局使能ipv6
interface GigabitEthernet0/0/0
ipv6 enable # 接口使能ipv6
ipv6 address 2001::1/64 # 配置全球单播地址
ipv6 address 2002::/64 eui-64 # 通过EUI-64生成指定前缀的全球单播地址
链路本地地址:FE80::/10
-FEBF::/10
IPv6特意划分链路本地地址给同一链路的节点之间使用
链路本地地址本地有效,并且不能用于跨网段路由,但一般作为IPv6路由表下一跳
- 除非直连网段通信,否则链路本地地址不作为目的地址使用
- 下一跳可以是全球单播地址,也可以是链路本地地址,但除了手动配置和组播路由,路由协议默认使用链路本地地址作为路由下一跳
前导比特1111111010
,所以首段范围是FE80::/10
到FEBF::/10
链路本地地址同样将地址空间划分为三部分
- 接口标识:链路本地地址的接口标识一般遵循EUI-64或软件自动生成,长度固定64bit
- 网络前缀:链路本地地址以前导bit为网络前缀(所以范围虽然到FFBF,但最好还是使用FE80),中间空余部分使用0填充
IPv4地址规划有很大的问题,其中个人认为最大的问题是:网络中每个设备每个三层接口都需要一个IPv4地址
网络通信目的是端到端的通信,即只需要将数据发给对端主机就可以了,中间经过什么路由器发送方和接收方都不在乎。所以除了网络维护人员,几乎没有人会和中间设备通信。但为了网络联通,IPv4又不得不给每个中间设备的每个接口都划分一个至少掩码30的IP地址。
也就是每个中间设备的每个接口都浪费四个IPv4地址,简直雪上加霜
而IPv6的链路本地地址,堪称点睛之笔
IPv6规定
FE80::/10
到FEBF::/10
为链路本地地址,这个地址本地有效,并且不能用于跨网段路由。这个规定让链路本地地址成为了类似MPLS标签的存在,也就是转发数据时只看下一跳对应的标签(链路本地地址)
由此,IPv6网络便得到了MPLS标签转发网络的一些优点,同时无论网络中有多少中间设备,IPv6都不用浪费哪怕一个公网地址,一段链路本地绰绰有余。除非某个设备接口数大于
2^10
当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址
华为设备比较特殊,由于华为设备不配置IP地址接口状态协议down,所以需要手动激活一下链接本地地址(自动配置和手动配置均可)
接口使能IPv6,因为没有配置IPv6地址,华为设备接口状态协议down
激活接口(接口视图配置): ipv6 address auto link-local # 自动配置ipv6链路本地地址
接口状态协议up,同时生成了一个链路本地地址(配置全球单播地址的接口自动生成链路本地地址)
很多老师对初学者的做法是给接口配置一个全球单播讲授,方便学生理解。我在学习的时候就产生了“IPv6必须配置全球单播”的误解,正如上面所说,IPv6链路本地地址的点睛之笔是杜绝了中间设备浪费IP地址。配全球单播激活接口,那不就和IPv4没区别了。所以正式配置一定是激活链路本地地址。
为了方便后期维护,链路本地地址最好采用手工配置的方式
配置命令:
ipv6 # 全局使能ipv6
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address FE81::1 link-local # 手动指定链路本地地址
ipv6 address auto link-local # 根据eui-64自动生成链路本地地址
唯一本地地址:FC00::/7
到FDFF::/7
唯一本地地址的作用类似于IPv4中的私网地址,任何组织机构都可以直接使用唯一本地地址。
唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。
IPv6的初衷是大家都使用全球单播通信,地址也肯定是足够的,但总有些网络不能对外开放,如军队、政府机要部门。使用全球单播意味着安全没有保障。
而使用唯一本地地址组建局域网便可以隔离外部网络,保障安全问题。需要通信时使用NATv6进行地址转换即可
地址空间划分:
网络前缀由Prefix
、L
、Global ID
、Subnet ID
组成,接口标识自行规划
Prefix
:前导bit,固定为1111 110
L
:值为1代表该地址为在本地网络范围内使用的地址;值为0被保留,用于以后扩展(所以一般我们看到的唯一本地地址都是FD00::/7
)Global ID
:全球唯一前缀;通过伪随机方式产生。(用于防止地址冲突)Subnet ID
:子网ID;划分子网使用。
配置命令:
ipv6
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address FD00::/64 eui-64 # 手动指定唯一本地地址
ipv6 address FD01::1/64 # 根据eui-64自动生成唯一本地地址
IPv6组播地址
IPv6组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组ID(Global ID)4个部分组成
前导比特为1111 1111
,所以范围时FF00::/8
到FFFF::/8
,但由于对字段存在特殊规定,并不会完全使用这些地址
IPv6组播地址大体可以分为普通组播地址和被请求节点组播地址
普通组播地址:
功能同IPv4组播
Flag
:用于标识是否为永久组地址;0000
表示永久组地址,0001
表示临时组地址Scope
:表示组播组的作用范围各范围代表的含义如下图所示:
Reserved
:保留字段,全为0Group ID
:组播组ID
同IPv4组播一样,IPv6组播只能当目的地址使用,不能配置给接口
目前IPv6定义的永久组目的有:
对于各协议,基本都是以FF02
开头,最后为该协议在IPv4中的组播地址最后一段
组播MAC生成方式:
同IPv4组播一样,IPv6也需要组播MAC,IPv6中组播MAC生成规则如下:
首先MAC前缀33:33
固定不变,然后将组播IP最后32bit组播组ID直接映射为组播MAC后32bit
被请求节点组播地址:
IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。
在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。
当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。
被请求节点组播地址同链接本地地址一样,只在一个链接中有效
被请求节点组播地址生成规则如图:
前104bit固定为FF02::1:FF
,后24bit是IPv6单播或者任播地址的拷贝
每个IPv6单播或任播地址都有与之对应的被请求节点组播地址,如果两个地址后24bit一致,则使用同一个被请求节点组播地址
IPv6任播地址
IPv6任播的本质是一种特殊的IPv6单播地址,不对标IPv4广播(IPv6以全网组播的方式实现广播)
任播地址设计用来在给多个主机或者节点提供相同服务时提供冗余功能和负载分担功能。
现在公司A需要给中国和美国提供对等的Web服务,域名
a.com
在IPv4的场景下,公司A位于中国的服务器有一个IP地址
1.1.1.1
,并通过DNS解析到a.com
。位于美国的服务器有另一个IP2.2.2.2
,并通过DNS解析到a.com
。此时中国的用户访问
a.com
实际是访问中国的服务器,美国的用户访问美国的服务器。但此时他们访问的IP地址是不同的,公司A每次多部署一个服务器,就需要一个IP地址,并且需要在当地做对应的DNS解析,非常麻烦。
IPv6任播的作用是,无论这个公司又多少服务器,都只需要配置一个全球单播地址,用户按就近原则去访问离自己最近的服务器,DNS也只需同样的配置
IPv6中没有为任播规定单独的地址空间,任播地址和单播地址使用相同的地址空间。
使用任播地址时,需要进行额外的配置
配置命令:
ipv6
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address 2001::1/64 anycast # 配置该全球单播地址为任播地址
ICMPv6协议
ICMPv6是IPv6网络架构的核心协议,不同于IPv4只能用于ping测试和服务端地址冲突检测。IPv6中ICMPv6在原有ICMPv4的功能上,扩展了地址解析、邻居发现与可达性检测、PMTU发现、无状态地址配置
ICMPv6在IPv6协议栈中协议号为58(ICMPv4在IPv4协议栈中协议号为1)
在IPv4中,当DHCP需要给Client分配一个IP地址时,会先使用ICMP协议ping该IP地址防止冲突(模拟器中做不出效果),即DHCP服务端通过ICMP做冲突检测,客户端通过arp做地址检测
IPv6统一使用ICMPv6做重复地址检测
ICMPv6报文格式:
ICMPv6报文格式如图所示,报文字段和ICMPv4没有区别,但含义不同
ICMPv6报文可以分为两大类:差错报文和信息报文
- 差错报文:Type字段第一bit为0(范围[0, 127]),用于报告IPv6数据包转发中出现的错误
- 信息报文:Type字段第一bit为1(范围[128, 255]),实现同一链路上的节点通信
ICMPv6差错报文
ICMPv6差错报文有四种
目的不可达报文:Type为1,当设备发现目的地址不可达时发送,并使用Code字段说明错误原因
时间超时错误报文:Type为3,TTL等于0时发送
参数错误报文:Type为4,报文有效性检查未通过时发送
第四种为 “数据包过大错误报文”,Type为2。在IPv6中比较特殊,用于完善IPv6的报文分片机制。也叫做PMTU检测
PMTU检测
PMTU即Path MTU
为了减少中间设备的压力,优化报文,IPv6规定只有源目两端设备可以进行报文的分片重组操作,不允许中间设备进行报文分片
在中间设备MTU值未知的情况下,源端主机直接以自己的MTU发送报文可能会导致中间设备丢弃报文,此时源端主机就需要重新以中间设备可接受的MTU发送报文,这样就造成了额外的流量开销
IPv6通过PMTU机制,在发送数据前试探发送一个数据包,并根据响应做后续处理:
- 不存在MTU小于源端的中间设备,源端收到ICMPv6响应报文,认为PMTU检测通过,开始发送数据报文
- 存在MTU小于源端的中间设备,源端收到ICMPv6数据包过大错误报文(Packet Too Big)。源端根据
Packet Too Big
报文中携带的MTU重新发送一个试探报文,直到收到ICMPv6响应
IPv6要求链路层所支持的最小MTU为1280,所以PMTU的值必须大于1280。建议用1500作为链路的PMTU值。
PMTU机制相关配置:
# 前提条件:网络互通
ospfv3 1 # 配置ospfv3
router-id 3.3.3.3
interface GigabitEthernet0/0/1
ipv6 mtu 1400 # 设置接口mtu1400
ospfv3 1 area 0.0.0.0
ospfv3 mtu-ignore # 关闭本接口ospfv3 MTU检查
OSPFv3和OSPFv2一样,在交互DD报文时要检查链路对端接口MTU值,链路两端MTU值不一致则无法建立邻接关系
在本实验中,为了正常建立OSPFv3邻接关系,有两种方法:
- 关闭接口上OSPFv3的mtu检查,命令:
ospfv3 mtu-ignore
- 将链路对端接口的MTU设置为和本端相等的值
IPV6 MTU值支持静态指定,在某些特殊情况下,为了保护网络设备的安全,避免受到超长报文的攻击时,可以手工配置到指定目的节点的PMTU,以控制设备到目的节点可转发报文的最大长度。
ipv6 pathmtu 2001::4 1400 # 指定发往2001::4的数据MTU为1400 (不写MTU值缺省1500)
指定后访问目的地址时直接发送MTU为指定值的报文
需要注意,静态指定MTU会导致PMTU机制失效。指定前需确定中间设备没有比之更小的MTU值
否则会导致报文丢弃
ICMPv6信息报文
目的ICMPv6信息报文主要有回应请求报文Echo Request
和回应应答报文Echo Reply
二者作用同ICMPv4相同
在IPv6中,还有以下信息报文:
NDP——邻居发现协议
IPv6中邻居发现协议NDP取代了IPv4中的ARP协议。NDP定义了使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现以及重定向等功能。
NDP底层是ICMPv6
通过NDP协议,IPv6实现了7大功能
所有功能均通过四种报文实现:NS NA RS RA
IPv6邻居发现
IPv6邻居发现包含地址解析和邻居状态跟踪、可达性检测三部分内容
地址解析
在主机需要和目标主机通信时,必须先获取对端的MAC地址用以完成数据链路层封装,IPv4中使用ARP协议,IPv6使用NDP协议的地址解析功能获取对端MAC地址
ARP协议报文直接封装在以太网报文中,使用广播发送给其他设备,所以ARP有很多的安全风险。
NDP使用NS和NA报文完成地址解析,NDP本身基于ICMPv6实现,属于三层协议。所以可以应用三层的安全策略并使用组播发送报文,比之ARP更加安全
- NS报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。
- NA报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。
地址解析过程解释:
- 如图,首先PC1以自己IPv6地址为源,以对端被请求节点组播地址为目的以组播的形式发送NS报文
- PC2收到该组播NS报文,发送单播NA报文给PC1,告知自己的MAC地址
邻居状态跟踪
启用IPv6的设备通信时会维护邻居关系并维护一张邻居表【可以理解为ARP缓存表】,每个邻居都有相应的状态
RFC2461中定义了5种邻居状态,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、探查(Probe)。
状态迁移如图所示:
初始时,邻居状态为Empty
(Empty不是IPv6邻居状态的一种,而是说不存在邻居关系)
假设有节点A、B,A、B之前从未通信
AB之间首先进行地址解析,假设由A先发送NS报文,A的邻居状态转为
Incomplete
(未完成)B回复NA报文告知A,A收到NA报文完成地址解析后,AB状态均转为
Reachable
(可达)在
Reachable
状态下,AB会开启一个计数器(缺省30s),如果在30s内没有发送数据或者收到非请求NA报文,且报文中携带的B的链路层地址和表项中不同。状态转为Stale
(陈旧)在可达状态下,发送数据不需要进行可达性检测
在
Stale
状态下,AB之间如果需要发送数据,会在发送数据的同时发送NS报文,并进入Delay
(延迟)状态收到回应的NA报文从Delay转为
Reachable
,否则经过一段固定时间后,邻居状态由Delay变为Probe(探查),继续发送NS请求(每隔1s发送一个,缺省发送3个)。NS请求均无回应,删除邻居关系,转为
Empty
(无邻居关系)
相关命令:
display ipv6 neighbors # 查看ipv6邻居状态表
无状态地址自动配置-SLAAC
IPv6地址配置分为手动配置和自动获取,手动配置由管理员手动规划。自动获取分为无状态地址自动配置SLAAC
和有状态地址自动配置DHCPv6
无状态地址自动配置通过NDP协议的RS
和RA
报文实现,主要包括路由器发现、无状态地址自动配置、重复地址检测(DAD机制)和前缀重编址
DAD重复地址检测
IPv6设备使能IPv6后,会自动在使能IPv6的接口生成链路本地地址(华为设备需要配置地址手动激活)
在IPv6中,获取的任何单播地址都不能直接使用,必须经过DAD重复地址检测后才能用于业务转发,在检测通过之前称为试验地址tentative地址
- 获取到试验地址的设备会从试验地址所在接口以未指定地址
::128
为源(试验地址未通过DAD检测时不能使用),以该试验地址对应的被请求节点组播地址为目的地址,发送组播NS请求报文 - 报文发送后可能会遇到三种情况:
- 链路中已经存在该地址并处于使用状态(通过DAD检测),使用该地址的设备会发送NA回应,该试验地址不生效,被标识为duplicated状态。
- 链路中已经存在该地址但接收方也是试验地址,NS报文接收方放弃使用这个地址作为接口地址,并且不会回应NA报文
- 链路中不存在该地址
路由器发现
接口IPv6地址通过DAD检测后,如果配置了无状态地址自动配置SLAAC
,则开始路由器发现机制
开启SLAAC的IPv6路由器会定时组播发送RA报文,目的组播地址
FF02::1
,该RA中Flags字段M位为0,并且携带前缀信息对于华为路由器,RA发送时间间隔是
200s-600s
之间的随机值终端开始SLAAC后,会直接向链路发送组播RS请求报文,目的地址
FF02::2
,开启SLAAC的路由器收到后,回应RA报文终端根据RA报文中携带的前缀和其他信息,生成接口的IPv6单播地址
终端对生成的地址进行DAD检测,检测完成后启动该地址
无状态地址自动配置命令:
# SLAAC服务端
ipv6 # 全局使能IPv6
interface GigabitEthernet0/0/0
ipv6 enable # 接口使能IPv6
ipv6 address 2012::1/64 # 配置一个前缀
ipv6 address FE80:12::2 link-local
undo ipv6 nd ra halt # 去使能ra报文抑制功能
-- 华为路由器缺省不允许发送ra报文,所以需要手动关闭ra抑制
# SLAAC客户端
-- ensp模拟器中的PC无法实验IPv6相关的操作,所以这里用一个路由器当作PC
ipv6 # 全局使能IPv6
interface GigabitEthernet0/0/0
ipv6 enable # 接口使能IPv6
ipv6 address FE80:12::1 link-local
ipv6 address auto global # 使能通过SLAAC获取IPv6地址
RA报文解析
在SLAAC中,存在RS和RA两种报文,RS同NS、NA一样没有需要特别探讨的必要。但RA比较特殊
SLAAC服务端可以配置发布的前缀和参数,客户端也可以根据收到的参数做出对应的动作,这些都是通过RA报文控制的
最主要的几个字段如上图红框所示
RA报文Flags字段
在RA报文的Flags字段中,前两个bit需要注意
M:Flags字段第一个bit,管理地址标识
- M-bit缺省为0,指示终端采用无状态配置(SLAAC)获取前缀并构造单播地址
- M-bit为1,指示终端使用DHCPv6获取地址和其他信息。当M=1时,终端可以忽略O-bit
ipv6 nd autoconfig managed-address-flag # 将M-bit置1
O:Flags字段第二个bit,其他有状态配置标识
- O-bit缺省为0,指示终端应从SLAAC获取IPv6地址外的其他配置信息
- O-bit为1,指示终端通过DHCPv6获取地址外的其他配置信息
ipv6 nd autoconfig other-flag # 将O-bit置1
总结:M-bit控制IPv6地址由谁发布,O-bit控制除地址以外的信息(DNS等)由谁发布
M-bit和O-bit配合,就可以灵活的使用DHCPv6和SLAAC组网
Router lifetime
:路由器存活时间,缺省1800,不为0时,收到RA的终端会将该发送RA的路由器当作网关,为0时不在当作网关
RA报文Option字段发布前缀
IPv6前缀由RA报文中的Option字段携带,其中需要注意以下参数:
Prefix Length
:前缀长度,表示IPv6地址的前缀长度
Prefix
:IPv6前缀
Option字段中的Flags参数:
Options字段中的Flags需要注意前三个bit(第三bit,R-bit位应该是定义的比较新,我没找到对其的解释)
L-bit:Flags中的第一bit,标识前缀是否时本地链路可达的,缺省为1,表示本地可达,0表示本地不可达。本地可达时,收到RA的终端会生成一条直连路由
A-bit:Flags中的第二bit,标识终端能否根据这个前缀生成地址,缺省为1,表示可以生成地址。为0时终端不会以此前缀生成地址
RA报文可以携带多个前缀,缺省情况下,终端收到几个前缀,就生成几个地址
控制地址的生成有两种方式,一是只发布特定前缀,二是通过控制A-bit位控制终端生成IPv6
前缀生成时间
在RA报文的Options字段中有两个生存时间:Valid lifetime
(有效时间)和Preferred lifetime
(首选时间)
在DAD地址冲突检测时有提到,设备获取IPv6地址后不会直接使用,而是需要进行DAD检测,在检测通过之间,地址为Tentative
(试探地址)
而IPv6地址总共有四种状态:Tentative
(试探)、Preferred
(首选)、Deprecated
(弃用)、Invaild
(无效)
状态之间关系如下:
而RA报文Option地段中Valid lifetime
和Preferred lifetime
的作用就是定义IPv6地址停留在Preferred
状态和Deprecated
状态的时间
Preferred lifetime
:首选时间,不为0时IPv6地址处于Preferred
状态。可以正常收发报文Valid lifetime
:有效时间,不为0时地址可以使用首选时间超时,有效时间未超时。IPv6地址进入
Deprecated
状态,地址仍然有效,现有的连接可以继续使用该地址,但不能建立新的连接。Valid lifetime
必须大于Prefreed lifetime
控制前缀发布
除了使用A-bit控制前缀生成外,还可以直接在路由器接口控制前缀发布
ipv6 nd ra prefix 2001:: 64 400000 200000
# 发布前缀2001:: 64 可用时间400000,首选时间200000
华为路由器缺省规矩:
没有手动发布前缀时,RA发布所有前缀
手动直接发布前缀时,RA只发布指定的前缀
思科是默认发所有,禁止什么前缀不发布什么前缀,具体规矩因厂商而异
控制前缀发布的命令同时可以控制L-bit和A-bit
[AR1-GigabitEthernet0/0/0]ipv6 nd ra prefix 2001::/64 400000 200000 ?
no-autoconfig Specify A-Flag On # 将A-bit置0
off-link Specify O-Flag On # 将L-bit置0
Please press ENTER to execute command
IPv6过渡技术
IPv4网络转变为IPv6网络势在必行,但这种转变并不是一朝一夕的事情,再有限的时间里,IPv4和IPv6必然处于共存的状态。
IPv6过渡技术目的就是为了解决IPv4向IPv6过渡期间产生的IPv6和IPv4共存问题,而目前IPv4仍然是绝大多数,IPv6处于”孤岛”状态,所以过渡技术主要实现使IPv6报文在IPv4网络中传输,实现IPv6网络之间的孤岛互连。
IPv6过滤技术有很多,现在主流的有:双栈、IPv6 over IPv4
隧道、6PE
隧道、NAT64
、ISATAP
隧道、IVI
等
根据实现方式的不同,可以将这些技术分为三大类:
IPv4/IPv6双栈:设备同时支持IPv6和IPv4,v4和v6共存
隧道技术:通过将IPv6数据封装进IPv4报文中使之在IPv4网络中传输,实现IPv6孤岛互联
IPv6 over IPv4
隧道、6PE
隧道属于此类转换技术:在IPv6出口将IPv6地址转换为IPv4地址,在对端IPv6入口将IPv4地址转回IPv6地址实现孤岛互联
NAT64
、IVI
属于此类
隧道技术:
IPv6 over IPv4
IPv6地址通过IPv4转发的隧道统称为IPv6 over IPv4
隧道,常用的有IPv6 over IPv4
手动隧道、6to4
隧道和ISATAP
隧道
6 over 4
隧道是通过在和IPv4连接的IPv6边界设备上开启双栈,给IPv6报文打上IPv4报文实现的
6 over 4
隧道源IPv4地址必须手动指定,而目的IPv4地址有手动指定和自动获取两种方式
手动隧道
手动指定目的IPv4的隧道称为手动隧道
以AR2为例:
ipv6 # 全局使能IPv6
ospfv3 1 # 使能ospfv3进程1
router-id 2.2.2.2
# 给接口配置IP地址
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address FE80:12::2 link-local
ospfv3 1 area 0.0.0.0
interface GigabitEthernet0/0/1
ip address 10.1.23.2 255.255.255.0
# 使能OSPFv2使IPv4网络互通
ospf 1
area 0.0.0.0
network 10.1.23.0 0.0.0.255
# 配置隧道口(双栈)
interface Tunnel0/0/0
ipv6 enable
ipv6 address FE80:24::2 link-local
ospfv3 1 area 0.0.0.0
tunnel-protocol ipv6-ipv4 # 隧道协议为ipv6-ipv4(IPv6 over IPv4手动隧道)
-- 也可以使用GRE隧道实现:tunnel-protocol gre
source GigabitEthernet0/0/1 # 隧道源接口为g0/0/1
-- 注意:这里指定源IPv4地址或者指定源接口可以建立隧道,一般使用环回口主机地址为源
destination 10.1.34.4 # 配置隧道目的地址
AR6和AR1在手动隧道中流程如下:
- 数据通过IPv6路由表转发来到AR4,在AR4查表发现下一跳是Tunnel接口
- 数据在Tunnel接口被打包到IPv4报文中,通过IPv4网络转发到AR2
- 在AR2的Tunnel接口解封装IPv4报文,IPv6数据通过AR2所在站点的IPv6网络发到AR1
自动隧道
自动获取目的IPv4的隧道称为自动隧道
数据转发时,设备从IPv6报文的目的IPv6地址/隧道接口下一跳
解析出目的IPv4地址
IPv6 over IPv4
自动隧道常见有三种:IPv4兼容IPv6隧道,6to4隧道,ISATAP隧道
自动隧道无法运行动态IGP路由协议,只能通过配置静态路由实现互通
自动隧道的优点是可以实现点到多点的隧道建立,手动隧道只能实现点到点的隧道建立
IPv4兼容IPv6隧道
所用地址为IPv4兼容IPv6地址的自动隧道就是IPv4兼容IPv6隧道
IPv4兼容IPv6地址:前96位全0,后32位为IPv4地址
在该隧道中,IPv4兼容IPv6地址前96位全0,后32位为隧道源接口的IPv4地址
基础配置和手动隧道一致,隧道接口配置如下:
interface Tunnel0/0/0
ipv6 enable
ipv6 address ::2.2.2.2/96
tunnel-protocol ipv6-ipv4 auto-tunnel # 使能IPv4兼容IPv6隧道
source LoopBack0 # 源接口为Loopback0
ipv6 route-static 2001::1 128 Tunnel 0/0/0 # 配置静态路由
-- ensp中兼容隧道可以建立,但隧道不发其他设备的IPv6数据
数据转发时,设备先通过下一跳的IPv6地址解析出下一跳IPv4,然后封装转发
6to4隧道:
6to4隧道和兼容隧道配置原理差不多,只不过6to4隧道的IPv6地址格式和兼容隧道不同
6to4隧道IPv6:2002:IPv4地址::接口标识/48
6to4隧道从报文的目的IPv6地址解析下一跳,所以使用6to4互通的两个站点,IPv6前缀必须和隧道前缀一致
如果不一致,则需要配置6to4中继
:其实就是多配置一条指向对端6to4地址的静态路由
interface Tunnel0/0/0
ipv6 enable
ipv6 address 2002:404:404::4/64 # 配置6to4地址
tunnel-protocol ipv6-ipv4 6to4 # 使能6to4隧道
source LoopBack0 # 指定源
ipv6 route-static 2002:: 16 Tunnel0/0/0 # 将前缀2002::的路由指向隧道接口
# 前缀不同时配置中继的方法
ipv6 route-static 2001::1 128 2002:202:202::2 # 手动指定去往2001::1的下一跳6to4地址
-- 指定后设备按静态路由配置的下一跳解析目的地址
6to4隧道,如果没有指定下一跳地址,则按IPv6报文目的地址解析目的IPv4地址。如果指定了下一跳地址,则按指定的下一跳解析目的IPv4地址
ISATAP隧道:
ISATAP
隧道是实现Host通过IPv4网络和IPv6互访或者两个HOST之间通过IPv6互访的技术
和其他隧道不同,ISATAP隧道的IPv4地址用于生成IPv6接口标识,网络前缀由开启ISATAP的设备通过SLAAC发布
生成的接口标识格式如下:
如果IPv4地址是全局唯一的,则u位为1,否则u位为0。g位是IEEE群体/个体标志。
ISATAP隧道工作原理如下:
- ISATAP路由器配置前缀信息并生成链路本地地址,开启SLAAC
- 终端通过一些软件开启ISATAP,生成一个链路本地地址并从ISATAP路由器获取网络前缀
- 终端和ISATAP路由器通信
当主机与其它IPv6主机进行通讯时,从隧道接口转发,将从报文的下一跳IPv6地址中取出IPv4地址作为IPv4封装的目的地址。
如果目的主机在本站点内,则下一跳就是目的主机本身,如果目的主机不在本站点内,则下一跳为ISATAP路由器的地址。
# 服务端配置
interface Tunnel0/0/0
ipv6 enable
ipv6 address 2003::/64 eui-64 # 配置前缀,指定接口生成方式为eui-64
undo ipv6 nd ra halt # 使能SLAAC
tunnel-protocol ipv6-ipv4 isatap # 使能isatap隧道
source LoopBack0 # 指定源接口
# Host端ensp无法模拟,只能拿路由器凑合凑合
interface Tunnel0/0/0
ipv6 enable
ipv6 address 2003::5EFE:303:303/64 # tunnel无法自动获取地址,只好手动配置
tunnel-protocol ipv6-ipv4 isatap
source LoopBack0
真实环境中Host端需要更加复杂的配置,但ensp中只能如此
6PE和6VPE
6PE和6VPE是和ipv6 over ipv4
不同的实现方式,不使用ipv4报文封装ipv6,而是使用MP-BGP封装隧道,MPLS转发的技术
配置的过程类似MPLS VPN
其中,直接使用MP-BGP转发的隧道称为6PE
和MPLS VPN一样,先写入VPN实例,再转发的称为6VPE
转换技术
转换技术有NAT64和IVI两种
NAT64和NAT原理并无太大区别,但在ipv4转ipv6时做了一些调整,转换得到的IPv6地址是:预定义的IPv6前缀+IPv4地址+随机后缀
IVI:无状态地址转换是通过运营商保留一段IPv4地址【称为IVI4地址】,将其唯一映射为IPv6地址【称为IVI6地址】