底线在前:我无法让接收 RA 的 Linux 机器使用RFC4191“默认路由器偏好”值优先选择优先级较高的路由。相反,它首先学习到的默认路由就是它使用的路由,这对所有人都不利。我是不是错过了配置选项,或者内核升级,或者我只是永远注定失败?
长版本:
我有一个带有 HA 默认网关(VRRP/keepalived)的网络。上游 ISP 正在将 /48 路由到网关,然后我分割出 /64 块以分配给我基础设施中的机器(这样它们就可以为它们运行的容器分配全局可路由的地址)。然后,每台机器通过 radvd 将其容器 /64 通告给网络的其余部分(以AdvDefaultLifetime 0
显示它没有默认路由)。网关盒还有容器在运行,所以它们有自己的 /64 并进行宣传,但由于AdvDefaultLifetime 30
网关做有一个默认路线。
我希望能够在网关上进行状态防火墙,这样两个方向的所有流量都需要通过 HA 网关对中的同一个成员。没问题,我可以这样做——一个 keepalived 具有更高的优先级,我只需告诉该机器上的 radvd 也以更高的优先级通告其默认路由。这样,如果“主”机器掉线,所有东西都会路由到另一台机器,我们就没问题了。
但 Linux 似乎没有做任何与路由器首选项值相关的内容。我仔细研究了内核源代码,虽然它小心翼翼地保留了路由标志中的值,甚至rt6_score_route
看起来某物有了偏好,我在生产中观察到的行为(带有 3.13 内核的 Ubuntu 14.04)是,无论哪个具有更高的偏好,都会使用首先学到的默认路由。
除了对 keepalived 进行 haxxing 以更改 radvd 配置文件(一个带有AdvDefaultLifetime 30
,when MASTER
,另一个带有AdvDefaultLifetime 0
when BACKUP
)并在 keepalived 升级/降级时重新加载 radvd 之外,我还能做些什么来确保 RA 中优先级更高的路线得到优先考虑?
答案1
最近的 Linux 内核具有您要求的功能。如果您配置内核,请设置CONFIG_IPV6_ROUTER_PREF
,请参阅Networking support -> Networking options -> The IPv6 protocol -> Router Preference (RFC 4191) support
。如果您的发行版默认关闭此功能,则可能需要重新编译内核。