我在 Ubuntu 12.04 上遇到了 ipv6 的一个奇怪问题。
有两台主机直接连接到互联网。两台主机都分配了一个 /64 网络。它们各自正确配置了一个 /128 端点,并且一个可以 ping 通另一个,反之亦然。我的计划是将我分配的 ipv6/64 的 /112 子网终止到接口,以便在 apache2 vhosts 中有足够的地址供使用。但这不是重点。
主持人A:
$ ifconfig
eth0 Link encap:Ethernet HWaddr (...)
inet6 addr: fe80::5246:5dff:(...)/64 Scope:Link
inet6 addr: 2a01:xxx:xxx:000A::2/64 Scope:Global
$ route -A inet6
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2a01:xxx:xx:000A::/64 :: U 256 0 0 eth0
fe80::/64 :: U 256 0 0 eth0
::/0 fe80::1 UG 1024 0 0 eth0
::/0 :: !n -1 1 5689 lo
::1/128 :: Un 0 1 18 lo
2a01:xxx:xx:000A::2/128 :: Un 0 1 202 lo
2a01:xxx:xx:000A::/112 :: U 1024 0 0 lo
fe80::5246:5dff:fea1:977c/128 :: Un 0 1 86 lo
ff00::/8 :: U 256 0 0 eth0
::/0 :: !n -1 1 5689 lo
主机 B 可以正确 ping 6 2a01:xxx:xx:000A::[0001-FFFF],并且工作正常。但在主机 A 上,我无法 ping 我自己地址。如果我尝试 ping 6 2a01:xxx:xxx:000A::n,我会得到以下结果:
$ ping6 2a01:xxx:xxx:000A::3
PING (...) 56 data bytes
ping: sendmsg: Invalid argument
ping: sendmsg: Invalid argument
ping: sendmsg: Invalid argument
我怀疑是路由表的问题,但是我已经研究了很长时间了,甚至使用谷歌也无法让它工作。
有什么想法吗?谢谢。
答案1
您已在 lo 上配置了 2a01:xxx:xx:000a::/112。最具体的前缀获胜*,因此您尝试在 lo 接口上 ping 不存在的 IP 地址 (::3)。您应该在 eth0 上配置所需的所有地址,并从 lo 中删除 /112 路由和 /128。
*) 工作原理:通过查找“最具体”的路由来做出路由决策。这意味着具有最长前缀掩码的路由。对于您的情况:
2a01:xxx:xxx:000A::3
该地址包含在以下网络中:
::/0 fe80::1 UG 1024 0 0 eth0
2a01:xxx:xx:000A::/64 :: U 256 0 0 eth0
2a01:xxx:xx:000A::/112 :: U 1024 0 0 lo
最具体的是掩码为 /112 的网络,因此数据包将被路由到该网络。由于这是您的 lo 接口(并且您没有在那里配置 IP),因此 ping 失败。