У меня коммутатор Dell 6248. Я подключаю к нему некоторые из своих серверов и хочу знать, какой сервер подключен к какому порту коммутатора. Я пытаюсь использовать snmpwalk для получения этой информации, но я просто могу получить сопоставление mac / ip моего сервера nic с коммутатора, я все еще не могу понять, к какому порту коммутатора он подключается.
Я пробую инструмент под названием Managed Switch Port Mapping tool, он может показать, какой порт коммутатора подключен к какому nic / ip. Я использую WireShare для получения всех пакетов snmp, но до сих пор не могу найти идентификатор snmp для получения этой информации.
Кто-нибудь знает, как это получить?
Вам нужно немного отслеживать через BRIDGE-MIB и IF-MIB.
(Предостережение: у меня нет вашей конкретной модели коммутатора для тестирования, но это стандартные MIB, так что это должно работать.)
Использовать dot1dTpFdbAddress (.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). Используйте их, чтобы узнать ценность dot1dTpFdbPort (.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). Используйте это, чтобы извлечь из ifName (.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
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);
?>
Если ваша цель - выяснить, какие хосты к каким портам подключены, почему бы не войти в интерфейс управления коммутатором (веб или cli) и посмотреть таблицу адресов, которая покажет вам, какие MAC-адреса связаны с какими портами.