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

rac*_*aco 5 ipv6 linux-networking

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

我有一个 /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...
Run Code Online (Sandbox Code Playgroud)

对于我的 /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
Run Code Online (Sandbox Code Playgroud)

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

然后你必须修改wget的源代码。在 src/connect.c 的 connect_to_ip() 函数中,创建套接字后,添加以下内容:

setsockopt(sock, SOL_IP, IP_FREEBIND, &v, sizeof(v));
Run Code Online (Sandbox Code Playgroud)

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

然后你就可以成功地做到:

$ wget --bind-address=<any_ipv6_in_your_block> http://www.some-url.com
Run Code Online (Sandbox Code Playgroud)

Epa*_*hus 0

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

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

它将与 IPv4 和 IPv6 配合使用,并为您设置 IP 地址,因此您所需要做的就是为其提供 IP 范围、URL 以及最大连接数和并发连接数,然后运行命令。