У меня есть 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)
источник
Ответы:
Вам нужна сильная модель конечной системы . Linux в своей основе построен на модели слабой системы отправки, поэтому это действительно не лучший выбор ОС для этого приложения.
Вам нужно будет подделать все, что вам нужно, от ARP до маршрутизации политики и выбора адреса источника. Вам также понадобятся фильтры для предотвращения приема пакетов, если они поступают не на тот интерфейс.
Определенно необходимые шаги:
Настройте arp_filter = 1 и arp_ignore = 2 на всех интерфейсах.
Добавьте для интерфейса исходную маршрутизацию для исходящего трафика. (Интерфейс назначения должен быть выбран на основе адреса источника.)
Добавьте входную фильтрацию для интерфейса, чтобы молча отбрасывать пакеты, полученные на неправильном интерфейсе. (Пакеты с адресом назначения, назначенным другому интерфейсу.)
К сожалению, нет единого мнения о том, являются ли эти три шага всем необходимым. Системная модель слабого конца встроена во весь стек TCP / IP Linux, и неясно, что может пойти не так с такими тонкими проблемами, как многоадресная рассылка.
Неясно, например, как бы вы выбрали выходной интерфейс для трансляций. Должно ли это выйти из них всех? Может быть. Каково правильное поведение, если стек получает исходящую трансляцию с адресом источника, не назначенным одному из интерфейсов?
Опять же, вы выбрали неправильный инструмент для работы.
источник
Скорее всего, вы захотите создать мост с интерфейсами 8/9 и затем назначить IP-адрес этому мосту (пакет bridge-utils, команда 'brctl add').
Таким образом, мост будет действовать как коммутатор и может иметь IP-адрес в вашей подсети.
источник
Я бы порекомендовал связать физические интерфейсы, а затем настроить все адреса на едином связанном интерфейсе.
Вам также понадобится поддержка на коммутаторе.
Вот мини-учебник, который вы можете использовать, чтобы начать.
источник
Кажется, вам нужна тестовая среда, эквивалентная 9 отдельным машинам, и вы полагаете, что 9 интерфейсов на одной машине могут эмулировать это. В Linux он просто не может сделать это через один стек по причинам, описанным Дэвидом Шварцем. BTDT и есть шрамы. Это было достаточно плохо с 2 интерфейсами.
Лучшим решением может быть запуск 8 или 9 дискретных виртуальных машин на одном хосте и подключение 8 или 9 интерфейсов к этим виртуальным машинам.
источник
Да, это возможно после предложения Дэвида Шварца:
// Для правильной функциональности, т.е. ARP отвечает из eth1, чтобы генерироваться, когда eth0 и eth1 находятся в одной подсети
// настройка таблицы "new_rt_table" для маршрутизации пакетов через eth1
// помечаем пакеты, чтобы «ip route» мог направить его через eth1
// включить поддержку нескольких таблиц маршрутизации в конфигурации ядра.
Конфигурация ядра
→ Поддержка сети → Параметры сети
[*] IP: расширенный маршрутизатор
[*] IP: политика маршрутизации
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_MULTIPLE_TABLES
// вышеуказанные шаги перенаправляют пакеты, предназначенные для вывода из eth0, для правильного выхода из eth1.
Пожалуйста, предложите любые другие методы, если кто-то заставляет это работать.
источник