Как узнать, через какой интерфейс будет маршрутизировано соединение с данным хостом? - PullRequest
1 голос
/ 05 апреля 2011

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

Я действительно не хочу анализировать таблицу маршрутизации ядра Linux, поскольку она может быть хрупкой и легко ломаться.Есть ли в любом случае опросить ядро ​​и заставить его сказать мне, каким образом будет маршрутизироваться пакет.

В идеале для этого было бы решение на python.Я искал привязки Python для libdnet, но кажется, что он только может вернуть шлюз по умолчанию для адреса 0.0.0.0.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Лучший ответ для этого во всех сценариях дает команда Linux ip route get $DEST. Это учитывает политику маршрутизации (несколько таблиц маршрутизации выбираются разными селекторами).

Синтаксис (от ip route help):

       ip route get ADDRESS [ from ADDRESS iif STRING ]
                        [ oif STRING ]  [ tos TOS ]
1 голос
/ 05 апреля 2011

Пакет всегда идет по наиболее конкретному маршруту.Предполагая, что ваш хост не участвует в маршрутизации, если нет статически настроенных маршрутов хоста, сообщающих трафику, предназначенному для конкретной сети, принять другой маршрут, он всегда будет использовать маршрут по умолчанию (он же 0.0.0.0).* Даже если у вас есть отдельный интерфейс, настроенный в отдельной сети (например, eth1), вы все равно можете иметь только один маршрут по умолчанию.Если вам нужно в определенные пункты назначения принять eth1, вам нужно настроить статический маршрут (он же хост-маршрут).

Вы это сделали?Если нет, вот почему libdnet предоставляет только шлюз по умолчанию, потому что это единственный выход, который знает хост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...