如何找到连接到特定主机的路由接口?
我的脚本需要为一些在不同网络中的主机配置SNMP陷阱的目的地。因此,确保陷阱目的地的地址是可以被远程节点访问的接口地址非常重要。
我其实不太想去解析Linux内核的路由表,因为这可能会很脆弱,容易出错。有没有什么方法可以询问内核,让它告诉我一个数据包会被路由到哪里。
理想情况下,我希望能有一个Python的解决方案。我看过libdnet的Python绑定,但它似乎只能返回地址0.0.0.0的默认网关。
2 个回答
1
一个数据包总是会选择最具体的路径。假设你的主机没有参与路由,如果没有任何静态配置的主机路由告诉数据包去特定网络的不同路径,它就会一直走默认路径(也就是0.0.0.0)。
即使你在一个不同的网络上配置了一个单独的接口(比如说eth1),你仍然只能有一个默认路径。如果你希望某些目的地走eth1,那么你需要配置一个静态路由(也叫主机路由)。
你做过这个吗?如果没有,那就是libdnet只提供默认网关的原因,因为这是主机知道的唯一出路。
3
在任何情况下,最好的解决办法就是使用Linux命令 ip route get $DEST
。这个命令会考虑到策略路由,也就是根据不同的选择器来选择多个路由表。
语法(来自 ip route help
):
ip route get ADDRESS [ from ADDRESS iif STRING ]
[ oif STRING ] [ tos TOS ]