可能重复:
我可以将(大)块地址绑定到接口吗?
我有一个 /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 和最大连接数和并发连接数,然后运行命令。