我正在尝试创建一个具有两个 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 都处于“开启”状态?
如果布线允许子网之间建立另一种连接,则硬件也可能导致这种情况。