Моему script необходимо настроить назначения ловушек SNMP для нескольких хостов, которые существуют в разных сетях. Поэтому важно, чтобы адрес назначения ловушки был интерфейсом, доступным для удаленного устройства node.
Я действительно не хочу разбирать таблицу маршрутизации ядра Linux, поскольку она может быть хрупкой и легко ломаться. В любом случае, чтобы допросить ядро и заставить его указать, в каком направлении будет маршрутизироваться пакет.
В идеале для этого было бы решение python. Я смотрел на привязки python для libdnet, но это только, кажется, может вернуть шлюз по умолчанию для адреса 0.0.0.0.
Лучший ответ для этого во всех сценариях дается командой Linux ip route get $DEST
. Это учитывает маршрутизацию политики (несколько таблиц маршрутизации, выбранных разными селекторами).
Синтаксис (от ip route help
):
ip route get ADDRESS [ from ADDRESS iif STRING ]
[ oif STRING ] [ tos TOS ]
Пакет всегда будет принимать наиболее специфический маршрут. Предполагая, что ваш хост не участвует в маршрутизации, если нет каких-либо статически настроенных хост-маршрутов, указывающих трафик, предназначенный для конкретной сети, для перехода по другому маршруту, он всегда будет использовать маршрут по умолчанию (aka 0.0.0.0).
Даже если у вас есть отдельный интерфейс, настроенный в отдельной сети (например, eth1), у вас может быть только один маршрут по умолчанию. Если вам нужно, чтобы определенные пункты назначения принимали eth1, вам нужно настроить статический маршрут (также известный как хост-маршрут).
Вы сделали это? Если нет, именно поэтому libdnet предоставляет только шлюз по умолчанию, потому что это единственный выход, который знает хозяин.