具有两个 IPv6 路由器的子网/如何获取正确的默认路由?

具有两个 IPv6 路由器的子网/如何获取正确的默认路由?

我正在尝试创建一个具有两个 IPv6 路由器的子网,分别称为 R1 和 R2。最初,我的子网只有 R1,通过 Hurricane Electric 隧道将其连接到 Internet。R1 正在(现在仍然)运行 radvd,子网上的所有主机都运行良好(现在仍然如此,所以我不会在这里发布 R1 的 radvd.conf)。最近,我将 R2 添加到子网中,并在其后面放置了另一个(新)子网。我在 R2 上运行了 radvd,并具有以下 radvd.conf 文件:

interface eth2 {
  AdvSendAdvert on;
  MinRtrAdvInterval 3;
  MaxRtrAdvInterval 10;
  prefix 2001:xxxx:xxxx:xxxx::/64 {
    AdvOnLink on;
    AdvAutonomous on;
  };
};
interface eth0 {
  AdvSendAdvert on;
  MinRtrAdvInterval 3;
  MaxRtrAdvInterval 10;
  prefix 2001:xxxx:xxxx:xxxx::/64 {
    AdvAutonomous off;
    AdvOnLink off;
  };
  route 2001:470:291c:0002::/64 {};
};

其中eth0连接原有子网,eth2连接新子网。

问题在于:来自 R2 的 RA 覆盖了原始子网上所有主机的默认路由(因此它们不再具有由 R1 通告的正确默认路由)。R2 的默认路由仍然正确指向 R1,因此子网上的所有内容都“正常工作”,因为外部 IPv6 节点是可访问的,但现在所有外部流量都错误地通过 R2 路由。

所以我的问题是:如何防止 R2 的 RA 设置我原始子网(R1 和 R2 都连接到的子网)上主机的默认路由?我需要 R1 的 RA 提供该默认路由!

提前谢谢了。

答案1

最明显的解决方案就是根本不在 eth0 上发送路由器广告:

interface eth0 {
    AdvSendAdvert off;
}

如果您出于其他原因想要发送路由器通告,则明确告诉接收者该路由器不是默认网关:

interface eth0 {
    AdvSendAdvert on;
    AdvDefaultLifetime 0;
}

来自radvd.conf手册:

生存期为 0 表示该路由器不是默认路由器,不应出现在默认路由器列表中。

答案2

两个以太网具有相同的“前缀 2001:xxxx:xxxx:xxxx::/64”?

  • 如果是这样,那看上去就非常错误了。
  • 如果不是,最好指定 2001:db8:yyyy:yyyy",这样看起来就不一样了
    • 2001:db8 是一个很好的例子。其他一些有效地址可以使用 2001

据我记忆,我使用 BSD rtadvd 的时间比使用 Linux 的 radvd 的时间要多 - 概念相同,只是实现方式略有不同。

但是,我提供以下建议:您可以启动 radvd 来仅监听一个接口,并指定一个配置文件吗?此外,您可以再次执行此操作,仅监听另一个接口,并指定另一个配置文件吗?如果可以,这可能会降低某些行为似乎泄漏到另一个接口的可能性。

您是否确实希望两个子网(在路由器 2 上)的 AdvSendAdvert 都处于“开启”状态?

如果布线允许子网之间建立另一种连接,则硬件也可能导致这种情况。

相关内容