Назад | Перейти на главную страницу

Могу ли я привязать (большой) блок адресов к интерфейсу?

Я знаю, что инструмент 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, о которых я раньше не знал.

Итак, я вижу здесь несколько вариантов:

  1. использовать сценарий для привязки всех адресов к интерфейсу индивидуально

  2. направьте блок, который вы хотите, на единственный адрес вашей машины, а затем попросите эту машину использовать интерфейс pcap для перехвата всего трафика для указанного блока (как если бы это был маршрутизатор) и обработать его.

  3. Вы могли бы легко поиграть с правилами 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!"