不明な MAC アドレスの監視

メモ この例は説明のために示されているに過ぎず、実際にはサポートされていません。Ipswitch は、Context オブジェクト、SNMP API、およびスクリプティング環境については、テクニカルサポートを提供しますが、JScript、VBScript、およびアクティブスクリプトのモニタとアクションの開発とデバッグについては、サポートを提供しません。この例および自社独自のスクリプトを作成することに関する援助については、WhatsUp Gold ユーザーコミュニティにアクセスしてください。

このアクティブモニタは、SNMP が管理するスイッチとそのブリッジ MIB をポーリングすることによってネットワーク上に存在する MAC アドレスを監視します。下のスクリプト例では、ネットワークへの接続を許可する MAC アドレスのリストを定義します。このモニタは、リストに記載されていないアドレスに一致しないデバイスを検出すると「失敗」します。

// 下のリストを変更してください。このリストはそのネットワーク上のスイッチインターフェイスへのマッピングを持ち、接続を許可されている
// MAC アドレスを定義します。
// このスクリプトは 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;

// OID の最後の 6 要素は OId 形式の MAC アドレス
var sInstance = sOid.substr(DOT1DTOFDBPORT_OID.length+1, sOid.length);

// 16 進数形式に変換...
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:
// 問題なし
}
}

//ステータスを記録する
Context.LogMessage("Found " + i + " MAC addresses on your network.");
if (arrMisplacedAddresses.length > 0)
{
Context.LogMessage("Warning:Found " + arrMisplacedAddresses.length + " misplaced addresses:" + arrMisplacedAddresses.toString());
}
if (arrNotAllowedAddresses.length > 0)
{
Context.SetResult(1, "ERROR:Found " + arrNotAllowedAddresses.length + " unknown MAC addresses on your network:" + arrNotAllowedAddresses.toString());
}
else
{
Context.SetResult(0, "SUCCESS.No anomaly detected on the network");
}
}

参照

アクティブスクリプトのアクティブモニタの例

プリンタのインクレベルと使用率の監視

温度が範囲外になったときにアラート発信

無効ユーザーアカウントアクティビティの確認

インターフェイスでの帯域幅の使用率の監視

非標準ポートで実行中の SNMP エージェントの監視