当我想获取有关单个 ip 号或子网的 arp 信息时,我必须 snmpwalk 整个 arp 表,因为一些 oid 架构师有一个“好”的想法,即始终在 oid 中的 ip 号之前插入接口索引。.1.3.6.1.2.1.3.1.1.2.(接口).(ip) , .1.3.6.1.2.1.4.22.1.2.(接口).(ip) , .1.3.6.1.2.1.4.35.1.4.(接口).1.4.(IP)。还是我错过了什么?
为什么在所有 arp 表 snmp oids 中的 ip 号之前都有一个接口索引?
ARP 实际上是每个接口。一个路由器的每个接口都有不同的网络,ARP只与IP地址的网络(接口)有关。有些操作系统实际上有多个 ARP 表,在列出设备的 ARP 时,您似乎只将其视为一个表,但实际上每个接口都有不同的表。
例如,在 Cisco 路由器上,您可以使用show arp
将列出所有 ARP 表的所有 ARP 条目的命令,或者您可以使用show arp <interface>
orshow arp <network>
命令显示其中一个接口的单个 ARP 表。
通过使用 SNMP 的接口索引,您可以看到接口的 ARP 表。
甚至可以通过命令获取特定ip的arp
Show ip arp | i 192.168.X.X
在少数思科高端交换机中,例如 neXus 6k、9k 和 Catalyst 第 3 层交换机。
在 windows pcarp -a
命令用于获取与连接网络的整个 arp 表关联
与此同时,我找到了解决方案。问题是,先验地只知道目标 IP,而不知道接口索引,因此无法为一个 arp 条目构造必要的 oid
.1.3.6.1.2.1.4.22.1.2.interface.ip1.ip2.ip3.ip4
,但是由于想要向网关询问此 arp 条目,无论如何都必须猜测网关 IP(可能类似于 ip1.ip2.ip3.1),因此可以通过 oid 找到接口索引
-1.3.6.1.2.1.4.20.1.2.ip1.ip2.ip3.1
。终于有了一点 bash 魔法
snmpbulkwalk -c public -v 2c -OnQx ip1.ip2.ip3.1 .1.3.6.1.2.1.4.22.1.2.$(snmpget -c public -v 2c -Oqv ip1.ip2.ip3.1 .1.3.6.1.2.1.4.20.1.2.ip1.ip2.ip3.1 | tr -d "\n").ip1.ip2.ip3.ip4