У меня проблемы с маршрутизацией из-за следующего:
У меня есть сервер с 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
Таким образом, ядро 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% пакетов для достижения вашего хоста.
Если вам нужна эта несколько сломанная установка для работы, либо: