IPv6后续
前阵子全面启用了IPv6,最近又有些修改。
M、O tag
之前使用的是无状态DHCPv6,但还是能在DHCPv6分配地址中看到几条记录,那不就相当于是有状态的分配么。于是又看到了A、M、O几个tag的作用,也许我用的OpenWRT并不是最新版原因,UI上没有更精准的调整方法,但配置支持。我的无状态DHCPv6给配置了ra_flags
有managed-config
和other-config
文档上的解释是,managed-config
代表里地址信息也从RA中获取,而other-config
指的是DNS等信息,完全无状态的话,得全都自己配置需要的信息才能联网,退而求其次的无状态就是地址能自己生成就好了,其他信息还可以从DHCP获取。
由于我的UI上没有更细的关于RA的配置,于是我就直接改配置,ra_flags
只保留了other-config
AppleTV的home hub
最近买了个Apple TV 4K版,接入家庭网络后发现它竟然在自己组网。。。起初是从k8s集群中看到了所有节点都有一个fd42
开头的IPv6地址,以为是什么高级的k8s功能,搜了很久也没看到哪里说,最后用笨办法,守在一个k8s node上抓icmpv6
的包,终于看到是从AppleTV发出来的。。。网上也有人问怎么会从AppleTV发出RA来,大概是Thread networking,智能家具那套东西。据说老版的tvOS(ver<16.2?)能够手动设置关闭home hub功能,我已经升级到最新,看不到什么配置了。
这个问题目前无解,因为AppleTV目前是无线连接到了AP,AP有线连接到了主路由上,那很可能得从AP上做什么配置才能有效阻止发出的RA,可能需要另一个工具,例如ebtables,可能类似iptables,只不过是操作更低层的。
试了下ebtables,理论上应该是可行的吧,毕竟可以控制链路层的帧了,但实际没生效,可能和写的规则有关,也可能和网络结构有关,我目前的网络大致是:
- Apple tv无线连接到AP
- AP是H3C的NX54,开的是有线中继模式,连接到主交换机,主交换机连接主路由,主路由安装OpenWRT,并没有无线
这种结构的话,我猜apple tv发出的RA首先在AP和交换机中就开始传播了,再到达主路由,主路由有4个网口,AP所在的是main LAN,还有个实验性LAN和IoT LAN。目前只看到RA在main LAN中传播(我的网络知识不太够继续理解链路层及以下的原理了。。。)
看到有人说如果网络内有ULA就不会再主动发RA了,也不造是不是这样,于是我又设置上了OpenWRT的IPv6 ULA,不知道为啥从UI上没找到,在配置文件中加了
config globals 'globals'
option packet_steering '1'
option ula_prefix 'fd99:abcd:1234::/48'
然后UI中也出现了,神奇的设计。。。

这里需要注意的是,一开始我设置了一个64长度的前缀,我开启IPv6的两个LAN并没有都得到IPv6地址,因为我在这两个LAN中都设置了IPv6分配64长度,还给了分配提示,这样的设置前提是你能有小于64长度的前缀,例如联通给的是60长度就可以让我有自由分配的空间(16个),而ULA相当于IPv4中的内网,有/8的,/16的和/24的,对应就是10.x,172.16.x,192.168.xxx的前缀。既然是自己随便写(fd开头),那就可以很自由,不能是64,因为到了64就不能再划分了,所以一般都设置48,48的话就能划分2^(64-48)=65536个子网。。。我这一共就需要两三个子网,理论上62长度都够了。设置好合适的ULA前缀,就可以看到它同样被应用了分配提示(分配提示见下一段)。
观察了一会,似乎没有再收到RA带prefix info了,但还有带route info的发出来,不知道是不是因为要等之前分配出去的地址全失效了后就彻底没了,等再观察一段时间更新。
我去重启一下apple tv看看效果。似乎apple tv在启动时如果发现有内网的IPv6就不会再自己尝试分配了,但还是能看到route info,可能现在才是等之前分配的过期?
不管用,过了一会还是开始构造自己的IPv6网络了。。。继续考虑ebtables吧。
IPv6分配提示
因为联通给分发的IPv6前缀是60长度,也就是说可以有2^(64-60)=16个子网,而且前缀的最后一段是个0,例如xxxx:xxxx:xxxx:21e0::/60,这样在计算可用子网的时候很容易算出只有最后一位可以变化,而且范围是从0~F,一共16个,分配提示就是做这个事情的,可以在不同的LAN上构造不同的子网。
例如我有3个LAN,其中2个启用了IPv6,我给他们分别设置了分配提示是1和A,这样LAN 1中的IPv6子网就变成了xxxx:xxxx:xxxx:21e1::/64,而LAN10中的就是xxxx:xxxx:xxxx:21ea::/64。