我有以下情况:我将一台 FreeBSD 9.1 机器配置为接口上心跳 SixXS 隧道的端点gif0
。到目前为止,它运行正常,我可以通过 IPv6 ping6。
我为另一个接口lagg0
(聚合接口)分配了静态 IPv6,该 IPv6 位于已分配的 IPv6 子网之外,并连接到 LAN。现在我想使用rtadvd
守护进程将此网络前缀通告到我的 LAN。
这是它的/etc/rtadvd.conf
文件:
lagg0:\
:addr="xxxx:yyyy:zzzz:aaaa::":prefixlen#64:tc=ether:
是xxxx:yyyy:zzzz:aaaa::/64
网络前缀。当我现在将客户端添加到网络时,它们会采用网络前缀并生成其自动配置和临时地址。效果很好。
然而他们缺少的是正确的 IPv6 默认路由。在路由表中,IPv6 的默认路由是fe80::
路由器的链路本地地址。
现在没有数据包被路由到互联网。如果我手动将默认路由添加到主机,它就可以正常工作。
我的问题
我认为路由器通告应该在客户端上配置正确的默认路由。我是不是漏掉了什么?为什么它会通告其链路本地地址而不是正确的地址?
答案1
链接本地地址应该可以正常工作,并且确实是使用的地址rtadvd
。
我使用的是 6to4,但配置基本相同。就我而言,我所做的就是:
ifconfig stf0 create
ifconfig stf0 inet6 2002:c0a8:1:ffff::1/16
ifconfig lan0 inet6 2002:c0a8:1::1/64
这只是创建连接,您的隧道应该具有相同的用途。
route add -inet6 default 2002:c058:6301::
此时可以ping6 ipv6.google.com
通过我的路由器进行操作。
sysctl net.inet6.ip6.forwarding=1
现在,即使使用链接本地地址,路由也已启用,如果我手动配置客户端以使用路由器作为其 DG IPv6 的工作方式。但我们希望实现某种程度的自动配置...因此/etc/rtadvd.conf
包含:
lan0:\
:addr="2002:c0a8:1::":prefixlen=64:tc=ether:
剩下唯一要做的事情就是将配置添加到我的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
客户端确实有 fec0:: 范围的默认路由,但它工作正常。Atcpdump
显示客户端从其全局 IPv6 地址发送到 fec0 地址。
对于任何想要进行 6to4 的读者来说,上述“内部”地址适用于 192.168.0.1,该地址在 Internet 上不可路由。您需要根据外部 IPv4 地址计算自己的内部 IPv6 地址。