无状态 + 有状态模式
无状态 + 有状态模式
网络需求
FortiGate 作为 DHCPv6 服务器,FortiGate 或 PC 为客户端,客户端从 FortiGate 的 RA 报文中自动配置 IPv6 地址,并使用 DHCPv6 从 FortiGate 获取 DNS 服务器地址。
网络拓扑

FW1 和 FW2(或 PC)直连,FW1 作为 DHCPv6 服务器,FW2(或 PC)为客户端,FW2(或 PC)从 FW1 的 RA 报文中自动配置 IPv6 地址,并使用 DHCPv6 从 FW1 获取 DNS 服务器地址。
配置步骤
FW1 上配置 IPv6 地址 2100
/64,开启“DHCPv6 服务器”,配置 DNS 服务器,不开启“状态服务器”。 
config system interface edit "port2" config ipv6 set ip6-address 2100::1/64 set ip6-allowaccess ping https ssh http set ip6-send-adv enable //开启RA set ip6-other-flag enable //开启O Flag set ip6-manage-flag disable //关闭M Flag config ip6-prefix-list edit 2100::/64 set autonomous-flag enable //开启A Flag next end end next end config system dhcp6 server edit 1 set subnet 2100::/64 set interface "port2" set dns-server1 2100::64 next endFW2 上配置 port2 的 IPv6 配置为“手动”模式,开启“自动配置 IPv6 地址”。

FW2 想要从 FW1 获取静态地址后,再通过 DHCPv6 获取 DNS 服务器信息,需要开启 dhcp6-Information-request,该功能只能在 CLI 下开启,用于在 IPv6 自动配置后再通过 DHCPv6 获取 DNS 服务器等信息,最终配置如下。
config system interface edit "port2" config ipv6 set ip6-allowaccess ping https ssh http set dhcp6-information-request enable set autoconf enable end next end
结果验证
在 FW2 上查看自动配置的 IPv6 地址和 DNS 服务器地址,自动配置的 IPv6 地址根据前缀 + EUI 自动生成,DNS 通过 DHCPv6 获取,并自动添加了 IPv6 网关为 FW1 的 port2 的 IPv6 本地链路地址。
重要
- FortiGate 作为 IPv6 客户端时,获取 IPv6 地址后,默认路由的添加需要通过 IPv6 路由 kernel 表(get router info6 kernel)中看到。
- 客户端添加的默认路由的下一跳为服务器端接口的 IPv6 本地地址,而非手工配置的 IPv6 地址。

FW2 # config system interface FW2 (interface) # edit port2 FW2 (port2) # get | grep ip6 ip6-mode : static ip6-address : 2100::5200:ff:fe02:1/64 ip6-allowaccess : ping https ssh http ip6-reachable-time : 0 ip6-retrans-time : 0 ip6-hop-limit : 0 vrip6_link_local : :: ip6-dns-server-override: enable ip6-send-adv : disable FW2 (port2) # get | grep DNS Acquired DNS1 : 2100::64 Acquired DNS2 : :: Acquired DNS1 : 0.0.0.0 Acquired DNS2 : 0.0.0.0FW2 # get router info6 kernel | grep gwy vf=0 tbl=254 type=01(unicast) protocol=2(kernel) flag=00450000 prio=1024 gwy:fe80::5200:ff:fe01:1 dev=4(port2) pmtu=1500 FW1 # diagnose ipv6 address list | grep port2 dev=4 devname=port2 flag=P scope=0 prefix=64 addr=2100::1 preferred=4294967295 valid=4294967295 cstamp=1790 tstamp=1790 dev=4 devname=port2 flag=P scope=253 prefix=64 addr=fe80::5200:ff:fe01:1 preferred=4294967295 valid=4294967295 cstamp=1790 tstamp=1790使用 Windows PC 替换 FW2,来获取 IPv6 地址,可以看到 Windows 客户端获取到了 2100::/64 前缀的 IPv6 地址,并将 FW1 的 port2 的 IPv6 本地地址作为 IPv6 网关。


FW1 # diagnose ipv6 address list | grep port2 dev=4 devname=port2 flag=P scope=0 prefix=64 addr=2100::1 preferred=4294967295 valid=4294967295 cstamp=1790 tstamp=1790 dev=4 devname=port2 flag=P scope=253 prefix=64 addr=fe80::5200:ff:fe01:1 preferred=4294967295 valid=4294967295 cstamp=1790 tstamp=1790抓包查看整个流程。
FW2 配置自动配置后,发出 RS 报文,请求 IP 地址配置,目标 IP(ff02::2,链路本地范围的所有路由器)和 MAC 均为组播。

FW1 发送 RA 报文,通报自身 IPv6 prefix-list,可以看到前缀网段中标记了 A Flag,RA 中标记了 O Flag,该报文为单播。

由于开启了 DHCP6-Information-request,FW2 会继续通过 DHCPv6 请求 DNS 服务器等信息,该报文为组播,目标 IP 为 DHCPv6 保留的组播地址 ff02::1:2。

FW1 返回 DHCPv6 Reply 给 FW2,携带 DNS 服务器地址,该报文为单播。

补充说明
客户端获取到 Prefix 后,有两种方式生成 IPv6 地址:
Prefix+EUI-64(FortiGate 使用):自动将 48bit 的以太网 MAC 地址扩展成 64bit,再组合一个≤64 位的 IPv6 地址前缀,组成一个 IPv6 地址(Link-Local 地址也是通过此方法生成)。经过测试,如果 Prefix 不足 64 位,则用 0 补齐 Prefix 和 EUI-64 之间的内容(根据 EUI-64 计算器,您可自行查看上述步骤中 FW2 获取的 IPv6 地址是否符合 EUI64 标准)。
FW2 # diagnose netlink dstmac list port2 dev=port2 mac=50:00:00:02:00:01 policy6 rx_tcp_mss=0 tx_tcp_mss=0 ...
随机生成:RFC4941 引入了一种随机地址机制,他包含了用一组随机数字代替由 MAC 地址转换的接口 ID。该地址具有一定的生存周期,随着生存周期的结束,该地址会自动更换,该地址在用户对外发起连接的时候充当连接发起的 IPv6 地址,这一行为的目的在于保证主机在对外通信时候的匿名性。Windows、macOS 和 Linux 默认均为这种方式生成 IPv6,可以使用如下命令关闭随机地址。
Windows: netsh interface IPV6 set global randomizeidentifiers=disabled //禁用地址随机 netsh interface ipv6 set privacy state=disable //禁用临时地址 linux下修改sysctl.conf: net.ipv6.conf.all.use_tempaddr=0 net.ipv6.conf.eth0.use_tempaddr=0 net.ipv6.conf.default.use_tempaddr=0 或sysctl net.ipv6.conf.INTERFACE.use_tempaddr=0 macOS: sysctl net.inet6.ip6.use_tempaddr=0
RA 中包含多个 prefix 时,客户端是否会自动配置多个 IPv6?
服务器端(FW1)的 SLAAC 配置两个 prefix(RA 报文中包含两个 prefix)。

客户端(FW2)自动配置 IPv6 地址,可以看到两个 prefix 均生成了 IPv6 地址。
FW2 # diagnose ipv6 address list | grep port2 dev=4 devname=port2 flag= scope=0 prefix=64 addr=2200::5200:ff:fe02:1 preferred=604794 valid=2591994 cstamp=255528 tstamp=258728 dev=4 devname=port2 flag= scope=0 prefix=64 addr=2100::5200:ff:fe02:1 preferred=604794 valid=2591994 cstamp=139822 tstamp=258728 dev=4 devname=port2 flag=P scope=253 prefix=64 addr=fe80::5200:ff:fe02:1 preferred=4294967295 valid=4294967295 cstamp=2901 tstamp=2901PC 客户端也会生成 2 个 prefix 的 IPv6 地址。
