为cURL指定IPv6子网地址


Assign specific IPv6 address of subnet to cURL

我已经通过/etc/network/interfaces分配了一个/64 IPv6子网给我的专用主机(发行版是Debian Squeeze)

iface eth0 inet6 static
  address 2a01:4f8:XXXX:YYYY::2
  netmask 64
  gateway fe80::1

现在,我想让cURL (PHP 5.3.22-1~dotdeb.0)使用该子网的特定IP地址,例如2a01:4f8:XXXX:YYYY::3,所以我的代码看起来像:

curl_setopt($this->_curl, CURLOPT_INTERFACE, '2a01:4f8:XXXX:YYYY::3');
curl_setopt($this->_curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);

运行curl_exec,得到bind failed with errno 99: Cannot assign requested address。为什么会发生这种情况?当在/etc/network/interfaces中定义每个IPv6地址为/128时,如:

iface eth0 inet6 static
  address 2a01:4f8:XXXX:YYYY::2
  netmask 128
  up ip -6 addr add 2a01:4f8:XXXX:YYYY::3/128 dev eth0 preferred_lft 0
  gateway fe80::1

则一切正常,cURL使用::3 IP。但是我的意图是使用我的子网中的很多ip(真的很多ip),所以这是不可行的。有人知道为什么cURL不能分配/64子网的子IP吗?

cURL不能绑定2a01:4f8:XXXX:YYYY::3,因为2a01:4f8:XXXX:YYYY::3不是分配给任何接口的IP本地地址。主机只能接收分配给它们的地址上的数据包,因此,您只能绑定这些地址。

正如您所描述的,如果您使用ip addr add在接口上添加2a01:4f8:XXXX:YYYY::3作为地址,它就可以工作。

我不知道有什么方法可以给本地系统分配一大组地址,而不必逐个添加它们。有一个技巧,但它只适用于某些操作系统(可能只适用于Linux),只适用于IPv4,只适用于环回接口。

您误解了网络掩码的含义。在这两个示例中,您都在接口上配置了一个地址。您指定的网络掩码是整个网络的掩码。

如果你想使用多个地址,你必须分别配置它们。