我有一台 Ubuntu 16.04.2 服务器,带有 /64 块 IPv6。
如果我添加块,如下所示:
ip addr add 2001:41d0:xxx:yyy::/64 dev eth2
仅第一个有效:
$ curl -g http://[2001:41d0:xxx:yyy::]/
<!DOCTYPE html>...
$ curl -g http://[2001:41d0:xxx:yyy::1]/
curl: (7) Failed to connect to 2001:41d0:xxx:yyy::1 port 80: Connection timed out
如果我逐个添加其他内容,它们就会起作用:
ip addr add 2001:41d0:xxx:yyy::1/128 dev eth2
我做错了什么?
该块也位于 /etc/network/interfaces 中:
iface eth2 inet6 static
address 2001:41d0:xxx:yyy::
netmask 64
答案1
接口地址是一个单一地址,尽管您可以为一个接口分配一堆 IPv6 地址,因此您实际上是将网络2001:41d0:xxx:yyy::
中的地址添加2001:41d0:xxx:yyy::/64
到接口。
IPv6 实际上允许您使用网络中的每个地址作为主机地址,而不像 IPv4 那样网络地址不能用作主机地址,但是RFC 2373,IP 版本 6 寻址架构将路由器子网任播地址定义为网络的全零地址。
2.6.1 所需的任播地址
Subnet-Router 任播地址是预定义的。其格式如下:
| n bits | 128-n bits | +------------------------------------------------+----------------+ | subnet prefix | 00000000000000 | +------------------------------------------------+----------------+
任播地址中的“子网前缀”是标识特定链路的前缀。此任播地址在语法上与链路上接口标识符设置为零的单播地址相同。
发送到子网-路由器任播地址的数据包将被传送到子网上的一台路由器。所有路由器都必须支持其有接口的子网的子网-路由器任播地址。
答案2
@Ron_Maupin 给出了正确的答案,但我觉得一个更简单的答案会更有帮助:
/64 并不意味着整个地址块都分配给了接口。它为接口分配了一个地址,并告诉它 LAN 有 /64 地址块。这是几乎总是您需要什么样的以太网接口。
/128 是几乎从不以太网接口所需的地址。这些地址无法从 LAN 访问。