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

26

Я знаю, что инструмент ip позволяет вам привязать несколько адресов к интерфейсу (например, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). Однако сейчас я пытаюсь создать что-то поверх IPv6, и было бы очень полезно иметь доступ к целому блоку адресов (скажем, / 64), чтобы программы могли выбирать любой адрес из диапазона и привязать к этому. Излишне говорить, что подключение каждого IP-адреса из этого диапазона к интерфейсу займет некоторое время.

Поддерживает ли Linux привязку целого блока адресов к интерфейсу?

р-статические
источник
Разные дистрибутивы имеют разные способы справиться с этим. Выбери один.
Игнасио Васкес-Абрамс
Ubuntu прямо сейчас, но решения, которые работают через дистрибутивы, конечно, предпочтительнее.
p-static
Этот учебник связывает один адрес в блоке (/ 24). / 24 просто указывает, в каком блоке он находится. Он должен работать одинаково для IPv6.
BillThor
Кросс-дистрибутивом будет написать скрипт, который использует «ip addr add». Red Hat, Ubuntu и SuSE имеют разные сетевые сценарии ...
Шон Рейфшнайдер
1
@ChandraNakka Является ли это полезно для вас?
Касперд

Ответы:

31

Linux 2.6.37 и выше поддерживает это через функцию под названием AnyIP . Например, если я бегу

ip route add local 2001:db8::/32 dev lo

на машине с Ubuntu 11.04 он будет принимать соединения по любому адресу в сети 2001: db8 :: / 32.

Джеральд Комбс
источник
1
Есть ли какое-либо решение AnyIP для ipv4?
Coaku
Это работает на Ubuntu 14.04?
Чандра Накка
Это, кажется, работает, и я могу пропинговать диапазон адресов, но когда я бегу ip route listили ip -6 route listдобавленный маршрут не виден. Как бы вы перечислили блок адресов AnyIP?
Колтон
Это работает для адресов локально, но я не могу пропинговать или получать доступ к этим IP-адресам из внешних источников. Есть ли способ это исправить? (Я пытался заменить lo на eth0, но тогда ничего не достижимо)
BrainStone
@BrainStone, для этого вам нужно установить ndppd или получить префикс, маршрутизируемый вашим провайдером
Arya
6

Да, 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, о которых я раньше не знал.

larsks
источник
Круто! Я попробовал это с IPv6 на Ubuntu (Lucid & Hardy) без какой-либо удачи. Я думаю, что это будет убийственная функция для IPv6 - вы можете сопоставить адреса, объекты базы данных или использовать адреса в качестве идентификаторов сеансов.
Джеральд Комбс
2
Нет, вам не следует добавлять адрес в lo. Вместо добавления маршрута: ip -6 route add local <ip> dev lo.
Навин
2

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

  1. использовать скрипт, чтобы привязать все адреса к интерфейсу индивидуально

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

  3. Можно было бы поэкспериментировать с правилами NAT, чтобы затем переписать блок Ips, который был перенаправлен на одну машину, в один внутренний 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
pjz
источник
где будет назван такой сценарий?
Skaperen
2

Как уже говорили другие, вы можете использовать механизм AnyIP для маршрутизации прибывающих пакетов для всей подсети на интерфейс локального хоста, но имейте в виду, что вам также необходимо настроить маршрутизатор восходящего потока для маршрутизации всех требуемых пакетов на эту машину в первое место. Это можно сделать просто с помощью записей таблицы маршрутизации на маршрутизаторе или через BGP. ARP на самом деле не подходит, учитывая, что ваша машина должна будет ARP для каждого IP в отдельности.

Кайл Роуз
источник
1

«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!"
Николя Геренет
источник
Этот метод работает только до тех пор, пока вы не наберете около 4000 адресов. Если вы попытаетесь настроить больше адресов, это не сработает. Существуют сценарии, в которых желательно назначить целые / 96 или / 64 одному хосту, и ваш метод не сможет масштабироваться так далеко.
kasperd
@kasperd, где вы можете заставить так называемый механизм anyip, «описанный» Джеральдом Комбсом выше, работать на Centos 7 или Debian 8?
Николя Геренет
1
Да, это работает. Но есть еще несколько шагов, чем упомянуто в этом ответе. Смотрите мой ответ на аналогичный вопрос.
Касперд