我有一台戴尔 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);
?>