Возможный дубликат:
Можно ли привязать (большой) блок адресов к интерфейсу?
У меня есть блок /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...
для любого из 2^80 доступных IP-адресов в моем блоке /48.
Согласно моим тестам, назначение большого количества IP на интерфейс делает работу медленной (в смысле HTTP-запросов в секунду). И очевидно, что я не могу назначить миллиарды IP на один интерфейс. Есть ли способ сказать Linux принимать любой IP, принадлежащий моему блоку /48, или модифицировать wget, чтобы это можно было сделать?
Jan 17 2013 EDIT:. Я нашел, как это сделать. Ваша версия ядра должна быть не ниже 3.3, потому что с этой версии применяется этот патч: http://lists.openwall.net/netdev/2011/11/08/8
Затем вы должны запустить от имени root (как сказал Дэвид Шварц):
# ip -6 route add local your_ipv6_block/48 dev lo
Вы должны назначить этот маршрут на интерфейс lo, даже если он не будет исходящим интерфейсом для выхода в Интернет.
Затем вы должны изменить исходники 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
Предполагая, что вы делаете это для нагрузочного тестирования своего веб-сервера, вы можете взглянуть на загрузчик curl
. Он будет делать запросы к веб-серверу и использовать разные IP-адреса клиентов для каждого запрос, он также может запрашивать разные страницы в одном и том же соединении, имитируя пользователя, например переход на страницу входа и вход в систему, затем выход из системы и т. д.
Он будет работать с IPv4 и IPv6 и настраивает IP-адреса для вас, поэтому все, что вам нужно сделать, это указать диапазон IP-адресов, URL-адрес и максимальное количество подключений и одновременных подключений, а затем запустить команду.