使用 SNMP 进行 DELL 交换机 6248 端口和 mac 映射

使用 SNMP 进行 DELL 交换机 6248 端口和 mac 映射

我有一台戴尔 6248 交换机。我将一些服务器连接到它,并想知道哪个服务器网卡连接到哪个交换机端口。我尝试使用 snmpwalk 来获取此信息,但我只能从交换机获取服务器网卡的 mac/ip 映射,仍然无法获取它连接的交换机端口。

我尝试了一个名为“Managed Switch Port Mapping”的工具,它可以显示哪个交换机端口连接到哪个网卡/ip。我使用WireShare获取所有snmp数据包,但仍然找不到获取此信息的snmp oid是什么。

有人知道如何获得它吗?

答案1

您必须通过BRIDGE-MIB 和 IF-MIB 进行一些跟踪。

(警告:我没有您要测试的特定交换机型号,但这些是标准 MIB,所以应该可以工作。)

使用dot1dTpFdb地址(.1.3.6.1.2.1.17.4.3.1.1)从 BRIDGE-MIB 中查找 MAC 地址(为了清楚起见,示例显示了一行 snmpwalk 输出,您可能会返回几行):

>snmpwalk -v 2c -c public myswitch .1.3.6.1.2.1.17.4.3.1.1
SNMPv2-SMI::mib-2.17.4.3.1.1.0.20.124.62.198.161 = Hex-STRING: 00 14 7C 3E C6 A1

取基本 OID 后面的数字(看这个例子,我说的是 0.20.124.62.198.161)。使用它们来查找dot1dTpFdb端口(.1.3.6.1.2.1.17.4.3.1.2),也来自BRIDGE-MIB:

>snmpwalk -v 2c -c public myswitch .1.3.6.1.2.1.17.4.3.1.2
SNMPv2-SMI::mib-2.17.4.3.1.2.0.20.124.62.198.161 = INTEGER: 794

从 dot1dTpFdbPort 中获取整数值(示例中为 794),并使用它们来查找dot1dBasePortIfIndex(.1.3.6.1.2.1.17.1.4.1.2),再次来自BRIDGE-MIB:

>snmpwalk -v 2c -c public myswitch .1.3.6.1.2.1.17.1.4.1.2
SNMPv2-SMI::mib-2.17.1.4.1.2.794 = INTEGER: 200

该值是您的 ifIndex(示例中为 200)。使用它来从是否名称(.1.3.6.1.2.1.31.1.1.1.1),来自 IF-MIB:

>snmpwalk -v 2c -c public myswitch .1.3.6.1.2.1.31.1.1.1.1
IF-MIB::ifName.200 = STRING: 4/20

答案2

如果您的目标是找出哪些主机连接到哪些端口,为什么不登录交换机管理界面(web 或 cli)并查看地址表,它将向您显示哪些 MAC 地址连接到哪些端口。

答案3

PHP 代码可以满足您的要求:

<?php
$_snmp_ip = <ip>;
$_snmp_com = <community>;

$_dot1dTpFdbAddress = snmp2_real_walk($_snmp_ip, $_snmp_com, ".1.3.6.1.2.1.17.4.3.1.1.0");

foreach($_dot1dTpFdbAddress  as $_dot1dTpFdbAddress_key => $_dot1dTpFdbAddress_value)
{
        preg_match("/(\.[\d]*){6}$/i", $_dot1dTpFdbAddress_key, $_dot1dTpFdbAddress_key_unique);
        preg_match("/([0-9A-F ]*){6}$/i", $_dot1dTpFdbAddress_value, $_dot1dTpFdbAddress_value_unique);
        $_dot1dTpFdbPort = snmp2_get($_snmp_ip, $_snmp_com, ".1.3.6.1.2.1.17.4.3.1.2".$_dot1dTpFdbAddress_key_unique['0']);

        preg_match("/[\d]*$/i", $_dot1dTpFdbPort, $_dot1dTpFdbPort);
        $_dot1dBasePortIfIndex = snmp2_get($_snmp_ip, $_snmp_com, ".1.3.6.1.2.1.17.1.4.1.2.".$_dot1dTpFdbPort['0']);

        preg_match("/[\d]*$/i", $_dot1dBasePortIfIndex, $_dot1dBasePortIfIndex);
        $_ifName = snmp2_get($_snmp_ip, $_snmp_com, ".1.3.6.1.2.1.31.1.1.1.1.".$_dot1dBasePortIfIndex['0']);

        preg_match("/\"([^\"]*)\"$/i", $_ifName, $_ifName);

        $mac = str_replace(" ", ":", strtolower($_dot1dTpFdbAddress_value_unique['0']));
        $mac = ereg_replace("(^:|:$)","", $mac);
        $_mac[$mac] = $_ifName['1'];
}
print_r($_mac);
?>

相关内容