кілька фізичних інтерфейсів з IP-адресами в одній підмережі


13

У мене є вікно Linux з 9 NIC, і я хочу, щоб вісім з них мали унікальні адреси в одній підмережі, наприклад:

ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0

Поведінка ARP за замовчуванням в цьому випадку є надзвичайно контрпродуктивною, оскільки це призводить до того, що весь трафік для всіх IP-адрес проходить виключно через eth1, що майже навпаки тому, що я хочу.

Тож я поскакав і закінчив внести деякі зміни в sysctl, такі як ця:

net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Це перешкоджало eth1видавати себе за інших, але я все ще не можу eth1успішно вписати нічого, крім адреси. (наприклад, з другого комп’ютера на тому ж комутаторі, 192.168.123.1відповідає лише ping)

Я здогадуюсь, що мені потрібно щось робити з аргументами чи iproute або ЗНОШЕ, але я в цьому полі втрачаюсь у морі.

Бонусні бали: рішення повинно бути сумісним з Linux 2.6.27.27. (Більш конкретно, Slax 6.1.2)


Чи можете ви розмістити таблицю маршрутизації?
ponsfonze

2
Яка мета у створенні цієї конфігурації? Що ви намагаєтеся досягти?
Девід Шварц

таким чином лежить божевілля.
Sirex

якщо ви хочете зв’язати ці інтерфейси, вам доведеться фактично їх зв’язати.
resmon6

1
@DavidSchwartz Ні, машина не повинна діяти як комутатор (або маршрутизатор). Подумайте про це більше як про роботу 8 віртуальних машин з виділеним фізичним NIC для кожного VM ( Примітка: я не запускаю VM, це лише аналогія ). З точки зору іншого вікна в тій же мережі, мій єдиний ПК повинен бути абсолютно невідмінним від восьми дискретних ПК.
frustrated_tester

Відповіді:


17

Вам потрібна міцна кінцева модель системи . Linux принципово побудований на основі слабкої моделі системи відправки, тому це дійсно не вдалий вибір ОС для цього додатка.

Вам доведеться підробляти кожну частину потрібної вам поведінки, від ARP до маршрутизації політики до вибору адреси джерела. Вам також знадобляться фільтри, щоб запобігти прийняттю пакетів, якщо вони надходять на неправильний інтерфейс.

Однозначно необхідними кроками є:

  1. Налаштуйте arp_filter = 1 і arp_ignore = 2 на всіх інтерфейсах.

  2. Додайте маршрутизацію на основі вихідного інтерфейсу за вихідним трафіком. (Інтерфейс призначення потрібно вибирати на основі адреси джерела.)

  3. Додайте фільтрування входу за інтерфейсом, щоб мовчки скинути пакети, отримані на неправильному інтерфейсі. (Пакети з адресою призначення, призначеної іншому інтерфейсу.)

На жаль, не існує єдиної думки щодо того, чи потрібні ці три кроки. Модель слабкої системи вбудована у весь стек Linux TCP / IP, і не ясно, що може піти не так у тонких проблемах, як багатоадресна передача.

Незрозуміло, як би ви вибрали, наприклад, вихідний інтерфейс для трансляцій. Чи повинні виходити всі вони? Можливо. Яка правильна поведінка, якщо стек отримує вихідну трансляцію з адресою джерела, не призначеної одному з інтерфейсів?

Знову ж таки, ви вибрали неправильний інструмент для роботи.


6

Ви, швидше за все, хочете створити міст з інтерфейсами 8/9, а потім призначити IP-адресу цьому мосту (пакет bridge-utils, команда 'brctl add').

Таким чином міст буде діяти як комутатор і може мати IP-адресу у вашій підмережі.


AFAIK, це насправді має бути правильною відповіддю для Linux. Linux обходить багато проблем, згаданих у відповіді Девіда, використовуючи мостові пристрої (також уникайте проблем L3 шляхом створення кращої логічної мережі L2).
Дейв

4

Я рекомендую приєднати фізичні інтерфейси, а потім налаштувати всі адреси на одному зв’язаному інтерфейсі.

Вам також знадобиться підтримка на комутаторі.

Ось міні-підручник, який ви можете використовувати для початку роботи.


4

Здається, ви хочете тестового середовища, еквівалентного 9 окремим машинам, і вважаєте, що 9 інтерфейсів на одній машині можуть імітувати це. У Linux це просто неможливо зробити через один стек з причин, описаних Девідом Шварцом. BTDT і мають рубці. Це було досить погано з 2 інтерфейсами.

Кращим рішенням може бути запуск 8 або 9 дискретних віртуальних машин на одному хості та з'єднання 8 або 9 інтерфейсів для цих віртуальних машин.


Ресурси читання: Мережеве програмування Unix: Мережевий інтерфейс Sockets від Stevens, Fenner та Rudoff. Також див. RFC1122 та RFC4907.
Скаперен

0

Так, це можливо за пропозицією Девіда Шварца:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// Для належної функціональності, тобто відповіді ARP від ​​eth1 для отримання, коли і eth0, і eth1 знаходяться в одній підмережі

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// встановити таблицю "new_rt_table" для маршрутизації пакетів через eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// Позначте пакети, щоб 'ip route' міг прокласти його через eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// включити підтримку декількох таблиць маршрутизації в конфігурації ядра.

Конфігурація ядра

→ Підтримка мережі → Параметри мережі

[*] IP: розширений маршрутизатор

[*] IP: маршрутизація політики

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

// вищевказані кроки перенаправляють пакети, призначені для виведення з eth0, щоб правильно вийти з eth1.

Просимо запропонувати будь-які інші методи, якщо хтось змусить його працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.