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

rab*_*dde 3 php curl ip-address ipv6 subnet

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

iface eth0 inet6 static
  address 2a01:4f8:XXXX:YYYY::2
  netmask 64
  gateway fe80::1
Run Code Online (Sandbox Code Playgroud)

现在,我想让 cURL (PHP 5.3.22-1~dotdeb.0) 使用该子网的一个特定 IP 地址 pe,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);
Run Code Online (Sandbox Code Playgroud)

跑步时curl_exec我得到bind failed with errno 99: Cannot assign requested address. 为什么会发生这种情况?在将每个 IPv6 地址定义为 /128 时/etc/network/interfaces,例如:

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
Run Code Online (Sandbox Code Playgroud)

那么一切都很好,cURL 使用::3IP。但是我的意图是使用我子网中的大量 IP(真的很多 IP),因此这是不切实际的。有谁知道为什么 cURL 不能分配 /64 子网的子 IP?

Cel*_*ada 5

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

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

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