IPv6我们可以理解为对IPv4进行了升级,地址数量的增加是升级最主要的原因。但它的本质依然是3层封装协议。
128位,228≈3.4028 × 1038(百亿亿亿亿级别)
序号 | IPv6的升级点: |
---|---|
1 | IPv6全球单播只存在公有IP,没有NAT(不代表没有私有IP |
2 | 可聚合性强(IANA组织会对全球的地址进行合理分配) |
3 | 多宿主:一个物理接口可以同时拥有多个不同或相同网段的IPv6地址,(这个点上可以配置不同的IP,这些IP可以工作在不同的协议,可以通过IP快速区分这些协议)。但不同接口不能在同一网段。 |
4 | 自动配置: ①DHCP v6 ②auto-config 路由器接口手工配置IPv6地址,然后路由器将自己地址的前缀(网络号)下放给PC,PC将自动使用EUI-64位来补充主机位。 对于主机网关和DNS解析,它们都会指向路由器的接口,此,时就需要告诉网关设备DNS服务器的位置,才可以做域名解析。 |
5 | 重编址:手动修改了网关的IP,通过auto-config,下方的PC自动就会修改。 |
6 | 热插拔:即插即用。 |
7 | 端到端的连接——不需要NAT |
8 | 简易的报头 ①没有广播机制,只有组播和单播 ②没有校验和(因为2层和4层均存在校验和) ③流标签,保留QOS。 |
9 | IPv4和IPv6共存 |
10 | 安全性和移动性没有明显提升。 |
黄颜色的部分表示没有变动的部分:Version、Source Address、Destination
只是更换了名称的蓝色部分 | 注解 |
---|---|
Type of Service => Traffic Class | 这部分用QOS使用,流量转发优先级,在iPv6里面叫做对应表。 |
Total Length => Payload Length 总长度=>有效负载 |
也是一个意思,整个包有多大。 |
Time to Live => Hop Limit 生成时间 => 跳数限制 |
最大都是255,一样的 |
Protocol => Next Header 协议号 => 下一个头部号 |
都是一样的 |
新增的部分 | 注解 |
---|---|
Flow Label 流标签 |
让未来Traffic Class有更多的地方,做更多的规则,现在只是保留 |
位数 | 名称 | 注解 |
---|---|---|
1-23 | 注册位 | IANA分配给各个国家或组织 |
24-32 | ISP位 | 由国家分配给各个ISP |
33-48 | 站点位 | ISP分配给各个企业 |
49-64 | 子网位 | 由企业网络管理员进行子网划分 |
65-128 | 主机位 | 用于分配给主机 |
注:但是一般企业不会分配给用户2^64个IP,会根据实际需要分配。
IPv6总共128位,使用冒分16进制标识,每16位标一段,共8段。
例如:2031:0000:130F:0000:0000:09C0:006A:130B
由于IPv6地址太长了,因此它有省略写法。
序号 | 省略写法: | 省略部分: |
---|---|---|
1 | 每一段地址前面的0可以省略 | 2031:0000:130F:0000:0000:09C0:006A:130B |
2 | 若一段全为0,可以省略成一个0 | 2031:0000:130F:0000:0000:09C0:006A:130B |
3 | 若连续两段以上全0,可以省略为 :: 但是:若存在两个部分均全0,只能将其中一个个部分省略为 :: |
2031:0000:130F:0000:0000:09C0:006A:130B 例如:2031:0:0:9C0 ::130B |
当使用IPv6协议携带端口号时,需要使用中括号来区分:
http://[2031:0:130F::9C0:6A:130B]:8080/index/html
IPv6分为3类,这里只谈单播和多播。
IPv6地址分类 | 方式 | 注解 |
---|---|---|
单播地址 | 一对一 | 只有单播地址能作为源地址,也可作为目标地址 |
多播地址 | 一对多 | 作为目标地址 |
任意播地址 | 一到最近 |
其实就是IPv6经过合理分配后的公网地址(需要申请),全球单播传递。
目前全球已规划地址为2000:: /3 ==>0010 0000 0000 0000 ::
它的范围也就是2000::到3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff这一段拿出来用
其中:
A、2001::/16这一段已经在当下的IPv6实验室使用
B、2002::/16是 6 to 4 Tunnel 地址这个主要用作IPv4和IPv6共存。
Link-local本地链路地址,其实就是自动私有地址,在IPv4下当通过DHCP获取IP地址失败的时候,便会生成Link-local地址,用于同一广播域可通讯即可。
版本 | Link-local地址段 |
---|---|
IPv4 | 169.254.0.0/16 |
IPv6 | FE80::/16 |
Ⅰ、Link-local的产生方式1:
路由器接口上配置 ipv6 enable 命令时,该接口将自动生成Link-local地址。
R1(config)#int s0/0
R1(config-if)#ipv6 enable
R1(config-if)#no shutdown
Ⅱ、Link-local产生方式2:
若在接口配置一个IPv6单播地址,必然自动生成Link-local地址。一个接口只能存在一个Link-local地址。
R2(config)#int s0/0
R2(config-if)#ipv6 add 2001::1/64
R2(config-if)#no shutdown
网络位FE80::/64,后64位使用EUI-64补充。
Ⅲ、EUI-64补充主机位:
Link-local 地址的网络位固定位FE80::/64,主机位使用本地以太网接口的MAC地址来生成Link-local地址主机位。对于没有MAC地址的串行链路,将循环借用本设备上以太网接口的MAC。
步骤 | 主机位生成方法步骤如下: |
---|---|
A | 在MAC的前24位和后24位之间强行插入FFFE |
B | U位转换:将合成后的地址,从左往右第7位自反,0为1,1为0。 |
Ⅳ、Link-local的作用:
A、常常作为动态路由协议生成的路由条目中的下一跳地址。因为IPv6存在多宿主的概念,该地址最稳定。
B、在同一广播域内可以通讯使用:由于本地多接口可能使用相同MAC转换,故在使用Link-local地址访问对端时,需要定义出接口。
这个就是私有地址,但是IPv6不叫私有地址,而是叫做站点地址。这个地址用于不在公网出现,而是在局域网出现所配置。
站点地址 | FFC0::/10 |
---|
未指定地址,就是全0,它的写法是 ::
Ⅰ、所有:代表缺省路由。
Ⅱ、没有:在DHCP时作为无效地址(没有地址)
IPv6里面的环回地址:::1,win7-win10都支持双栈的,电脑里面可以检测自己的环回。
之前我们说过2002::/16是 6 to 4 Tunnel 地址
这个主要用作IPv4和IPv6共存。
只要拥有一个IPv4的公网地址,就会拥有一段IPv6的兼容地址。
假设IPv4地址为:222.51.230.5,则:
十进制 | 222 | 51 | 230 | 5 |
---|---|---|---|---|
十六进制 | DE | 29 | 98 | 5 |
那么222.51.230.5的IPv4兼容性地址为2002:DE29:9805::/48
例:192.168.1.1 ==> 2002:c0a8:0101::/48
FF00::/8 所有组播地址
IPv6多播地址 | IPv4多播地址 | 传播范围 |
---|---|---|
FF02::1 | 224.0.0.1 | 全网所有路由器和PC |
FF02::2 | 224.0.0.2 | 全网所有路由器 |
FF02::9 | 224.0.0.9 | RIPNG |
在IPv6中,每一个IPv6的单播地址默认就在一个组内,组播的IP地址构成是FF02::1:FF + 24位(IPv6单播地址的后24位)
比如说刚才那个IP地址:2031:0000:130F:0000:0000:09C0:006A:130B
这个单播地址所在的组即就是:FF02::1:FF6A:130B
被请求节点组播地址:用于NTP协议,获取对端MAC地址(这个我一会儿再说)
我们拥有2120个组播IP,却只有248个MAC。
组播的MAC地址=33.33(16进制)+ 32位(IPv6组播地址的后32位)
例如之前的那个组播IP地址:
FF02::1:FF6A:130B
它的MAC地址就是:
33.33.FF.6A.13.0B
我们可以算一下,前24位中,33.33为固定值,FF为可变动的,因此总共有28个OUI,而一个OUI拥有224个MAC,那么:
组播的MAC数量 = 28 × 224 = 232 个
相比较IPv4下的半个OUI,数量还是很可以的。
我们知道组播IP总共拥有2120个,组播MAC为232个,因此:一个MAC对应288个IP
先回顾一下ICMPv4版:
ICMP协议在v4下,主要就是ping,除此之外还有ICMP重定向。它的功能比较弱学习难度也不大,它是一个跨层封装协议。协议号为1
在ICMPv6中,它的作用和功能将远远超过ICMPv4,ICMPv6集成了大量的子协议,通过包不同的类型号,区分IPv6的包,实现各种小协议。
这里我讲一下关于ICMPv6最重要的3个小协议:
PMTU、NDP、前缀报告
我们知道在IPv4中,如果包在传输的时候,路径上的MTU如果不同,会导致路由器拆包,却无法合包。拆包后,要为每个拆掉的部分加上新的报头,如果再遇到了MTU值小的路径,还需要继续拆包,这样就会增加路由器的负担。
在IPv6中,ICMPv6中的这个PMTU子协议,它会发出 ICMP error 包来获取整段路径上每段MTU值,之后再传递的时候按照最小MTU值进行传递。
这样就不会导致包在每次传输的时候由于MTU的限制,导致被拆,越拆越多的现象。
PMTU默认开启
我们先回顾一下ARP,ARP很重要,在以太网环境下,如果取消ARP,就获取不到目标MAC、获取不到下一跳MAC、获取不到网关MAC,就没有办法传输数据。
NTP邻居发现协议,NTP用于取代ARP协议。
PMTU、NTP都属于ICMP,它们的区分靠的是发包:PMTU发的是ICMP的错位包,容错包。而NTP发的是ICMP的包,它会带着不同的类型号135、136或是其它的。
由于IPv6没有广播,因此它要获取MAC就不能向IPv4一样了。
它的原理是这样的,假设PC1和PC2通讯模拟AARP请求:
第②步发出的NDP请求包,简称NS包,相当于ARP的请求。
第③步B的回应的包简称NA,相当于ARP应答。
ICMPv6中的NDP除了取代AARP外,其它的ARP协议也可被NDP取代,原理一致,这里不在讲解。
注:前缀通告仅在以太网环境种存在
这种自动配置功能是IPv6下独有的一种自动获取地址的方式。路由器周期(200s)向下发送IPv6的地址前缀(网络号)给设备,设备拿到前缀之后,在基于MAC EUI-64生成主机位。这样子下方的电脑可以在路由器没有配置DHCP池塘时获取到了IP地址。
上述功能这样实现,首先在R1连着需要获取IPv6地址的接口上配置一个IP地址,之后R1在开启IPv6的单播路由功能,那么所有的接口便都拥有了下放IPv6地址的能力。之后如果是PC就直接获取,对于路由器需要开启IPv6自动获取功能。
R1(config)#int s0/0
R1(config-if)#ipv6 address 2001:1/64
//R1开启IPv6的单播路由功能,
R1(config)#ipv6 unicast-routing
//R2开启IPv6地址自动获取,该功能开启后,设备上的auto-config被激活,同时可以收发IPv6路由协议信息,且可以为IPv6的流量进行路由。
R2(config-if)ipv6 address autoconfig
只要在路由器上开启了IPv6的单播路由功能,那么该路由器将向所有存在IPv6地址的以太网接口周期发送其地址的前缀。
注意:在配置动、静态IPv6路由协议时,均需要开启单播路由功能,开启后也将导致该路由器会向所有的以太网接口发送前缀,若管理员不想让该接口发送IPv6地址的前缀,那么可以在该接口进行以下配置:
R1(config)#int s0/1
//IPv6 ND 抑制RA,RA就是ICMP type 134
R1(config-if)#ipv6 nd suppress-ra
(1)Link-local:
R1(config)#int s0/0
R1(config-if)#ipv6 enable
R1(config-if)#no shutdown
手工或自动配置一个IPv6的AGUA,均会生成一个Link-local地址,但是无论配置多少个AGUA地址,也只能产生一个Link-local地址。
(2)配置接口IPv6的AGUA地址:
①手动配置IPv6的单播地址:
方法一:
R1(config)#int s0/0
//3表示有主机位
R1(config-if)#ipv6 address 2001::3/64
R1(config-if)#no shutdown
方法二:
下面是配置IPv6时给了个网络号,却没有给主机位。eui-64的意思就是用MAC生成(48位MAC中间强项插入fffe组成64位,之后重做往右第7位取反)。
R1(config)#int lo0
R1(config-if)#ipv6 address 2003::/64 eui-64
切记:IPv6协议存在多宿主特征:可以在一个接口上同时配置多个相同或不同网段的地址,但同一路由器上不同的接口不能配置相同的IP网段。
当同一网段配置在一台路由器的不同接口,那么当要到这个网段的时候怎么去?路由是没法到的。
②自动获取IPv6地址:
方法一:auto-config
使用auto-config,这个由于我上面 auto-config 提到过,这里不再累赘,直接Ctrl+C然后Ctrl+V,一笔带过。
R1(config)#int s0/0
R1(config-if)#ipv6 address 2001:1/64
//R1开启IPv6的单播路由功能,
R1(config)#ipv6 unicast-routing
//R2开启IPv6地址自动获取,该功能开启后,设备上的auto-config被激活,同时可以收发IPv6路由协议信息,且可以为IPv6的流量进行路由。
R2(config-if)ipv6 address autoconfig
R1(config)#int s0/1
//IPv6 ND 抑制RA,RA就是ICMP type 134
R1(config-if)#ipv6 nd suppress-ra
方法二:DHCPv6
有关DHCPv6这里不再讲解,详情可以参考这篇博客:DHCPv6基础。对于配置上案例:
服务端首要配置:
//开启IPv6单播路由功能
R1(config)#ipv6 multicast-routing
//在e0/0口上配置IPv6地址
R1(config)#int s0/0
R1(config-if)#ipv6 address 2001::7/64
R1(config-if)#no shutdown
服务端创建DHCPv6:
//创建地址池下发的IPv6的前缀2001:1234/64和前缀长度64,并命名这个规则是A
R1(config)#ipv6 local pool A 2001:1234::/64 64
//创建DHCPv6地址池塘,并取名为chitang
R1(config)#ipv6 dhcp pool chitang
//配置DHCPv6地址池,下发前缀使用之前定义的A前缀
R1(config-dhcpv6)#prefix-delegation pool A
//在接口e0/0口上,配置DHCPv6 Server端,然后管理chitang这个地址池。
R1(config-dhcpv6)#int s0/0
R1(config-if)#ipv6 dhcp server chitang
客户端配置:
R2(config)#ipv6 multicast-routing
//配置e0/0接口IPv6地址获取方式,采用自动方式配置。
R2(config)#int e0/0
R2(config-if)#ipv6 address autoconfig default
R2(config-if)#ipv6 enable
//配置该接口为DHCPv6中的客户端,承接DHCPv6服务器的chitang这个地址池
R2(config-if)#ipv6 dhcp client pd chitang
R2(config-if)#no shutdown
结果检查:
当DHCPv6服务器配置下发IPv6前缀,会自动产生一条到达自己分配网段的静态路由。
IPv6的ACL可以配置N张表,但一台设备上一个需求点只能调用一张表。
匹配规则:从上往下逐一匹配,若上条匹配就按上条执行,不再查看下条,开头会隐含。末尾隐含拒绝所有。但是IPv6的ACL只有扩展列表,写法只有命名写法。因此在使用扩展列表时,位置尽量靠近源,但不能在源上。
但是开头会隐含下面这两条ACL:
//ICMPv6中的NDP协议,NA => 136(相当于ARP请求)
R2(config-ipv6-acl)#permit icmp any any nd-na
//ICMPv6中的NDP协议,NS => 135(相当于ARP请求)
R2(config-ipv6-acl)#permit icmp any any nd-ns
末尾隐含的是:
R2(config-ipv6-acl)#deny ipv6 any any
为了更好的说明ACL,我这里使用下面这张图,它们的IP如图配置。
接下来我们开始写策略ACL:
(1)制定名叫A的ACL扩展列表:
R2(config)#ipv6 access-list A
(2)禁止 R1 telnet R2:
R2(config-ipv6-acl)#deny tcp host 1::1 host 2::2 eq 23
(3)拒绝一段地址到另一地址的所有通信
//在IPv6中不使用反掩码,直接使用掩码。
R2(config-ipv6-acl)#deny ipv6 1::/64 2::/64
(4)拒绝一个主机访问另一个主机:
R2(config-ipv6-acl)#deny ipv6 host 12::1 host 12::2
(5)最后,末尾加上允许所有:
R2(config-ipv6-acl)#permit ipv6 any any
(6)接下来进行调用:
R2(config)#int s0/0
R2(config-if)#ipv6 traffic-filter A in
IPv6的单播路由协议:在使用路由协议前需要开启IPv6的单播路由功能,否则该设备只能应答,或者请求,不具备中转的能力。
R2(config)#ipv6 unicast-routing
①普通静态路由:
在MA网路建议下一跳,点到点网络建议出接口写法。
//去往目标网络号,出接口或下一跳
R1(config)#ipv6 route 2::/64 serial 1/1
R1(config)#ipv6 route 2::/64 12::2
②浮动静态路由:
R1(config)#ipv6 route 3::/64 12::2 ?
<1-254> Administrative distance
<cr>
③接口汇总:
假设R1有两个环回,俩环回汇总之后的地址为1::63
R2(config)#ipv6 route 1::63 12::1
④空接口防环路由:
//在更新源路由器上,空接口指向汇总地址。
R1(config)#ipv6 route 2::/63 null 0
⑤缺省路由:
R2(config)#ipv6 route ::/0 12::1
注:带源ping 时,只能使用接口;或者使用扩展追踪。
R3#ping 2::2 source loopback 0
注:由于IPV6存在多宿主,使用接口为源时,默认使用第一地址来访问,建议扩展追踪。
R3#traceroute
Protocol [ip]: ipv6
Target IPv6 address: 2::2
Source address: 3::3
①RIPNG的启动:
RIPNG使用同RIPv2一样的算法,组播更新地址。组播更新地址FF02::9 端口为UDP521。
R1(config)#ipv6 unicast-routing
//启动进程RIP,进程名叫a,进程号仅具有本地意义。
R1(config)#ipv6 router rip a
//在IPv6下,需要到所有接口上进行配置。
R1(config)#int lo0
R1(config-if)#ipv6 rip a enable
注:在RIPNG中,起点也算一跳。因此原来16跳表示不可达,现在变成了17跳。
更新时间30s,失效时间180s,抑制时间120s,没有刷新计时器。
②接口汇总:
手工汇总:在更新源路由器上所有更新发出的接口上进行配置。
R1(config)#int s0/0
R1(config-if)#ipv6 rip a summary-address 1::/63
③缺省路由:
缺省路由:在边界路由器上所有同内网相连的接口上配置,使其向内网所有邻居发出一条缺省信息。
R1(config)#int s0/0
R1(config-if)#ipv6 rip a default-information ?
//only将发出缺省路由,同时它自身的一些明细路由不会转发
only Advertise only the default route
//选择originate 缺省和与R3相关的明细均发出。
originate Originate the default route
在原有OSPFv2的基础上,OSPFv3使用的IP为IPv6,它使用新的LSA来专门携带V6的信息,区域规则、SPF算法同IPv4下完全一致。
①启动OSPFv3:
R1(config)#ipv6 unicast-routing
//启动时需要配置进程号
R1(config)#ipv6 router ospf 1
//RID依然使用IPV4地址,规则同OSPF V2一致
R1(config-rtr)#router-id 1.1.1.1
//进接口宣告
R1(config)#int lo0
R1(config-if)#ipv6 ospf 1 area 0
②缺省路由配置:
缺省路由配置:在边界路由上配置。
R3(config)#ipv6 router ospf 1
R3(config-rtr)#default-information originate ?
//强制发出
always Always advertise default route
//修改起始度量
metric OSPF default metric
//修改度量类型,默认2
metric-type OSPF metric type for default routes
//关联route-map
route-map Route-map reference
<cr>
BGPv4+用家族模式专门传输IPv6的路由。BGPv4和BGPv4+在IPv6和IPv4操作之间是完全一样的。它只是升级版,增加了一个家族模式而已,所以它的配置、选路规则、属性都不变,BGPv4+都是兼容的。
要使用BGPv4+建立V6的邻居关系,首先需要建立V4的邻居关系,之后使用家族模式来配置IPv6的信息,原理为在原有BGPv4的协议中开发的扩展配置模式。
R2(config)#router bgp 2
R2(config-router)#bgp router-id 2.2.2.2
R2(config-router)#neighbor 3::3 remote-as 3
R2(config-router)#neighbor 3::3 update-source loopback 0
R2(config-router)#neighbor 3::3 ebgp-multihop
查看邻居关系的两条配置:
//查看IPv4下的BGP的邻居关系
R1# show ip bgp summary
//查看IPv6下的BGP邻居关系
R1# show bgp ipv6 summary
注意:关于IPv6 建邻以后所有配置 必须全部在家族模式中进行。这里的IPv4和IPv6下的配置大部分都是一样的,唯独就是家族模式中配置,这点非常重要。
//进入IPV6家族模式
R1(config-router)#address-family ipv6
//和该邻居建立IPV6的邻居关系
R1(config-router-af)#neighbor 3::3 activate
首先我们要知道的是:IPv4和IPv6可以共存,但是却没法兼容(不可能一个PC发一个使用了两种版本组合出来的包)。
这里讲的比较重要,基本上也讲出了,我们将如何过渡这个时代的。
当出现了小范围的IPv6地址时,两块覆盖IPv6的区域之间通信可以使用 tunnel,将 tunnel 配置为IPv6版本。通过IPv4的公网,进行访问。
R1(config)#interface tunnel 0
//该tunnel接口必须工作于V6环境
R1(config-if)#ipv6 address 10::1/64
R1(config-if)#tunnel source 12.1.1.1
R1(config-if)#tunnel destination 23.1.1.2
//必须修改模式为ipv6ip,在IPv6报头前加一个IPv4报头
R1(config-if)#tunnel mode ipv6ip
普通的 tunnel 需要基于所有IPv6网络配置一条隧道,且均需再配置一条静态路由,用来将流量引入隧道口。
假设上面是两个实验室的通信,那么当IPv6的实验室越来越多,它们的配置量、管理将会越来越麻烦。
6to4 tunnel 不需要任何的官方组织介入,可以自己配置。它仅需要配置一条隧道,一条静态即可访问所有的IPv6网络。
具体是:将边界路由器的公网IPv4地址转换为IPv4兼容性地址,然后将该地址应用到内网。接着再配置一条到兼容性地址的静态路由,通过隧道传递。传输数据时,一旦路由到达隧道口,隧道将根据目标IPv6地址计算对应的IPv4地址。
通俗的讲是这样:
它的优点是:
①不需要指定Tunnel的目标。
②仅需要配置一条静态路由即可。
上面说到的兼容性地址,是将IPv4地址转换为IPv6地址的第二段和第三段,然后转换后的IPv6地址以2002开头。注意,该地址在使用时,一般将其划分为64位。
接下来我们按照上图来说配置:
这里只以一端为例进行配置,另一端配置和这个一致,这里省略。
(1)首先为隧道接口配置转换后的IPv6地址,有4种方法,根据需求进行选择。
R1(config)#int tunnel 10
R1(config-if)#ipv6 address 2002:c01:101::1/64
R1(config-if)#exit
//使用一个6TO4地址
R1(config-if)#ipv6 address 2002:c01:101:1::1/64
//使用6to4地址
R1(config-if)#ipv6 address 2002:c01:101:2::/64 eui-64
//相当于不配地址
R1(config-if)#ipv6 enable
//借内网某个IPv6接口的地址
R1(config-if)#ipv6 unnumbered loopback 0
(2)定义源接口,并标记模式:
//定义IPV6源地址所在接口
R1(config-if)#tunnel source s1/1 (或者12.1.1.1)
//模式标记
R1(config-if)#tunnel mode ipv6ip 6to4
(3)配置静态路由:
R1(config)#ipv6 route 2002::/16 tunnel 10
到这里6 to 4 Tunnel 就配置好了。
当IPv6地址的区域越来越多时,此时国家或组织就会出来介入,合并接近的v6区域,之后其它v6区域再通过 6 to 4 Tunnel和大的v6区域进行通信。
那么之后怎么让用户加入V6 网络,这个就很重要,此时就需要靠双栈。
双栈:一台设备同时l连接IPv4和IPv6网络,若目标IP为v6地址使用v6的源IP,通过V6的路由表传递,V4同理。
配置就正常配置,一个接口配置一个IPv4地址,一个接口配置IPv6地址就OK了。