情况:
我们的网络中有一个仅支持 ipv4 的路由器,每台计算机都连接到它(wifi 或电缆)。具有 ipv4 和 ipv6 的服务器也连接到此路由器。该服务器已配置了用于 6to4 隧道和 radvd 的隧道代理。网络中的客户端具有正确的前缀,可以通过 ipv6 相互 ping。但它们无法 ping 到互联网,直到它们首先 ping 服务器(具有隧道的服务器)。我在某处发现这是一个 icmp 问题,但我找不到解决方案。
问题是路由器仅限 ipv4 吗?
- 服务器和客户端运行 Linux
- 路由器运行 dd-wrt 但不支持 ipv6 :(
尝试 Ping:
standa@standa-laptop:~$ ping6 ipv6.google.com PING ipv6.google.com(2a00:1450:8007::69) 56 个数据字节 ^C --- ipv6.google.com ping 统计 --- 已发送 29 个数据包,已接收 0 个数据包,100% 数据包丢失,耗时 28223 毫秒 standa@standa-laptop:~$ ping6 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478 PING 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478(2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478) 56 个数据字节 来自 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478 的 64 字节:icmp_seq=1 ttl=64 时间=3.55 毫秒 来自 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478 的 64 字节:icmp_seq=2 ttl=64 时间=0.311 毫秒 来自 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478 的 64 字节:icmp_seq=3 ttl=64 时间=0.269 毫秒 来自 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478 的 64 字节:icmp_seq=4 ttl=64 时间=0.292 毫秒 ^C --- 2001:470:XXXX:XXXX:21c:c0ff:fe2b:6478 ping 统计 --- 发送 4 个数据包,接收 4 个数据包,0% 数据包丢失,时间 3000 毫秒 rtt 最小值/平均值/最大值/mdev = 0.269/1.107/3.559/1.415 毫秒 standa@standa-laptop:~$ ping6 ipv6.google.com PING ipv6.google.com(2a00:1450:8007::69) 56 个数据字节 来自 2a00:1450:8007::69 的 64 字节: icmp_seq=1 ttl=57 时间=20.7 毫秒 来自 2a00:1450:8007::69 的 64 字节: icmp_seq=2 ttl=57 时间=20.2 毫秒 来自 2a00:1450:8007::69 的 64 字节: icmp_seq=3 ttl=57 时间=23.4 毫秒 ^C --- ipv6.google.com ping 统计 --- 发送 3 个数据包,接收 3 个数据包,0% 数据包丢失,耗时 2001 毫秒 rtt 最小值/平均值/最大值/mdev = 20.267/21.479/23.413/1.392 毫秒
更新:Radvd 配置
接口 eth0 { AdvSendAdvert 开启; 最小RtrAdv间隔 3; 最大响应间隔 10; AdvLinkMTU 1280; 前缀 2001:470:1f0a:1511:1::/64 { AdvOnLink 开启; AdvAutonomous 开启; AdvRouterAddr 开启; }; };
更新 2:无连接
ip -6 邻居 fe80::21c:c0ff:fe2b:6478 dev wlan1 lladdr 00:1c:c0:2b:64:78 路由器可访问
有连接(ping 后)
fe80::21c:c0ff:fe2b:6478 dev wlan1 lladdr 00:1c:c0:2b:64:78 路由器陈旧 2001:470:1f0a:1511::1 dev wlan1 lladdr 00:1c:c0:2b:64:78 路由器可访问
邻居请求在 ping 时发生:
fe80::21c:c0ff:fe2b:6478 2001:470:1f0a:1511:21c:bfff:fe60:b389 ICMPv6 邻居请求 2001:470:1f0a:1511:21c:bfff:fe60:b389 fe80::21c:c0ff:fe2b:6478 ICMPv6 邻居通告
答案1
客户端的前缀是手动分配的吗?通常它们应该通过邻居发现协议自动找到路由器(在此期间路由器会发出广告并自动为其分配前缀),但听起来可能缺少这一步。
此外,路由器通告应将其链路层地址作为选项包含在路由器通告的 ICMP 标头中。如果缺少此字段,客户端将不知道如何将数据发送到路由器。听起来可能是这种情况。客户端不知道如何到达路由器,直到它发出邻居发现消息并从路由器收到邻居通告(ICMP 消息集中带有路由器标志)。
要在路由器通告中包含源链路层地址,请将以下内容添加到 radvd.conf 中
AdvSourceLLAddress on;
答案2
确保您的客户端使用服务器的 ipv6 地址作为其网关/路由器。正如 Jeff 指出的那样,这可能是自动分配的(检查您的 radvd 配置)或手动分配的,在这种情况下请检查客户端配置。
答案3
我认为您的 radvd.conf 没问题,尽管在 ping 之前和之后在客户端上进行比较也没什么坏处ip -6 addr; ip -6 route
。隧道盒或路由器上是否启用了某种连接跟踪?从隧道盒执行 ping6 是否足够?状态防火墙可以解释为什么数据包仅在成功 ping 后才返回。