将子网的特定IPv6地址分配给cURL

时间:2013-03-07 10:45:20

标签: php curl ip-address ipv6 subnet

我通过/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地址,p.e。 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?

2 个答案:

答案 0 :(得分:4)

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

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

我不知道如何将一大组地址分配给本地系统,而无需逐个添加。有一个技巧,但它只适用于某些操作系统(可能只有Linux),仅适用于IPv4,仅适用于环回接口。

答案 1 :(得分:1)

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

如果要使用多个地址,则必须单独配置每个地址。​​