Perl & Net :: SNMP :: Интерфейсы :: Подробности, как получить MAC-адрес? - PullRequest
3 голосов
/ 13 апреля 2011

для моей стажировки мне нужно написать руководителя сети. Я пишу сценарии Perl, чтобы найти всю информацию (скорость, Mac-адрес, дуплекс ...) из имени интерфейса на коммутаторе. В этом модуле есть функция «ifPhysAddress», но она возвращает mac-адрес интерфейса коммутатора, а не mac-адрес подключенного к нему устройства. Как я могу найти MAC-адрес, пожалуйста? Спасибо

Вот что я начал:

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use SnmpTable;
use Net::MAC;
use Net::SNMP;
use Net::SNMP::Interfaces;

my $ifname;
my $hostname;
my $community;
my $version = 1;

GetOptions( "ifname=s"      => \$ifname,
            "host=s"        => \$hostname,
            "community=s"   => \$community,
            "protocol:s"    => \$version);

my $interfaces = Net::SNMP::Interfaces->new(Hostname => $hostname, Community => $community);
my $inter = $interfaces->interface($ifname);

#On récupere l'identifiant de l'interface $ifname
my $ifindex = $inter->index();
#Vitesse
my $vitesse = $inter->ifHighSpeed();
#Alias
my $ifalias = $inter->ifAlias();


#Recherche des VLANs
my $numeroportbridge;
my $vlan_trouve;

my $oid_cisco_vlans = "1.3.6.1.4.1.9.9.46.1.3.1.1.2.1";
my $vlans = SnmpTable->new($hostname, $oid_cisco_vlans, $community);
$vlans->connexion();
my %vl = $vlans->requete();
my @tab = keys(%vl);

foreach my $i (@tab) {
    if ($i<1000) {
        my $comvlan = $community."@".$i;
        print $comvlan."\n";
    }
}
printf "Nom de l'interface : %s --> ifindex = %s, Vitesse = %s, Alias = %s\n", $ifname, $ifindex, $vitesse, $ifalias;

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Хорошо, я нашел, как это сделать, если кому-то нужно это сделать ...

#We get the index of $ifname
my $ifindex = $inter->index();
#Speed
my $vitesse = $inter->ifHighSpeed();
#Alias
my $ifalias = $inter->ifAlias();
#Finding VLANs
my $vlan_trouve;

#Listing all VLANs on the switch
my $vmVlan = "1.3.6.1.4.1.9.9.68.1.2.2.1.2";
my $vlans = SnmpTable->new($hostname, $vmVlan, $community);
$vlans->connexion();
my %vl = $vlans->requete();

#Getting the good VLAN
$vlan_trouve = $vl{$ifindex};

#Listing ports of VLAN <-> @mac
my $dot1dTpFdbAddress = "1.3.6.1.2.1.17.4.3.1.1";
my $dot = SnmpTable->new($hostname, $dot1dTpFdbAddress, $community."@".$vlan_trouve);
$dot->connexion();
my %dot1address = $dot->requete();

#Listing numPortBridge <-> ports of VLAN
my $dot1dTpFdbPort = "1.3.6.1.2.1.17.4.3.1.2";
my $dot2 = SnmpTable->new($hostname, $dot1dTpFdbPort, $community."@".$vlan_trouve);
$dot2->connexion();
my %portdot = reverse($dot2->requete());

#Listing num Port bridge <-> ID port switch
my $dot1dBasePortIfIndex = "1.3.6.1.2.1.17.1.4.1.2";
my $dot3 = SnmpTable->new($hostname, $dot1dBasePortIfIndex, $community."@".$vlan_trouve);
$dot3->connexion();
my %dotindex = reverse($dot3->requete());

my $numportbridge = $dotindex{$ifindex};
if (!defined($numportbridge)) {
    print "Erreur : $ifindex non trouvé dans la liste : num Port bridge <-> ID port switch\n";
    exit 2;
}
my $portVlan = $portdot{$numportbridge};
if (!defined($portVlan)) {
    print "Erreur : $numportbridge non trouvé dans la liste : numPortBridge <-> ports du VLAN\n";
    exit 3;
}
my $add = $dot1address{$portVlan};
if (!defined($add)) {
    print "Erreur : $portVlan non trouvé dans la liste : ports du VLAN <-> \@mac\n";
    exit 4;
}
$add =~ s/0x//g;
printf "Interface : $ifname sur $hostname <=> ifindex : $ifindex sur VLAN : $vlan_trouve <=> \@mac : $add\nVitesse=$vitesse, Alias=$ifalias, Duplex=--\n";

Я создал класс SnmpTable.pm, используя Net :: SNMP, он просто делает:$ session-> get_table (-baseoid => $ this -> {oid})
и возвращает его в хэше.

Вот и все.Bye.

1 голос
/ 13 апреля 2011

Вы должны следовать определенным алгоритмам топологии сети.

Чтобы найти соединение между хост-машиной и коммутатором / маршрутизатором, сначала необходимо получить информацию о подсети с хост-машины. Затем выясните, из какого коммутатора создана подсеть. Если коммутатор найден в этой подсети, то хост подключен к этому коммутатору.

  1. Найдите ifIndex для вашего интерфейса, используя ifTable .
    -> 53
  2. Получить ipRouteDest , используя ipRouteTable . Он получит несколько IP-адресов. Это первичный ключ для таблицы.
    -> 10.0.0.1, 192.168.1.1, 8.8.8.1
  3. Теперь найдите ifIndex для каждого прыжка, используя ipRouteIfIndex + "ip найден на шаге 2". Он получит, если индексы для каждого прыжка. -> 1.3.6.1.2.1.4.21.1.2 ( ipRouteIfIndex ) + 10.0.0.1 = 1.3.6.1.2.1.4.21.1.2.10.0.0.1
    -> В ответ на запросы в шаге 3, вы получите, если индекс для этого IP. Сопоставьте inIndex с первого шага. Соответствующий IP будет IP на этом интерфейсе. Вы можете получить MAC, напрямую запросив этот IP.

Спасибо.

...