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

Проблемы с пингом с двумя интерфейсами, одной и той же подсетью, прямые подключения к двум отдельным хостам

У меня есть конфигурация клиентской машины (Ubuntu 14.04.2 LTS), которая напрямую подключается к двум серверным машинам. Серверные машины - находясь в одной подсети - не могут маршрутизировать друг друга. Пакеты не должны маршрутизироваться между клиентскими eth1 и eth2, либо (то есть клиент не является маршрутизатором), и поскольку здесь задействован акт обнаружения, таблица маршрутизации не может быть предварительно запрограммирована с использованием IP-адресов serverX.

Ниже представлена ​​грубая диаграмма. eth0 исключен из этого изображения, поскольку он не может маршрутизироваться в подсеть 172.16.37.0/24. Брандмауэров нет (оба iptables и ufw чисты как свист).

     client                         server01
+-------------------+          +-------------------+
| 172.16.37.53 eth1-|----------|-eth1 172.16.37.11 |
|                   |          +-------------------+
|                   |               server02
|                   |          +-------------------+
| 172.16.37.54 eth2-|----------|-eth1 172.16.37.12 |
+------------------ +          +-------------------+

Проблема, с которой я сталкиваюсь, заключается в том, что ping -I eth2 172.16.37.12 не работает с клиентской машины. Короче, что я наблюдаю через tcpdump является:

Если я отправлю бесплатные ARP с arping -A -I eth2 172.16.37.54 от клиента, то наблюдение будет таким:

Когда я straced мой сеанс ping, он повторяет попытку recvmsg; на сокете ничего не отображается.

Вот таблица маршрутизации для вышеупомянутых наблюдений:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.187.2    0.0.0.0         UG    0      0        0 eth0
172.16.37.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
172.16.37.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2
172.16.187.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

Если я добавлю маршрут к хосту в таблицу маршрутизации для 172.16.37.12 -> eth2, то и разрешение ARP, и операция ping работают должным образом. Однако я не могу предварительно запрограммировать маршруты хоста, так как мне нужно обнаружить подключенные машины - все, что у меня есть, это активные интерфейсы и их подсети.

Пакеты не принимаются на eth1 при тестировании eth2 (У меня наблюдались почти все интерфейсы). Также стоит отметить, что такой проблемы не бывает с eth1; он способен ping -I eth1 правильно без записи маршрута к хосту (и из-за порядка маршрута -I вариант в данном случае избыточен, но в целом я не могу полагаться на порядок таблицы).

Почему не приложение (в одном случае кеш ARP; в другом ping) получать пакеты? Как я могу отследить, куда идут данные? Все кажется чтобы пакет работал правильно до тех пор, пока пакет не будет доставлен в приложение.