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

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。

根据我的测试,为一个接口分配大量 IP 会使速度变慢(以每秒 HTTP 请求数计算)。显然,我无法为一个接口分配数十亿个 IP。有没有办法告诉 Linux 接受属于我的 /48 块的任何 IP,或者修改 wget 以便可以做到这一点?


2013年1月17日编辑: 我找到了解决方法。你的内核版本必须至少为 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 的源代码。在 src/connect.c 中,在函数 connect_to_ip() 内,在创建套接字后,添加以下内容:

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

答案1

假设你这样做是为了对你的 Web 服务器进行负载测试,你可以看看curl 加载器

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

它将与 IPv4 和 IPv6 一起工作并为您设置 IP 地址,因此您需要做的就是给它一个 IP 范围、一个 url 和最大连接数和并发连接数,然后运行命令。

相关内容