Назад | Перейти на главную страницу

Разделенные виртуальные сети с одинаковым диапазоном подсетей с 2 ​​интерфейсами

У меня проблемы с маршрутизацией из-за следующего:

У меня есть сервер с 2-мя интерфейсами. Он имеет псевдоним 1-1, содержащий ту же подсеть. 2 интерфейса подключены к 2 переключателям, которые отделены друг от друга. Инфраструктура:

Eth0      192.168.16.2/20
Eth0:eth0 192.168.1.222/20
Eth1      192.168.32.3/20
Eth1:eth1 192.168.1.223/20

У меня есть компьютер с IP-адресом: 192.168.1.3/24

Проблема следующая:

traceroute показывает, что маршрут пересекает 192.168.1.222

ping -I 192.168.1.223 192.168.1.3 не работает в подсети 2.

Записи arp показывают MAC-адрес, принадлежащий правильному интерфейсу (eth1 в подсети 2)

Как я могу заставить сервер искать на обоих интерфейсах одну и ту же ранжированную подсеть для определенного IP?

Он ищет только в первой подсети.

В таблице маршрутизации есть 2 записи:

192.168.0.0/20 dev eth0 proto kernel scope link src 192.168.1.222
192.168.0.0/20 dev eth1 proto kernel scope link src 192.168.1.223

Обновление1:

Таким образом, ядро ​​Linux не может определить, какой интерфейс имеет IP 192.168.1.3. Мы решили проблему с подключением разделенных коммутаторов подсети друг к другу, но теперь трафик идет по ETH0.

Последний способ - перенастроить IP-адреса ПК во время теста, чтобы они соответствовали диапазону IP-адресов подсети.

Спасибо за ответы.

У нас была точно такая же конфигурация с разными IP-адресами. Один хост имел IP-адрес, настроенный на нескольких интерфейсах, например:

10.0.0.0/24 dev eth1  proto kernel  scope link  src 10.0.0.10 
10.0.0.0/24 dev eth2  proto kernel  scope link  src 10.0.0.10 
10.0.0.0/24 dev eth3  proto kernel  scope link  src 10.0.0.10

Мне просто нужно было добавить IP-маршруты, например:

> ip route add 10.0.0.123 dev eth3

Итак, у меня были такие записи:

> ip route show
...
10.0.0.123 dev eth3  scope link 
10.0.0.101 dev eth2  scope link 
10.0.0.136 dev eth1  scope link
...

После этого он должен работать. @nickw, предлагающий правила, основанные на политике, также может быть правильным, но я считаю этот подход немного проще.


Примечание: ИМХО, это действительно плохая практика, у нас с ней возникло много проблем. Также, AFAIK, вы не сможете получить доступ к хосту на другом интерфейсе без изменения IP-маршрута или записей правил, поэтому вам придется перенастроить таблицы, если вы переместите машину в другую (физическую) сеть.

Проблема следующая:

Если компьютер находится в подсети 1, я могу его пропинговать. Если компьютер находится в подсети 2, я не могу его пропинговать.

Как я могу заставить сервер смотреть на оба интерфейса в одной и той же ранжированной подсети для определенного IP?

Это невозможно. Не на уровне ядра.

Вы не можете иметь два маршрута в таблице маршрутизации и ожидать, что ядро ​​попробует оба, если вы не укажете ничего другого, например, какой интерфейс или исходный IP-адрес использовать.

Основное практическое правило таково: если хост недоступен через интерфейс, НЕ добавляйте маршрут для этого хоста на этом интерфейсе. Хосты не должны быть «умными» или волшебным образом угадывать, какой интерфейс использовать. Если есть маршрут, ядро ​​всегда выбирает этот маршрут, даже если он не работает.

У вас может быть несколько таблиц маршрутизации в зависимости от исходного IP-адреса, определяемого приложением выходного интерфейса или метки, или tos, или многих других параметров и даже нескольких сетевых пространств имен, но в конце, если вы выполняете только простой " ping 192.168.1.3 ", ядро ​​выберет только один маршрут в одной из ваших таблиц маршрутизации и будет использовать его.

Даже если у Linux есть техническая возможность циклического перебора маршрута, он будет делать это для каждого пакета. Если вы используете это, у вас будет потеря 50% пакетов для достижения вашего хоста.


Если вам нужна эта несколько сломанная установка для работы, либо:

  • Соедините две сети, на ваших серверах или на ваших коммутаторах, даже если это только с точки зрения вашего сервера.
  • Убедитесь, что ваш хост 192.168.1.3 виден из обеих сетей.
  • на уровне 2 объедините два ваших интерфейса и продублируйте все, что отправляется на eth0, на eth1. Это ужасно, да.
  • Прекратите перемещать 192.168.1.3 из двух подсетей.
  • Запустите протокол маршрутизации на своем сервере и на 192.168.1.3, чтобы таблицы маршрутизации автоматически настраивались в зависимости от того, где находится 192.168.1.3.