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


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


Круто! Я попробовал это с 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

где будет назван такой сценарий?
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
Да, это работает. Но есть еще несколько шагов, чем упомянуто в этом ответе. Смотрите мой ответ на аналогичный вопрос.
Касперд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.