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

13

У меня есть linux box с 9 сетевыми картами, и я хочу, чтобы восемь из них имели уникальные адреса в одной подсети, например:

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отвечает на пинг)

Я предполагаю, что мне нужно что-то сделать с arptables, iproute или SOMETHING, но я потерялся в море в этой области.

Бонусные баллы: Решение должно быть совместимо с Linux 2.6.27.27. (Более конкретно, Slax 6.1.2)

frustrated_tester
источник
Вы можете опубликовать таблицу маршрутизации?
Понфонзе
2
Какова ваша цель в создании этой конфигурации? Что вы пытаетесь достичь?
Дэвид Шварц
Таким образом, безумие лжи.
Sirex
если вы хотите связать эти интерфейсы, вам придется их связать.
resmon6
1
@DavidSchwartz Нет, машина не должна действовать как коммутатор (или маршрутизатор). Думайте об этом больше как о запуске 8 виртуальных машин с выделенной физической сетевой картой для каждой виртуальной машины ( Примечание: я не использую виртуальные машины , это просто аналогия ). С точки зрения другого блока в той же сети, мой единственный ПК должен быть совершенно неотличим от восьми дискретных ПК.
frustrated_tester

Ответы:

17

Вам нужна сильная модель конечной системы . Linux в своей основе построен на модели слабой системы отправки, поэтому это действительно не лучший выбор ОС для этого приложения.

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

Определенно необходимые шаги:

  1. Настройте arp_filter = 1 и arp_ignore = 2 на всех интерфейсах.

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

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

К сожалению, нет единого мнения о том, являются ли эти три шага всем необходимым. Системная модель слабого конца встроена во весь стек TCP / IP Linux, и неясно, что может пойти не так с такими тонкими проблемами, как многоадресная рассылка.

Неясно, например, как бы вы выбрали выходной интерфейс для трансляций. Должно ли это выйти из них всех? Может быть. Каково правильное поведение, если стек получает исходящую трансляцию с адресом источника, не назначенным одному из интерфейсов?

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

Дэвид Шварц
источник
6

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

Таким образом, мост будет действовать как коммутатор и может иметь IP-адрес в вашей подсети.

Be2eB
источник
AFAIK, это должно быть правильным ответом для Linux. Linux решает многие проблемы, упомянутые в ответе Дэвида, используя мостовые устройства (иначе избегайте проблем L3, создавая лучшую логическую сеть L2).
Дейв
4

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

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

Вот мини-учебник, который вы можете использовать, чтобы начать.

bahamat
источник
4

Кажется, вам нужна тестовая среда, эквивалентная 9 отдельным машинам, и вы полагаете, что 9 интерфейсов на одной машине могут эмулировать это. В Linux он просто не может сделать это через один стек по причинам, описанным Дэвидом Шварцем. BTDT и есть шрамы. Это было достаточно плохо с 2 интерфейсами.

Лучшим решением может быть запуск 8 или 9 дискретных виртуальных машин на одном хосте и подключение 8 или 9 интерфейсов к этим виртуальным машинам.

Skaperen
источник
Ресурсы для чтения: Сетевое программирование Unix: Сетевой API Sockets, Стивенс, Феннер и Рудофф. Также см. RFC1122 и RFC4907.
Skaperen
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.

Пожалуйста, предложите любые другие методы, если кто-то заставляет это работать.

Ноэль Ав
источник