RouterOS配置家庭公网IPv6以及对IPv6地址分配原理浅析

RouterOS配置家庭公网IPv6以及对IPv6地址分配原理浅析

LonelyMan 3982 2023-09-15

起因

本人一直喜欢尝鲜新东西,听说IPv6能让家里的每一台设备都能获取到公网IP,看见网上别人都能获取IPv6的公网地址,虽然自己已经有了IPv4公网IP,但也很想试试v6。

记得2021年初的时候武汉电信还没有下发IPv6的公网地址,年底的某一天重置光猫拨号密码重新设置桥接的时候发现光猫获取到了IPv6地址,一查发现就是公网的,于是按照教程成功获取到了v6前缀,PT也能连接到v6的tracker,皆大欢喜。

最近这几天在看腾讯云文档,发现页面打开巨慢,一番排查后发现有一个js资源的域名支持双栈,只要解析到v4就可以顺畅访问,解析到v6就连接不上,我就怀疑是我的v6配置出了问题,但是访问其他纯v6网站又很通畅,test-ipv6测试也是10分。交流群里询问了大佬们后才知道不是我家网络的问题,电信的甚至是整个中国的v6环境一直不太行,也有可能是CDN服务提供商的问题。

一番交流探讨后也学到了IPv6的一点皮毛,因此做个笔记来记录一下,顺便写个IPv6配置教程

家庭公网IPv6配置

以下内容为RouterOS环境,其他路由系统请参考其他文章

所有操作前提均为光猫已经更改为桥接模式

获取公网前缀

IPv6->DHCPv6 Client->+(添加)

image-20230915105829358

Interface选择PPPoE拨号的那个接口

Request选择prefix

Pool Name是公网地址池,随意填写即可,因为是获取公网,我取名public,大家随意,记住就行

Pool Prefix Length是获取的前缀的长度,一般是64

勾选Use Peer DNSRapid CommitAdd Default Route,单击OK即可获取到公网IPv6前缀

image-20230915110348271

点击Status查看是否成功获取,若没有可以去Interfaces里面将PPPoE关闭再打开重新拨号,如果仍未获取到则可能是ISP没有开通v6功能,只能等了

为WAN口获取IPv6

IPv6->Addresses->+(新增)

image-20230915111644613

新增一个IPv6地址

Address::1/64

From Pool选择刚刚创建的地址池,我这边选择public

Interface选择PPPoE拨号接口

下面的三个都不要勾选,特别是第二个Advertise,后面会说到原因

单击OK,查看地址有没有成功分配

image-20230915111753383

创建本地地址池

IPv6->Pool->Pools->+(新增)

image-20230915112715733

Name随便填写,我填写的local-dhcpv6方便理解

Prefix填写fd00::/64,类似于IPv4中的192.168.1.0/24

Prefix Length跟上面的/后面的数字保持一致,填写64

点击OK

配置LAN口IPv6

IPv6->Addresses->+(新增)

image-20230915113153986

新增一个IPv6地址

Address::1/64

From Pool选择刚刚创建的本地地址池,我这边选择local-dhcpv6

Interface选择LAN接口或者LAN网桥

下面的三个都不要勾选,特别是第二个Advertise,后面会说到原因

单击OK,查看地址有没有成功分配

image-20230915113324478

配置HDCPv6 Server

IPv6->DHCP Server->DHCP->+(新增)

image-20230915113807000

Name随意填写

Interface选择LAN接口或者LAN网桥

Address Pool6选择本地地址池,我这边选择local-dhcpv6

DHCP Options可以指定IPv6的DNS以及其他操作,DNS配置详见我之前发过的另一篇文章

下面的选择默认就行

配置NAT66

IPv6->Firewall->NAT->+(新增)

image-20230915112006546

image-20230915112144428

GeneralChain选择srcnat

AnctionAction选择masquerade

保存后重启需要IPv6上网的设备,应该就可以获取到fd00::xxxx:xxxx:xxxx:xxxx的地址了,访问

http://test-ipv6.com/ 查看IPv6是不是WAN口获取到的IP,如果是,恭喜你成功获取IPv6公网IP

浅析IPv6地址分配

生成“链路本地地址”,有2种方式

  • 手动配置
  • 自动配置

其中,“自动配置”根据算法,又分为

  • eui64:根据mac地址换算而来

  • stable_secret:跟随网络环境的变化而变化,处于固定网络环境时其值将固定

  • random:随机生成

在上面的“为WAN口获取IPv6”这一部分中可以看到自动生成了一个fe80::5/64的地址,这就是链路本地地址,Windows10的网卡也会自动生成链路本地地址

image-20230915114701122

虽然但是,这个地址似乎并没有什么卵用

Global Address的生成方式

生成“全球单播地址”(或者“唯一本地地址”),有2种方式

  • 手动配置

  • 自动配置

其中“自动配置”根据获取方式,又分为

  • 无状态(Stateless):根据路由通告报文RA(Router Advertisement)包含的prefix前缀信息自动配置IPv6地址,组成方式是Prefix + (EUI64 or 随机)。Stateless也可以称为SLAAC(Stateless address autoconfiguration)

  • 有状态(Stateful):通过DHCPv6方式获得IPv6地址

其中“有状态”又分为2种

  • 有状态DHCPv6(Stateful DHCPv6):IPv6地址、其他参数(如DNS)均通过DHCPv6获取

  • 无状态DHCPv6(Stateless DHCPv6):IPv6地址依然通过路由通告RA方式生成,其他参数(如DNS)通过DHCPv6获取

为了避免混淆,在此解释下有状态、无状态到底是什么意思:首先,请明确一点,有状态、无状态仅针对于IPv6地址分配方式,并不包含其他参数

  • 有状态:可控、可管理。在网络中存在一个IP地址管理者,它能够识别客户端,根据不同的客户端,分配对应的IPv6地址,客户端与服务端之间需要维护IP地址的租期及续约。目前实现这种效果的,就是DHCPv6协议,IP地址管理者就是DHCPv6 Server

  • 无状态:不可控、难管理。在网络中只有网关,没有IP地址管理者。因此无人去识别客户端,每个客户端根据网关发送的相同的RA报文内容,自行配置IPv6地址

RA报文中3个关键的Flag

  • Autonomous flag(简称A flag):表示是否配置无状态IP。在一个RA报文中,可存在多个prefix,比如2401::/642402::/642403::/64,每个prefix都可以独立配置A flag

    • 为on时(对应bit位为1):表示客户端应当在该prefix范围内自动生成IPv6地址(客户端通过DAD自行保证地址可用),并配置子网路由条目、网关
    • 为off时(对应bit位为0):表示客户端不应当在该prefix范围内自动生成IPv6地址,但是可以配置子网路由条目、网关
  • Managed flag(简称M flag):表示是否配置有状态IP。M flag是RA报文的全局参数,一个RA报文只有一个M flag

    • 为on时(对应bit位为1):表示在stateless流程结束后开始stateful流程,也就是告诉客户端可以通过DHCPv6来获得IPv6地址和其他参数(如DNS列表)
    • 为off时(对应bit位为0):表示不通过DHCPv6来获得IPv6地址。
  • Other flag(简称O flag):表示是否通过DHCPv6获得除IP以外的其他参数(如DNS列表)。O flag也是RA报文中的全局参数,一个RA报文只有一个O flag。注意:仅当M flag为off时,该参数才会被读取。

    • 为on时(对应bit位为1):当M flag为on,或者M flag为off且至少有一个A flag为on时,将通过DHCPv6获得其他参数
    • 为off时(对应bit位为0):当M flag为on时,依然将通过DHCPv6获得其他参数;当M flag也为off时,将不通过DHCPv6获得其他参数

这里就是上面教程中Advertise(也就是Router Advertisement(RA))的作用,在IPv6中,可以不需要创建DHCPv6 Server,只要网关打开了RA,客户端获取到v6前缀,就可以自己生成后面的地址,由于这个地址是客户端自己根据前缀生成的,所以不能直接管理。

在IPv4中,家里获得的公网IP是在路由器的WAN口上,如果需要家里的设备也能在公网访问,就需要通过NAT配置端口转发,这就只能让内网设备的某个端口对外提供服务,NAT本意是为了解决IPv4地址枯竭的问题,但这也带来了某种“好处”,就是家用只需要DDNS网关就行,例如群辉的IP是10.0.0.20,网页端口是5000,我只需要将公网的5000端口映射到10.0.0.20:5000即可,群辉也不是所有的端口都需要对外提供服务,这就方便了内网设备与外网隔离。

但是在IPv6中,由于IPv6的地址实在是太多了,网关获取到的是v6前缀而不是具体地址,这就意味着局域网设备的IPv6只要是该前缀,它就可以在公网直接访问,这也就是IPv6不需要NAT的原因。

以上面的教程举例,比如,我获取到的公网前缀为240e:36f:xxxx:xxxx::/64,WAN口的IPv6为240e:36f:xxxx:xxxx::1/64,如果我打开了WAN口IPv6的Advertise,本地所有设备都将会自动生成一个前缀为240e:36f:xxxx:xxxx::/64的地址,这就意味着局域网内的每一台设备都有一个无状态的公网IPv6,甚至连电饭锅都有(电饭锅联网的情况下)。

好处显而易见,所有设备都能公网访问,但是缺点也很明显:

  • 整个局域网都暴露在公网,要是某个设备的某个服务不想对公提供服务就需要单独设置防火墙策略,每个设备都配置防火墙显然不方便
  • 如果需要DDNS,就要在每个需要外网访问的设备上运行DDNS
  • 前缀是由ISP下发的,随时都会变动,万一内网设备间需要相互访问,前缀一变,配置就要改,太麻烦了

为了解决上述问题,就可以使用NAT66——V6版本的NAT

不使用无状态的v6地址,所有的设备的v6地址由DHCPv6 Server统一管理,内网设置只获取内网前缀为fd00::/64的IP,需要对外提供服务的端口手动创建映射,这样内网设备就跟公网隔离开了,防火墙配置就可以直接在网关管理,所有设备访问公网IP都是240e:36f:xxxx:xxxx::1/64,跟IPv4一样

结尾

说回起因说到的问题,虽然可以通过IPv6上网了,但由于各种复杂的原因,导致某些网站通过IPv6连接不上去,造成各种网页打不开、视频看不了的问题,所以最终的解决方案如下:

  • 关闭WAN口RA,禁止内网设备自动获取公网无状态IP
  • 关闭LAN口RA,禁止内网设备自动获取内网无状态IP
  • 关闭DHCPv6 Server,需要v6功能的设备手动指定v6地址,例如PT
  • 使用NAT66,手动暴露内网需要对外提供服务的端口,方便DDNS

这样就可以按需使用v6,也不会影响家里设备的上网体验了

上面的教程是开启了DHCPv6 Service的,局域网内每个设备都会获取到DHCPv6有状态地址,若同样碰到了我所遇到的连接异常问题,按照上述解决方案的第三条关闭DHCPv6 Server即可。

参考

为你的 IPv6 局域网配置 ULA 吧

IPv6系列-详解自动分配IPv6地址

鸣谢

@Nick Bot —— 感谢大佬的耐心解答