一、DHCPv6无状态、DHCPv6有状态、常规无状态配置基础点
在 eNSP 模拟器中,DHCPv6 无状态配置(Stateless DHCPv6)、有状态配置(Stateful DHCPv6)以及常规无状态配置(Stateless Address Autoconfiguration,SLAAC)是 IPv6 地址分配的三种主要方式。它们在功能、配置和适用场景上存在显著差异。
特性 | 常规无状态配置(SLAAC) | DHCPv6 无状态配置 | DHCPv6 有状态配置 |
地址分配方式 | 客户端通过 RA 消息获取 IPv6 地址前缀,自行生成 IPv6 地址。 | 客户端通过 RA 消息获取 IPv6 地址前缀,自行生成 IPv6 地址,但通过 DHCPv6 获取其他参数(如 DNS 服务器)。 | 由 DHCPv6 服务器直接分配 IPv6 地址及其他参数(如 DNS 服务器)。 |
服务器维护信息 | 服务器不维护客户端的动态状态。 | 服务器不维护客户端的动态状态。 | 服务器维护客户端的动态状态,记录分配的地址和参数。 |
配置参数 | 只分配 IPv6 地址前缀,客户端自行生成地址。 | 分配 IPv6 地址前缀,同时分配 DNS 服务器地址、域名等其他参数。 | 分配 IPv6 地址、DNS 服务器地址、域名等。 |
适用场景 | 适用于简单的 IPv6 地址分配,无需额外配置。 | 适用于需要分配 IPv6 地址前缀的同时,还需要分配其他网络参数的场景。 | 适用于需要集中管理和控制 IPv6 地址分配的场景。 |
实验拓补图如下:
二、 DHCPv6无状态配置
这里,我采用的是ENSP模拟器中AR3260路由器(不知低版本能否支持就往高的选了)。拓补图中,R2作为服务端,R5作为客户端。详细过程如下:
1.配置服务端R2界面下,
[R2]dhcp en
[R2]dhcp enable
[R2]dhcpv6 pool pool2
[R2-dhcpv6-pool-pool2]dns-server 2002::2
[R2-dhcpv6-pool-pool2]dns-domain-name ko.com
[R2-dhcpv6-pool-pool2]quit
[R2]int g4/0/0
[R2-GigabitEthernet4/0/0]ipv6 enable
[R2-GigabitEthernet4/0/0]ipv6 address 2004::1/64
[R2-GigabitEthernet4/0/0]undo ipv6 nd ra halt
[R2-GigabitEthernet4/0/0]dhcpv6 server pool2
[R2-GigabitEthernet4/0/0]quit
2.配置客户端R5自动通过RA获取IP前缀,并通过DHCP获取其他信息。
[R5]ipv6
[R5]dhcp enable
[R5]int g0/0/0
[R5-GigabitEthernet0/0/0]ipv6 enable
[R5-GigabitEthernet0/0/0]ipv6 address auto global
[R5-GigabitEthernet0/0/0]ipv6 nd autoconfig other-flag
[R5-GigabitEthernet0/0/0]dhcpv6 client information-request
[R5-GigabitEthernet0/0/0]quit
3.验证配置成功
在服务端使用display ipv6 int g4/0/0命令查看接口全球单播地址是否配置成功,前缀是什么。
使用display ipv6 interface GigabitEthernet 0/0/0命令查看客户端是否成功获取到全球单播地址,且前缀与R2服务端相同。
再使用display dhcpv6 client命令查看是否有成功通过DHCP获取到其他信息。
从图片中,可看到客户端主机通过无状态获取全球单播地址前缀并生成唯一的全球单播地址,且还通过DHCP获取了服务端配置的DNS服务器与域名。
三、 DHCPv6有状态配置
客户端通过DHCP服务端直接获取IPv6地址和其它配置参数,无需自行生成。
方法一
1.配置DHCP服务端R2,
[R2]ipv6
[R2]dhcp enable
[R2]dhcpv6 pool pool1
[R2-dhcpv6-pool-pool1]address prefix 2002::2/64
[R2-dhcpv6-pool-pool1]quit
[R2]int g0/0/1
[R2-GigabitEthernet0/0/1]ipv6 enable
[R2-GigabitEthernet0/0/1]ipv6 address 2002::1 64
[R2-GigabitEthernet0/0/1]undo ipv6 nd ra halt
[R2-GigabitEthernet0/0/1]dhcpv6 server pool1
[R2-GigabitEthernet0/0/1]quit
2.配置客户端R3,
[R3]ipv6
[R3]dhcp enable
[R3]int g0/0/0
[R3-GigabitEthernet0/0/0]ipv6 enable
[R3-GigabitEthernet0/0/0]ipv6 address auto global default
[R3-GigabitEthernet0/0/0]ipv6 address auto dhcp
[R3-GigabitEthernet0/0/0]quit
3.验证配置成功
在服务端R2使用以下命令查看DHCP分配出的IP地址、DHCP地址池、应用DHCP服务的端口。
[R2]display dhcpv6 pool pool1 allocated address
[R2]display dhcpv6 pool pool1
[R2]display dhcpv6 server
可查看如下图内容:
这里我们先使用 ping ipv6 2002::1命令测试客户端R3与DHCP服务端R2的连通性。
到这里为止,这些步骤与方法二中的服务端步骤是相同的。不同在于下面的步骤:
在客户端R3使用命令display ipv6 interface GigabitEthernet 0/0/0查看端口是否正确获取到IP v6地址。
从上面的图片,我们可以看到R3有两个全局唯一的单播地址,分别是: 2002::2E0:FCFF:FE59:6C54/64、2002::2/128。可能有些人会疑惑R3为什么会有两个全局唯一单播地址,这两个IPv6地址都是DHCPv6分发的吗?
其实并不是的,2002::2E0:FCFF:FE59:6C54/64这个IPv6地址,是R3通过接收R2的RA(Router Advertisement)消息获取 IPv6 地址前缀,自行生成 的IPv6 地址,只有2002::2/128这个IPv6地址才是通过DHCPv6方式获取到的。那R3与R2之间的通信又是如何实现的呢?
我们在R3上使用 display ipv6 routing-table命令查看下客户端R3的路由条目。
从R3的路由表,我们不难看出R3与2002::/64的网段的R2是如何通信的。过程:当R3需要发送数据包2002::/64时,从路由表查找能对应的路由后将其发往2002::2E0:FCFF:FE59:6C54/64.所以,我们可以判断出R3与R2之间的通信也不是通过DHCPv6方式获取的全局单播地址来建立的。而是通过获取R2的RA消息中的网络前缀(即网络号)自行生成同网络前缀的全局单播地址,使用这个同网段的地址进行通信。
至于为什么会生成两个全局单播地址,那就是因为在R2少打了条命令(ipv6 nd autoconfig managed-address-flag),该命令可使主机客户端的全局单播地址只能通过DHCPv6方式获取的,从而禁止了客户端通过无状态方式获取地址。
方法二
1.配置服务端
[R2]ipv6
[R2]dhcp enable
[R2]dhcpv6 pool pool1
[R2-dhcpv6-pool-pool1]address prefix 2002::2/64
[R2-dhcpv6-pool-pool1]quit
[R2]int g0/0/1
[R2-GigabitEthernet0/0/1]ipv6 enable
[R2-GigabitEthernet0/0/1]ipv6 address 2002::1 64
[R2-GigabitEthernet0/0/1]undo ipv6 nd ra halt
[R2-GigabitEthernet0/0/1]dhcpv6 server pool1
[R2-GigabitEthernet0/0/1]ipv6 nd autoconfig managed-address-flag
[R2-GigabitEthernet0/0/1]quit
2.配置客户端
[R3]ipv6
[R3]dhcp enable
[R3]int g0/0/0
[R3-GigabitEthernet0/0/0]ipv6 enable
[R3-GigabitEthernet0/0/0]ipv6 address auto dhcp
[R3-GigabitEthernet0/0/0]ipv6 address auto global default
3.验证配置成功
在服务端R2使用以下命令查看DHCP分配出的IP地址、DHCP地址池、应用DHCP服务的端口。
[R2]display dhcpv6 pool pool1 allocated address
[R2]display dhcpv6 pool pool1
[R2]display dhcpv6 server
可查看如下图内容:
在客户端R3使用命令display ipv6 interface GigabitEthernet 0/0/0查看端口是否正确获取到IP v6地址。
从图片上可以看出客户端R3已正确获取到IP v6地址,地址为2002::2,子网掩码为128。
接着使用 ping ipv6 2002::1命令测试客户端R3与DHCP服务端R2的连通性。
这里可以看出R2与R3是可通信的。可能会有人奇怪为什么客户端R3获取的IPv6地址的子网掩码为128位,和DHCP服务端R2不在同个网段却可以ping通。其实,R3pingR2时并非是将2002::/64的数据包通过DHCP获取到的IPv6送往R2的。这里,我们使用 display ipv6 routing-table查看下客户端R3的路由条目。
这里,我们可以看到,在客户端R3上有条默认路由将不认识的路由送往FE80::2E0:FCFF:FE29:6119 地址,端口为GigabitEthernet0/0/0。由于R2与R3可互相ping通,故这地址很大可能为R2与R3相连端口的地址(即为GigabitEthernet 0/0/1)。在服务端R2上使用display ipv6 interface GigabitEthernet 0/0/1命令查看是否有该地址。
从图片上,可以看出服务端R2端口GigabitEthernet 0/0/1的本地链路为FE80::2E0:FCFF:FE29:6119。所以,R2与R3的通信是通过本地链路来建立的。至于为什么会这样,我也不是太懂,但我查找了下有个说法是:
在IPv6中,DHCPv6可以分配两种类型的地址:临时地址和永久地址。默认情况下,DHCPv6分配的是临时地址,这些地址通常具有128位的子网掩码,即使地址池的前缀长度是64位。
-
临时地址(Privacy Extensions):
-
IPv6支持隐私扩展,这是一种机制,用于生成临时地址以保护用户的隐私。这些临时地址通常具有128位的子网掩码,即使它们是从64位前缀的地址池中分配的。
-
这种机制可以防止通过IPv6地址追踪用户设备,因为临时地址会定期更换。
-
-
本地链路地址:
-
本地链路地址(如FE80::/10)用于同一链路上的设备之间的通信。这些地址是自动生成的,不需要通过DHCPv6分配。
-
设备可能会优先使用本地链路地址进行通信,因为这些地址是自动配置的,不需要额外的网络配置。
-
这种机制使得DHCP客户端与DHCPv6服务器之间的通信是通过本地链路地址实现的,应该是IPv6的隐私安全保护机制。
配置过程中常规错误及对应解决方法
在ensp模拟器中,R3通过有状态(DHCP)获取到IP v6地址,有可能出现以下异常情况:
(1)获取到的IP v6地址带有本地接口ID的后缀或只生成了无状态的全局单播地址,解决方法如下:
在DHCP服务器的设备接口上,输入:
undo ipv6 nd ra halt 关闭RA抑制;
ipv6 nd autoconfig managed-address-flag 使主机只能通过DHCPv6方式获取地址;
ipv6 nd autoconfig other-flag 使主机通过DHCP方式获取除地址外其它参数;
(2)获取到了IP v6地址,但无法通信DHCP服务器,解决方法如下:
在客户端需要获取IP v6地址的设备接口上,输入:
[R3-GigabitEthernet0/0/0]ipv6 address auto global default
(3)配置正确,但重启设备后接口就无法自动获取到IP v6地址(有可能是软件bug),解决方法:
将与DHCP服务器相连的端口重启就行了。具体如下:
shutdown 关闭该端口;
undo shutdown 取消关闭该端口,即启动该端口;
四、常规无状态配置
客户端通过 RA(Router Advertisement)消息获取 IPv6 地址前缀,自行生成 IPv6 地址,并不会生成其它配置参数(如DNS服务器等)。
1.配置服务端R2
[R2]ipv6
[R2]int g0/0/2
[R2-GigabitEthernet0/0/2]ipv6 enable
[R2-GigabitEthernet0/0/2]ipv6 address 2003::1/64
[R2-GigabitEthernet0/0/2]undo ipv6 nd ra halt
2.配置客户端R4
[R4]ipv6
[R4]int g0/0/0
[R4-GigabitEthernet0/0/0]ipv6 enable
[R4-GigabitEthernet0/0/0]ipv6 address auto global
3.验证配置成功
在服务端R2上,使用display ipv6 interface GigabitEthernet 0/0/2命令查看该端口的IPv6地址的前缀长度。结果如下:
在客户端R4上,使用 display ipv6 interface GigabitEthernet 0/0/0查看该端口是否有获取到与服务端R2相连的端口地址前缀长度(即为2003::)。
从上面的图片可以看出客户端成功获取到2003::的前缀长度,并通过加上自身端口ID自行生成了全球唯一单播地址。虽说不测,按道理来说也是能ping通的,但以防万一我们还是要使用ping ipv6 2003::1命令测试是否可与服务端R2通信。
从上图可以看出R4与R2可ping通,我们再使用 display ipv6 routing-table命令查看下R4的路由条目,看下是通过哪个地址通信的。
从图片中,我们可以看到当R4发往200::3/64网段的数据包时,R4会将数据包送到地址为2003::2E0:FCFF:FE53:2209的GigabitEthernet0/0/0 。所以,我们不难知道R4与R2之间是通过2003::/64网段通信的。与上面DHCPv6有状态方式有所不同,并没有通过本地链路地址来实现通信。
五、总结
-
常规无状态配置(SLAAC):简单快速,适用于仅需要分配 IPv6 地址的场景。
-
DHCPv6 无状态配置:适用于需要分配 IPv6 地址前缀的同时,还需要分配其他网络参数(如 DNS 服务器)的场景。
-
DHCPv6 有状态配置:适用于需要集中管理和控制 IPv6 地址分配的场景,适合复杂网络环境。
本篇文章有错误之处,还望指出批评指正
参考文章: 无状态自动配置 DHCPv6无状态配置 DHCPv6有状态配置_undo ipv6 nd ra halt-CSDN博客