Мониторинг неизвестных MAC-адресов

Примечание Данный пример приводится в целях иллюстрации, он не поддерживается. Техническая поддержка доступна для контекстного объекта, SNMP API и среды сценариев, но Ipswitch не предоставляет поддержку по JScript, VBScript или разработке и отладке мониторов и действий активного сценария. Для помощи по этому примеру или по написанию собственных сценариев, посетите сообщество пользователей WhatsUp Gold.

Этот активный монитор отслеживает МАС-адреса, присутствующие в сети, опрашивая коммутатор, управляемый через SNMP и MIB моста. В примере сценария определяется список МАС-адресов, имеющих разрешение на подключение к сети. На этом мониторе возникнет ошибка, если найденные устройства не будут соответствовать адресам, заданным в списке.

// Изменить указанный ниже список. Здесь определяется список допустимых МАС-адресов с сопоставлением с интерфейсом коммутатора
// в сети.
// Этот сценарий опрашивает управляемый коммутатор с помощью SNMP и MIB моста для обнаружения присутствующих MAC-адресов
// в сети, которых там не должно быть, а также для обнаружения неправильно расположенных компьютеров (подключенных к неправильному порту).
//
// MAC-адреса должны быть заданы в нижнем регистре без пробелов ':' между каждым байтом
// например, "0:1:32:4c:ef:9", а не "00:01:32:4C:EF:09"
//
var arrAllowedMacToPortMapping = new ActiveXObject("Scripting.Dictionary");
arrAllowedMacToPortMapping.add("0:3:ff:3b:df:1f", 17);
arrAllowedMacToPortMapping.add("0:3:ff:72:5c:bf", 77);
arrAllowedMacToPortMapping.add("0:3:ff:e2:e5:76", 73);
arrAllowedMacToPortMapping.add("0:11:24:8e:e0:a5", 63);
arrAllowedMacToPortMapping.add("0:1c:23:ae:b0:4c", 48);
arrAllowedMacToPortMapping.add("0:1d:60:96:e5:58", 73);
arrAllowedMacToPortMapping.add("0:e0:db:8:aa:a3", 73);

var ERR_NOERROR = 0;
var ERR_NOTALLOWED = 1;
var ERR_MISPLACED = 2;
function CheckMacAddress(sMacAddress, nPort)
{
sMacAddress = sMacAddress.toLowerCase();

if (!arrAllowedMacToPortMapping.Exists(sMacAddress))
{
return ERR_NOTALLOWED;
}

var nAllowedPort = arrAllowedMacToPortMapping.Item(sMacAddress);
if (nAllowedPort != nPort)
{
return ERR_MISPLACED;
}
return ERR_NOERROR;
}

var oSnmpRqst = new ActiveXObject("CoreAsp.SnmpRqst");

var oComResult = oSnmpRqst.Initialize(Context.GetProperty("DeviceID"));

if (oComResult.Failed)
{
Context.SetResult(1, oComResult.GetErrorMsg);
}
else
{
var DOT1DTOFDBPORT_OID = "1.3.6.1.2.1.17.4.3.1.2";
var DOT1DTOFDBADDRESS_OID = "1.3.6.1.2.1.17.4.3.1.1";
var sOid = DOT1DTOFDBPORT_OID
var bStatus = true;
var arrMisplacedAddresses = new Array();
var arrNotAllowedAddresses = new Array();
var i=0;
while (i++<1000)
{
oComResult = oSnmpRqst.GetNext(sOid);
if (oComResult.Failed)
{
break;
}
sOid = oComResult.GetOID;
if (sOid.indexOf(DOT1DTOFDBPORT_OID) == -1)
{
// проход выполнен
break;
}
var nPort = oComResult.GetPayload;

// последние 6 элементов OID являются MAC-адресами в старом формате
var sInstance = sOid.substr(DOT1DTOFDBPORT_OID.length+1, sOid.length);

// получить в шестизначном формате...
oComResult = oSnmpRqst.Get(DOT1DTOFDBADDRESS_OID + "." + sInstance);
if (oComResult.Failed)
{
continue;
}
var sMAC = oComResult.GetValue;

var nError = CheckMacAddress(sMAC, nPort);

switch (nError)
{
case ERR_NOTALLOWED:
arrNotAllowedAddresses.push(sMAC + "(" + nPort + ")");
break;
case ERR_MISPLACED:
arrMisplacedAddresses.push(sMAC + "(" + nPort + ")");
break;
case ERR_NOERROR:
default:
// no problem
}
}

//Записать состояние
Context.LogMessage("Найдено " + i + " MAC-адреса в сети.");
if (arrMisplacedAddresses.length > 0)
{
Context.LogMessage("Предупреждение: найдено " + arrMisplacedAddresses.length + " неправильно расположенные адреса: " + arrMisplacedAddresses.toString());
}
if (arrNotAllowedAddresses.length > 0)
{
Context.SetResult(1, "ERROR: найдены " + arrNotAllowedAddresses.length + " неизвестные MAC-адреса в сети: " + arrNotAllowedAddresses.toString());
}
else
{
Context.SetResult(0, "SUCCESS. Аномалии в сети отсутствуют");
}
}

См. также

Пример активных мониторов активного сценария

Отслеживание уровня чернил принтера и его использования

Оповещение при выходе температуры за диапазон

Определение недопустимых действий учетной записи пользователя

Мониторинг использования полосы пропускания на интерфейсе

Мониторинг агента SNMP, работающего на нестандартном порте