Linux和IPv6:如何绑定到任意的IPv6地址?

可能重复:
我可以将(大)地址块绑定到接口吗?

我有一个/ 48的IPv6块。 我想能够做到这一点:

$ wget --bind-address=<1st-ipv6> http://www.some-url.com $ wget --bind-address=<2nd-ipv6> http://www.some-url.com $ wget --bind-address=<3rd-ipv6> http://www.some-url.com etc... 

对于我的/ 48块中的任何2 ^ 80可用的IP。

根据我的testing,将大量的IP分配给一个接口会让事情变慢(就每秒的HTTP请求而言)。 显然,我不能将数十亿的IP分配给一个接口。 有没有办法告诉Linux接受任何属于我/ 48块的IP,或者修改wget以便完成?


2013年1月17日编辑:我发现如何做到这一点。 你的内核版本必须至less为3.3,因为从这个版本开始,这个补丁应用于: http : //lists.openwall.net/netdev/2011/11/08/8

那么你必须以root身份运行(如David Schwartz所说):

 # ip -6 route add local your_ipv6_block/48 dev lo 

您必须将此路由分配给lo接口,即使它不是到达Internet的传出接口。

那么你必须修改wget的来源。 在函数connect_to_ip()的src / connect.c中,在套接字被创build之后,添加如下内容:

 setsockopt(sock, SOL_IP, IP_FREEBIND, &v, sizeof(v)); 

然后编译wget(编译器可能会抱怨IP_FREEBIND没有被定义,如何解决这个超出了范围)并安装它。

那么你可以成功做到:

 $ wget --bind-address=<any_ipv6_in_your_block> http://www.some-url.com 

假设你这样做加载testing你的Web服务器,你可以看看curl加载器

这将向Web服务器发出请求,并为每个请求使用不同的客户端IP,还可以在模拟用户的同一连接上请求不同的页面,例如进入login页面并login然后注销等。

它将使用IPv4和IPv6,并为您设置IP地址,因此您只需为其提供一个IP范围,一个URL和最大连接数和并发连接数,然后运行该命令。