如何使用SNMP获取连接到交换机的设备的MAC地址或IP地址?

8
使用SNMP,我如何获取连接到交换机每个端口上的设备的MAC地址?我们使用惠普ProCurve交换机。我尝试使用OID dot1dTpFdbPort,但这似乎给出的是与交换机通信的每个设备的MAC地址,而不仅仅是连接到它的设备。我正在尝试查找将以端口1-48的列表形式呈现,并为每个端口提供连接到该端口的设备的MAC(或IP地址)的OID。谢谢!
5个回答

6

非常感谢raz3r的回答。

从您的linux服务器:

$ snmpwalk -v 1 -c public xxx.xxx.xxx.xxx 1.3.6.1.2.1.17.4.3.1.2 | grep "INTEGER: 11"

(端口号为11)

将返回:

SNMPv2-SMI::mib-2.17.4.3.1.2.44.118.138.64.143.95 = INTEGER: 11
SNMPv2-SMI::mib-2.17.4.3.1.2.56.170.60.108.174.57 = INTEGER: 11
SNMPv2-SMI::mib-2.17.4.3.1.2.104.181.153.172.54.237 = INTEGER: 11
SNMPv2-SMI::mib-2.17.4.3.1.2.120.172.192.143.226.236 = INTEGER: 11
SNMPv2-SMI::mib-2.17.4.3.1.2.124.195.161.20.109.76 = INTEGER: 11
SNMPv2-SMI::mib-2.17.4.3.1.2.152.75.225.59.127.180 = INTEGER: 11

然后你可以这样找到连接的Mac地址:

$ snmpwalk -v 1 -c public xxx.xxx.xxx.xxx 1.3.6.1.2.1.17.4.3.1.1 | grep "152.75.225.59.127.180"

返回Mac地址:

SNMPv2-SMI::mib-2.17.4.3.1.1.152.75.225.59.127.180 = Hex-STRING: 98 4B E1 3B 7F B4

你可以编写一个script.sh来执行这个操作...


4
实际上,第一个查询已经包含了MAC地址:"152.75.225.59.127.180"是"98 4B E1 3B 7F B4"的十进制表示。你不需要进行第二个snmpwalk来进行转换。 - Marki

1

尝试以下方法,直接将MAC地址转换为十六进制:

snmpwalk -OX -v 2c -c public xxx.xxx.xxx.xxx 1.3.6.1.2.1.17.4.3.1.2 

1

你差不多接近成功了 :) dot1dTpFdbPort 就是你要找的东西,唯一需要的是一个到实际端口索引的链接。

首先,获取 dot1dTpFdbPort 给出的数值。

现在使用之前获取的数值查询 dot1dBasePortIfIndex。

我们来举个例子:

snmpwalk -v 2c -c xxx 192.168.x.x 1.3.6.1.2.1.17.4.3.1.1

SNMPv2-SMI::mib-2.17.4.3.1.1.0.2.253.255.213.15 = Hex-STRING: XX XX XX XX XX XX

snmpwalk -v 2c -c xxx 192.168.x.x 1.3.6.1.2.1.17.4.3.1.2

SNMPv2-SMI::mib-2.17.4.3.1.2.0.2.253.255.213.15 = INTEGER: 22

# Notice the 22 :)

snmpwalk -v 2c -c xxx 192.168.x.x 1.3.6.1.2.1.17.1.4.1.2.22

SNMPv2-SMI::mib-2.17.1.4.1.2.22 = INTEGER: 10122

请注意,这并不是非常高效的,因为您需要查看整个表。不幸的是,似乎没有一张表可以直接执行端口-> MAC查找。 - Marki
@Marki,我认为这种事情是不可能的,因为每个端口可能有多个MAC地址。这是一种1:N的关系,而MAC地址和端口之间是1:1的关系。(我自己也刚刚经历了这种烦恼。) - Peter Hansen
因此,我提到可能会有一个表格(或每个端口一个表格),显示这种关系。 - Marki

0

Netsnmp的snmptable在这里可能更易读。

示例dot1dTpFdb表检索:

snmptable  -M +.  -m +ALL -v 2c -c public  -Ci  192.168.x.x    BRIDGE-MIB::dot1dTpFdbTable
   index dot1dTpFdbAddress dot1dTpFdbPort dot1dTpFdbStatus
'..?...'   98:4B:E1:3B:7F:B4           13          learned
// other rows snipped for brevity

示例dot1dBasePort表检索:

snmptable  -M +.  -m +ALL -v 2c -c public  -Ci  192.168.x.x   BRIDGE-MIB::dot1dBasePortTable
 index dot1dBasePort dot1dBasePortIfIndex    dot1dBasePortCircuit dot1dBasePortDelayExceededDiscards dot1dBasePortMtuExceededDiscards
    13            13                10113 SNMPv2-SMI::zeroDotZero                                  0                                0
// other rows snipped for brevity

0
#!/bin/bash
# This should iterate thru each active port. 
HOST=xxx.xxx.xxx.xxx ## Change this to the ip address of the switch
echo
snmpwalk -v 1 -c public "$HOST" 1.3.6.1.2.1.17.4.3.1.1 | grep "$" |awk -- '{print $4":"$5":"$6":"$7":"$8":"$9}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接