我的网络上设置了两个“路由器”类型的设备。
一个是我的实际 IPv6 路由器 - Cisco 2621 ( fe80::xxxx:3e60
)。它是正确的默认路由器。
另一个是 DLINK DIR-615 ( fe80::xxxx:5760
)。它支持 IPv6,但目前仅配置为链路本地寻址,因为它仅用作 WAP。
两个设备都在发送 ICMPv6 RA 消息,因此都被添加到我的客户端的路由表中:
$ ip -f inet6 route | grep default
default via fe80::xxxx:3e60 dev wlan0 proto kernel metric 1024 expires 1741sec mtu 1500 advmss 1440 hoplimit 64
default via fe80::xxxx:5760 dev wlan0 proto kernel metric 1024 expires 1791sec mtu 1500 advmss 1440 hoplimit 64
问题在于,我的客户现在可以选择默认路由器。一个路由器可以顺利地发送数据包,另一个则不然。我可以删除错误的路由,但当下一个 RA 出现时,它会被重新添加。
fe80::xxxx:3e60
(正确的路由器)正在发送 RA,宣传 2001:xxxx:xxxx::/64 前缀(我的网络)
fe80::xxxx:5760
(错误的路由器)正在发送 RA,宣传 fe80::/64(本地链路)前缀
那么...这是谁的错?
fe80::xxxx:5760
当无法提供有效前缀时如何发送 RA?fe80::xxxx:5760
发送带有本地链路前缀的 RA?- 当我的客户端
fe80::xxxx:5760
发布链路本地前缀时,它是否会添加到路由表中? - 还有别的吗?
答案1
应该在 DLink 上禁用 radvd(路由器广告守护进程),至少在面向 Cisco 路由器的接口上禁用。
或者,您可以在 DLink 上设置到 Cisco 路由器的静态默认路由。这将使路由多一跳,但仍然有效,前提是 DLink 会将接口路由回 Cisco 路由器。
如果 WAN 端口是连接到 Cisco 路由器的端口,则 DLink 路由器不应在该链路上宣传路由。
编辑:您可能能够通过设置AdvRoutePreference high;
和/或AdvDefaultPreference high;
Cisco 路由器的 radvd 配置来影响路由。
编辑2:问题似乎是 DLink 路由器没有全局 IP 地址或路由。路由器的默认路由通常不会被发现,因此可能需要手动设置。
设置 IPv6 路由器首选项的步骤CISCO 文档是:
- 使能够
- 配置终端
- 接口类型编号
- ipv6 nd 路由器首选项 {高 | 中 | 低}
答案2
根据 RFC2461 §4.6.2:
路由器不应该发送链路本地前缀的前缀选项,并且主机应该忽略这样的前缀选项。
§6.2.1:
链路本地前缀不应包含在通告前缀的列表中。
因此,有人会认为,如果路由器没有提供有效前缀,它就不应该发送任何 RA。同样,如果主机看到没有有效前缀的 RA,它可能应该忽略它。
答案3
D-Link路由器有故障。
至少在 DIR-615 的硬件版本 C2 上(路由器上有一个标签,上面会标明您拥有的硬件版本),3.03WW 固件升级似乎会阻止它发送 RA。至少在本地链接模式下是这样(我还没有测试过其他选项)。
答案4
我认为这些缺陷包括来自 fe80:: 的前缀广告的奇怪之处、路由器在没有互联网连接时广告默认路由,以及固件和文档无法轻易弄清楚如何禁用默认路由。
但有一个很好的解决方法,至少对于我的带有固件 5.1 的 DIR-615 修订版 E3 来说是这样:
转到高级/IPv6 配置页面。
选择“无状态自动配置”。
将 LAN IPv6 前缀设置为您正在使用的前缀。
选择“启用自动配置”,选择“无状态”作为自动配置类型,并且(这是重要的部分)将“路由器通告有效期”设置为 0。
在 RA 中将路由器生存期设置为 0 意味着“这不是默认路由”。
我还没有找到禁用此路由器上的路由器广告的方法,但将其设置为我已经使用的前缀并将路由器生命周期设置为 0 对我来说已经足够了。实际上,您甚至不必将前缀设置为相同,但如果不这样做,您的接口和路由表将充斥着多余的地址和路由,而这些地址和路由几乎不会用于任何事情。