ipv6 的路由器广告是广告链接本地地址

Gor*_*tch 5 freebsd routing ipv6

我有以下情况:我将 FreeBSD 9.1 机器配置为gif0接口上的心跳 SixXS 隧道的端点。到目前为止它有效,我可以通过 IPv6 ping6。

lagg0从连接到 LAN 的分配的 IPv6 子网中将静态 IPv6分配给另一个接口,该接口是聚合接口。现在我想使用rtadvd守护进程将此网络前缀通告给我的 LAN 。

这是它的/etc/rtadvd.conf文件:

lagg0:\
     :addr="xxxx:yyyy:zzzz:aaaa::":prefixlen#64:tc=ether:
Run Code Online (Sandbox Code Playgroud)

xxxx:yyyy:zzzz:aaaa::/64作为网络前缀。当我现在将客户端添加到网络时,它们会使用网络前缀并生成它们的 autoconf 和临时地址。这很好用。

然而,他们缺少的是正确的 IPv6 默认路由。在路由表中,IPv6 的默认路由是fe80::路由器的链路本地地址。

现在没有数据包被路由到互联网。如果我手动将默认路由添加到主机,它就可以工作。

我的问题

我认为路由器广告应该在客户端上配置正确的默认路由。我在这里错过了什么吗?为什么它会宣传其本地链接地址而不是正确的地址?

Chr*_*s S 3

链接本地地址应该可以正常工作,并且确实是rtadvd.

我使用的是 6to4,但它的配置基本相同。就我而言,我所做的就是:

ifconfig stf0 create
ifconfig stf0 inet6 2002:c0a8:1:ffff::1/16
ifconfig lan0 inet6 2002:c0a8:1::1/64
Run Code Online (Sandbox Code Playgroud)

这只是创建连接,您的隧道应该具有相同的目的。

route add -inet6 default 2002:c058:6301::
Run Code Online (Sandbox Code Playgroud)

此时ping6 ipv6.google.com可以通过我的路由器工作。

sysctl net.inet6.ip6.forwarding=1
Run Code Online (Sandbox Code Playgroud)

现在,如果我手动将客户端配置为在 DG IPv6 工作时使用路由器,即使使用链路本地地址,也会启用路由。但我们想要某种程度的自动配置......所以/etc/rtadvd.conf包含:

lan0:\
    :addr="2002:c0a8:1::":prefixlen=64:tc=ether:
Run Code Online (Sandbox Code Playgroud)

剩下的唯一一件事就是将配置添加到我的rc.conf文件中:

ipv6_gateway_enable="YES"               # Route IPv6 Traffic
rtadvd_enable="YES"                     # IPv6 Router Advertisement Daemon
rtadvd_interfaces="lan0"

cloned_interfaces="stf0"
ifconfig_stf0_ipv6="inet6 2002:c0a8:1:ffff::1/16"

ipv6_defaultrouter="2002:c058:6301::"   # 6to4 Default Router
Run Code Online (Sandbox Code Playgroud)

客户端确实有 fec0:: 范围的默认路由,但它工作得很好。Atcpdump显示客户端从其全局 IPv6 地址发送到 fec0 地址。

对于任何想要执行 6to4 操作的阅读本文的人,上述“内部”地址适用于 192.168.0.1,该地址无法在 Internet 上路由。您需要根据您的外部 IPv4 地址计算您自己的内部 IPv6 地址。