Чи можу я прив’язати (великий) блок адрес до інтерфейсу?


26

Я знаю, що інструмент ip дозволяє прив’язувати до інтерфейсу декілька адрес (наприклад, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). Зараз я намагаюся створити щось над IPv6, і було б дуже корисно мати цілий блок адрес (скажімо, a / 64), щоб програми могли вибрати будь-яку адресу з діапазону і прив’язати до цього. Зайве говорити, що приєднання кожного IP з цього діапазону до інтерфейсу зайняло б певний час.

Чи підтримує Linux прив'язка цілого блоку адрес до інтерфейсу?


У різних дистрибутивах є різні способи впоратися з цим. Вибрати один.
Ігнасіо Васкес-Абрамс

Зараз Ubuntu, але, звичайно, переважні рішення, які працюють у дистрибутивах.
p-статичний

Цей підручник пов'язує одну адресу в блоці (/ 24). / 24 просто вказує, в якому блоці знаходиться. Він повинен працювати однаково для IPv6.
BillThor

Перехресне дистрибутив було б написати сценарій, який використовує "ip addr add". Red Hat, Ubuntu та SuSE мають різні сценарії мережевого зв’язку ...
Шон Reifschneider

1
@ChandraNakka Є чи це корисно для вас?
kasperd

Відповіді:


31

Linux 2.6.37 і вище підтримує це за допомогою функції під назвою AnyIP . Наприклад, якщо я бігаю

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

на машині Ubuntu 11.04 він прийме з'єднання за будь-якою адресою в мережі 2001: db8 :: / 32.


1
Чи є яке-небудь рішення AnyIP для ipv4?
Коаку

Це працює на 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

де такий сценарій був би названий?
Скаперен

2

Як вже говорили інші, ви можете використовувати механізм AnyIP для маршрутизації надходять пакетів для всієї підмережі до інтерфейсу localhost, але майте на увазі, що вам також потрібно буде отримати маршрутизатор вище, щоб перенаправити всі необхідні пакети до цієї машини в перше місце. Це можна зробити просто за допомогою записів таблиці маршрутизації на маршрутизаторі або через 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
Так, це працює. Але є ще кілька кроків, ніж згадується у цій відповіді. Дивіться мою відповідь на подібне запитання.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.