我们已经建立了一个小型 IPv6 测试网络。设置如下:
::/0
+----------+
| Firewall | Router to the public net
+----------+
| 2001:...::/106
| +----------+
+-------| SIT GW | sit Tunnel gatway to the some test users
| +----------+
|
+----------+
| Test Sys | Testsystem
+----------+
这个想法是从防火墙通告默认路由,并从 SIT 网关通告 SIT 子网的路由。radvd 的配置如下:
# Firewall
interface eth0
{
AdvSendAdvert on;
route ::/0
{
};
};
# SIT Gatway
interface eth0
{
AdvSendAdvert on;
route 2001:...::/106
{
};
};
我们已使用 tcpdump 捕获了 adv. 包,这些包看起来不错。我们看到了来自 fw 的默认路由和来自 SIT 网关的子网路由。
但是如果我们查看测试系统,会发现两个网关上都有两条默认路由。没有子网路由。路由当然不起作用。下面是我们得到的路由:
2001:.....::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 4294967295
fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 4294967295
default via fe80::baac:6fff:fe8e:XXXX dev eth0 proto kernel metric 1024 expires 0sec mtu 1500 advmss 1440 hoplimit 64
default via fe80::e415:aeff:fe12:XXXX dev eth0 proto kernel metric 1024 expires 0sec mtu 1500 advmss 1440 hoplimit 64
任何想法?
答案1
我发现问题了。
默认情况下,Linux 内核仅通过 icmpv6 中的路由器通告选项接受默认路由。
为了解决这个问题,必须设置正确的内核参数:
net.ipv6.conf.all.accept_ra_rt_info_max_plen = 128
来自内核文档:
accept_ra_rt_info_max_plen - INTEGER RA 中路由信息的最大前缀长度。
Route Information w/ prefix larger than or equal to this variable shall be ignored. Functional default: 0 if accept_ra_rtr_pref is enabled. -1 if accept_ra_rtr_pref is disabled.