Я знаю, что инструмент ip позволяет привязать несколько адресов к интерфейсу (например, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/). Однако прямо сейчас я пытаюсь создать что-то поверх IPv6, и было бы действительно полезно иметь доступный целый блок адресов (скажем, / 64), чтобы программы могли выбирать любой адрес из диапазона и привязать к этому. Излишне говорить, что привязка каждого IP-адреса из этого диапазона к интерфейсу займет некоторое время.
Поддерживает ли Linux привязку целого блока адресов к интерфейсу?
Linux 2.6.37 и выше поддерживает это с помощью функции, называемой AnyIP. Например, если я бегу
ip route add local 2001:db8::/32 dev lo
на машине Ubuntu 11.04 он будет принимать соединения по любому адресу в сети 2001: db8 :: / 32.
Да, Linux поддерживает привязку блока сетевых адресов к сетевому интерфейсу ... но только на интерфейсе обратной связи. Итак, вы можете сделать это:
ip addr add 192.168.5.0/24 dev lo
А потом сделайте так:
$ nmap -sP -oG - 192.168.5.0/24
# Nmap 5.21 scan initiated Tue Dec 7 11:38:28 2010 as: nmap -sP -oG - 192.168.5.0/24
Host: 192.168.5.0 () Status: Up
Host: 192.168.5.1 () Status: Up
Host: 192.168.5.2 () Status: Up
[...]
Host: 192.168.5.254 () Status: Up
Host: 192.168.5.255 () Status: Up
# Nmap done at Tue Dec 7 11:38:46 2010 -- 256 IP addresses (256 hosts up) scanned in 0.11 seconds
При наличии соответствующих маршрутов это будет делать то, что вы хотите ... для адресов IPv4. Вы спрашивали об IPv6, а у меня нет опыта работы с IPv6, но есть большая вероятность, что он будет работать так же.
Я изначально читал об этом Вот (в конце статьи). Обратите внимание, что в этой статье также обсуждается, как явно назначить несколько адресов интерфейсу с помощью функций CentOS / Red Hat, о которых я раньше не знал.
Итак, я вижу здесь несколько вариантов:
использовать сценарий для привязки всех адресов к интерфейсу индивидуально
направьте блок, который вы хотите, на единственный адрес вашей машины, а затем попросите эту машину использовать интерфейс pcap для перехвата всего трафика для указанного блока (как если бы это был маршрутизатор) и обработать его.
Вы могли бы легко поиграть с правилами NAT, чтобы затем переписать блок IP-адресов, которые были направлены на одну машину, в один внутренний IP-адрес на этой машине ... но вы все равно получите один внутренний IP-адрес на каждый IP-адрес, который вы действительно хотите заплатить внимание к, которое возвращает вас к решению 1.
На вашем месте я бы просто написал небольшой сценарий в варианте 1. Или использовал сценарий из Вот:
#!/bin/sh
if [ "$#" -ne "4" ]; then
echo Usage:
echo " $0 interface ip range netmask"
echo " examples:"
echo " 1) Assuming you want to bind the IP range 192.168.0.1..192.168.0.254 to eth0 with netmask 255.255.255.0:"
echo " $0 eth0 192.168.0. 1..254 255.255.255.0"
echo " 2) Assuming you want to bind the IPv6 range 2001:41d0:1:5000::1-2001:41d0:1:5000::254 to eth0 with netmask /56"
echo " $0 eth0 2001:41d0:1:5000:: 1..254 56"
else
echo "Attempting to assign the IP range $2($3) to interface $1 with netmask $4"
for ip in $(eval echo "{$3}"); do ifconfig -v $1 add $2$ip netmask $4; done
fi
Как уже говорили другие, вы можете использовать механизм AnyIP для маршрутизации поступающих пакетов для всей подсети на интерфейс localhost, но имейте в виду, что вам также необходимо настроить восходящий маршрутизатор для маршрутизации всех желаемых пакетов на этот компьютер в первое место. Это можно сделать просто с помощью записей таблицы маршрутизации на маршрутизаторе или через BGP. ARP не совсем подходит, учитывая, что ваша машина должна будет использовать ARP для каждого IP отдельно.
Описанный выше "Anyip" не работал у меня на centos 7. Мне пришлось создать скрипт для ручного создания адресов ipv6 при загрузке. Для этого я добавил в / etc / crontab следующее:
@reboot root /path/to/bashscript
Вот сценарий bash для создания примерно 3000 адресов ipv6:
#!/bin/bash
INETP="2a00:xxxx:xxxx:xxxx::"
PRE="64"
INTE="eth0"
IP1=/sbin/ip
echo -n "Adding IPv6 addresses..."
for i in {3..3000}
do
$IP1 -6 addr add ${INETP}$(printf '%x\n' $i)/${PRE} dev ${INTE}
done
echo "Done!"