SNMP-сопоставление Mac-адреса с портом коммутатора - PullRequest
1 голос
/ 28 мая 2010

Я работаю в центре обработки данных, и я нахожусь в процессе написания php-инструмента, который отображает все наши устройства и может сообщить нам, есть ли что-то, за что выставляется счет.

Сначала он вытягивает огромный список маков и их ips из обоих ядер во временную таблицу. Затем он перебирает все стойки * и пытается найти, к какому порту принадлежит этот Mac. Поскольку нет золотой команды (кий лампочка над вашей головой), я должен:

  1. Создать мульти-массив с портом в качестве ключа и ifindex для значения.
  2. Замените ifindex на идентификатор моста.
  3. Заменить идентификатор моста на хэш mac.
  4. Заменить хэш mac на фактический mac

Наконец, он берет mac, ips и порт и заполняет основную таблицу.

Проблема в первом шаге. 1.3.6.1.2.1.31.1.1.1.1 работает на большинстве коммутаторов, но некоторые из них не работают. 1.3.6.1.4.1.1991.1.1.3.3.1.1.38 вроде как приближается к тому, что я ищу, но мне не совсем удобно, это то, что я ищу. Мне удалось найти конкретные модели устройств в разделе «Литейное дело»> «Продукты»> «Регистрация», но в этой папке нет никаких MIB. Итак, мои вопросы:

  1. Есть ли конкретная строка для литейного производства, которая возвращает порты и маки? ifindexes также будет работать.
  2. Как мне использовать MIB для конкретных устройств (enterprises.foundry.products.registration.snFWSXFamily)?

Любое направление на это было бы замечательно. -Джастин

* = стоечные модели: cisco 2900xl, литейный завод FI4802 + варианты

Ответы [ 3 ]

2 голосов
/ 24 апреля 2013

Вы можете сделать это (проверено на HP Procurve):

С вашего сервера 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 для этого ...

0 голосов
/ 25 ноября 2015

Если вы захотите сделать это программно с Windows Server, вы можете использовать библиотеку SnmpSharpNet, чтобы выполнить то же самое. Вот пример, который создаст список всех MAC-адресов и портов на конкретном коммутаторе Dell с использованием OID 1.3.6.1.2.1.17.7.1.2.2.1.2.1

    using SnmpSharpNet;

    List<KeyValuePair<string, string>> portList = new List<KeyValuePair<string, string>>();

    IPAddress ip = IPAddress.Parse("192.168.0.2");
    SnmpWalk(ip, "snmpcommunity", "1.3.6.1.2.1.17.7.1.2.2.1.2.1", "1");

    //SNMPWALK the ports on a switch or stack of switches. Ports will be labeled SwitchNum/Stack Number/Port Numbers.
    private void SnmpWalk(IPAddress ip, string snmpCommunity, string oid, string switchNum)
    {
        UdpTarget target = new UdpTarget(ip);

        // SNMP community name
        OctetString community = new OctetString(snmpCommunity);
        // Define agent parameters class
        AgentParameters param = new AgentParameters(community);
        // Set SNMP version to 1
        param.Version = SnmpVersion.Ver1;


        // Define Oid that is the root of the MIB tree you wish to retrieve
        Oid rootOid = new Oid(oid);

        // This Oid represents last Oid returned by the SNMP agent
        Oid lastOid = (Oid)rootOid.Clone();

        // Pdu class used for all requests
        Pdu pdu = new Pdu(PduType.GetNext);

        // Loop through results
        while (lastOid != null)
        {
            // When Pdu class is first constructed, RequestId is set to a random value
            // that needs to be incremented on subsequent requests made using the
            // same instance of the Pdu class.
            if (pdu.RequestId != 0)
            {
                pdu.RequestId += 1;
            }
            // Clear Oids from the Pdu class.
            pdu.VbList.Clear();
            // Initialize request PDU with the last retrieved Oid
            pdu.VbList.Add(lastOid);
            // Make SNMP request
            SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param);
            // You should catch exceptions in the Request if using in real application.

            // If result is null then agent didn't reply or we couldn't parse the reply.
            if (result != null)
            {
                // ErrorStatus other then 0 is an error returned by 
                // the Agent - see SnmpConstants for error definitions
                if (result.Pdu.ErrorStatus != 0)
                {
                    // agent reported an error with the request
                    Console.WriteLine("Error in SNMP reply. Error {0} index {1}",
                        result.Pdu.ErrorStatus,
                        result.Pdu.ErrorIndex);
                    lastOid = null;
                    break;
                }
                else
                {
                    // Walk through returned variable bindings
                    foreach (Vb v in result.Pdu.VbList)
                    {
                        // Check that retrieved Oid is "child" of the root OID
                        if (rootOid.IsRootOf(v.Oid))
                        {
                            //Convert OID to MAC
                            string[] macs = v.Oid.ToString().Split('.');
                            string mac = "";
                            int counter = 0;
                            foreach (string chunk in macs)
                            {
                                if (counter >= macs.Length - 6)
                                {
                                    mac += string.Format("{0:X2}", int.Parse(chunk));
                                }
                                counter += 1;
                            }

                            //Assumes a 48 port switch (52 actual). You need to know these values to correctly iterate through a stack of switches.
                            int dellSwitch = 1 + int.Parse(v.Value.ToString()) / 52;
                            int port = int.Parse(v.Value.ToString()) - (52 * (dellSwitch - 1));
                            KeyValuePair<string, string> Port = new KeyValuePair<string, string>(mac, switchNum + "/" + dellSwitch.ToString() + "/" + port.ToString());
                            portList.Add(Port);

                            //Exit Loop
                            lastOid = v.Oid;
                        }
                        else
                        {
                            //End of the requested MIB tree. Set lastOid to null and exit loop
                            lastOid = null;
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("No response received from SNMP agent.");
            }
        }
        target.Close();
    }

Существует целый проект, использующий этот пример, который разрешает эту информацию обратно в Имена хостов здесь

0 голосов
/ 28 мая 2010

когда мне нужно было обнаружить MAC и некоторую другую информацию из моих коммутаторов, я использовал команды 'snmpwalk' и 'snmpbulkwalk' для проверки их содержимого данных SNMP

например:

snmpbulkwalk -v2c 192.168.30.40 -c public 1.3.6.1.2.1.31.1.1.1.1

выходы:

IF-MIB::ifName.1 = STRING: Gi0/1
IF-MIB::ifName.2 = STRING: Gi0/2
IF-MIB::ifName.3 = STRING: Gi0/3
IF-MIB::ifName.4 = STRING: Gi0/4
IF-MIB::ifName.5 = STRING: Gi0/5
IF-MIB::ifName.6 = STRING: Gi0/6
IF-MIB::ifName.7 = STRING: Gi0/7
IF-MIB::ifName.8 = STRING: Gi0/8
IF-MIB::ifName.9 = STRING: Gi0/9
IF-MIB::ifName.10 = STRING: Gi0/10
IF-MIB::ifName.11 = STRING: Gi0/11
IF-MIB::ifName.12 = STRING: Gi0/12
IF-MIB::ifName.13 = STRING: Nu0
IF-MIB::ifName.14 = STRING: Vl1
IF-MIB::ifName.15 = STRING: Vl2
IF-MIB::ifName.16 = STRING: Vl416

и

snmpbulkwalk -v2c 192.168.30.40 -c public 1.3.6.1.2

выводит МНОГО информации, среди которой вы можете найти свои любимые MAC или что-нибудь еще

...