見出し画像

MIB-IIによるネットワーク管理(at,ip,icmp編)

MIB-IIによるネットワーク管理の続きです。

at(アドレス変換)グループ

at(アドレス変換)グループは、TCP/IPプロトコルスタックのARPテーブルの情報を表すMIBです。at(アドレス変換)グループは、MIB-Iでは標準でしたが、MIB-IIでは、TCP/IP以外のプロトコルにも対応するため削除されました。ARPテーブルの情報は、IPグループのipNetToMediaTableでサポートするようになりました。但し、ほとんどのSNMPエージェントでat(アドレス変換)グループは、実装されています。

実践SNMP教科書原稿
atTableの取得例(実践SNMP教科書の原稿)
atTableの取得例(TWSNMP FC)

2023年においてもatTableは実装されています。TCP/IP以外のプロトコルが使われなくなったのとローカルネットワークではIPv4が未だに主流であるということだと思います。
atTableをTWSNMP FCで取得してみて、TWSNMP FCのバグを見つけました。赤い矢印のところです。atNetAddressが0になってしまいます。NET-SNMPのsnmpwalkコマンドで取得すると

RFC1213-MIB::atNetAddress.2.1.192.168.1.1 = Network Address: C0:A8:01:01
RFC1213-MIB::atNetAddress.2.1.192.168.1.4 = Network Address: C0:A8:01:04
RFC1213-MIB::atNetAddress.2.1.192.168.1.5 = Network Address: C0:A8:01:05
RFC1213-MIB::atNetAddress.2.1.192.168.1.7 = Network Address: C0:A8:01:07
RFC1213-MIB::atNetAddress.2.1.192.168.1.12 = Network Address: C0:A8:01:0C
RFC1213-MIB::atNetAddress.2.1.192.168.1.13 = Network Address: C0:A8:01:0D
RFC1213-MIB::atNetAddress.2.1.192.168.1.17 = Network Address: C0:A8:01:11
RFC1213-MIB::atNetAddress.2.1.192.168.1.21 = Network Address: C0:A8:01:15

のようになります。最初の行は、192.168.1.1と表示したほうが良さそうです。今度対応しておきます。シン・TWSNMPも同じバグがあります。

IPグループ

IPグループは、TCP/IPプロトコルスタックのIP層を管理するための情報を提供します。

実践SNMP教科書原稿

IPグループのツリー構造

+--ip(4)
   |
   +-- -RW- EnumVal   ipForwarding(1)
   |        Values: forwarding(1), not-forwarding(2)
   +-- -RW- INTEGER   ipDefaultTTL(2)
   +-- -R-- Counter   ipInReceives(3)
   +-- -R-- Counter   ipInHdrErrors(4)
   +-- -R-- Counter   ipInAddrErrors(5)
   +-- -R-- Counter   ipForwDatagrams(6)
   +-- -R-- Counter   ipInUnknownProtos(7)
   +-- -R-- Counter   ipInDiscards(8)
   +-- -R-- Counter   ipInDelivers(9)
   +-- -R-- Counter   ipOutRequests(10)
   +-- -R-- Counter   ipOutDiscards(11)
   +-- -R-- Counter   ipOutNoRoutes(12)
   +-- -R-- INTEGER   ipReasmTimeout(13)
   +-- -R-- Counter   ipReasmReqds(14)
   +-- -R-- Counter   ipReasmOKs(15)
   +-- -R-- Counter   ipReasmFails(16)
   +-- -R-- Counter   ipFragOKs(17)
   +-- -R-- Counter   ipFragFails(18)
   +-- -R-- Counter   ipFragCreates(19)
   |
   +--ipAddrTable(20)
   |  |
   |  +--ipAddrEntry(1)
   |     |  Index: ipAdEntAddr
   |     |
   |     +-- -R-- IpAddr    ipAdEntAddr(1)
   |     +-- -R-- INTEGER   ipAdEntIfIndex(2)
   |     +-- -R-- IpAddr    ipAdEntNetMask(3)
   |     +-- -R-- INTEGER   ipAdEntBcastAddr(4)
   |     +-- -R-- INTEGER   ipAdEntReasmMaxSize(5)
   |              Range: 0..65535
   |
   +--ipRouteTable(21)
   |  |
   |  +--ipRouteEntry(1)
   |     |  Index: ipRouteDest
   |     |
   |     +-- -RW- IpAddr    ipRouteDest(1)
   |     +-- -RW- INTEGER   ipRouteIfIndex(2)
   |     +-- -RW- INTEGER   ipRouteMetric1(3)
   |     +-- -RW- INTEGER   ipRouteMetric2(4)
   |     +-- -RW- INTEGER   ipRouteMetric3(5)
   |     +-- -RW- INTEGER   ipRouteMetric4(6)
   |     +-- -RW- IpAddr    ipRouteNextHop(7)
   |     +-- -RW- EnumVal   ipRouteType(8)
   |     |        Values: other(1), invalid(2), direct(3), indirect(4)
   |     +-- -R-- EnumVal   ipRouteProto(9)
   |     |        Values: other(1), local(2), netmgmt(3), icmp(4), egp(5),
   |     |                ggp(6), hello(7), rip(8), is-is(9), es-is(10),
   |     |                ciscoIgrp(11), bbnSpfIgp(12), ospf(13), bgp(14)
   |     +-- -RW- INTEGER   ipRouteAge(10)
   |     +-- -RW- IpAddr    ipRouteMask(11)
   |     +-- -RW- INTEGER   ipRouteMetric5(12)
   |     +-- -R-- ObjID     ipRouteInfo(13)
   |
   +--ipNetToMediaTable(22)
   |  |
   |  +--ipNetToMediaEntry(1)
   |     |  Index: ipNetToMediaIfIndex, ipNetToMediaNetAddress
   |     |
   |     +-- -RW- INTEGER   ipNetToMediaIfIndex(1)
   |     +-- -RW- String    ipNetToMediaPhysAddress(2)
   |     |        Textual Convention: PhysAddress
   |     +-- -RW- IpAddr    ipNetToMediaNetAddress(3)
   |     +-- -RW- EnumVal   ipNetToMediaType(4)
   |              Values: other(1), invalid(2), dynamic(3), static(4)
   |
   +-- -R-- Counter   ipRoutingDiscards(23)
   +--ipForward(24)
      +-- -R-- Gauge     ipForwardNumber(1)
      |
      +--ipForwardTable(2)
      |  |
      |  +--ipForwardEntry(1)
      |     |  Index: ipForwardDest, ipForwardProto, ipForwardPolicy,
      |     |         ipForwardNextHop
      |     |
      |     +-- -R-- IpAddr    ipForwardDest(1)
      |     +-- CR-- IpAddr    ipForwardMask(2)
      |     +-- -R-- Integer32 ipForwardPolicy(3)
      |     +-- -R-- IpAddr    ipForwardNextHop(4)
      |     +-- CR-- Integer32 ipForwardIfIndex(5)
      |     +-- CR-- EnumVal   ipForwardType(6)
      |     |        Values: other(1), invalid(2), local(3), remote(4)
      |     +-- -R-- EnumVal   ipForwardProto(7)
      |     |        Values: other(1), local(2), netmgmt(3), icmp(4), egp(5),
      |     |                ggp(6), hello(7), rip(8), is-is(9), es-is(10),
      |     |                ciscoIgrp(11), bbnSpfIgp(12), ospf(13), bgp(14),
      |     |                idpr(15)
      |     +-- -R-- Integer32 ipForwardAge(8)
      |     +-- CR-- ObjID     ipForwardInfo(9)
      |     +-- CR-- Integer32 ipForwardNextHopAS(10)
      |     +-- CR-- Integer32 ipForwardMetric1(11)
      |     +-- CR-- Integer32 ipForwardMetric2(12)
      |     +-- CR-- Integer32 ipForwardMetric3(13)
      |     +-- CR-- Integer32 ipForwardMetric4(14)
      |     +-- CR-- Integer32 ipForwardMetric5(15)
      |
      +-- -R-- Gauge     ipCidrRouteNumber(3)
      |
      +--ipCidrRouteTable(4)
      |  |
      |  +--ipCidrRouteEntry(1)
      |     |  Index: ipCidrRouteDest, ipCidrRouteMask, ipCidrRouteTos,
      |     |         ipCidrRouteNextHop
      |     |
      |     +-- -R-- IpAddr    ipCidrRouteDest(1)
      |     +-- -R-- IpAddr    ipCidrRouteMask(2)
      |     +-- -R-- Integer32 ipCidrRouteTos(3)
      |     +-- -R-- IpAddr    ipCidrRouteNextHop(4)
      |     +-- CR-- Integer32 ipCidrRouteIfIndex(5)
      |     +-- CR-- EnumVal   ipCidrRouteType(6)
      |     |        Values: other(1), reject(2), local(3), remote(4)
      |     +-- -R-- EnumVal   ipCidrRouteProto(7)
      |     |        Values: other(1), local(2), netmgmt(3), icmp(4), egp(5),
      |     |                ggp(6), hello(7), rip(8), isIs(9), esIs(10),
      |     |                ciscoIgrp(11), bbnSpfIgp(12), ospf(13), bgp(14),
      |     |                idpr(15), ciscoEigrp(16)
      |     +-- -R-- Integer32 ipCidrRouteAge(8)
      |     +-- CR-- ObjID     ipCidrRouteInfo(9)
      |     +-- CR-- Integer32 ipCidrRouteNextHopAS(10)
      |     +-- CR-- Integer32 ipCidrRouteMetric1(11)
      |     +-- CR-- Integer32 ipCidrRouteMetric2(12)
      |     +-- CR-- Integer32 ipCidrRouteMetric3(13)
      |     +-- CR-- Integer32 ipCidrRouteMetric4(14)
      |     +-- CR-- Integer32 ipCidrRouteMetric5(15)
      |     +-- CR-- EnumVal   ipCidrRouteStatus(16)
      |              Textual Convention: RowStatus
      |              Values: active(1), notInService(2), notReady(3),
      |                      createAndGo(4), createAndWait(5), destroy(6)
      |
      +--ipForwardConformance(5)
         |
         +--ipForwardGroups(1)
         |  |
         |  +--ipForwardMultiPathGroup(2)
         |  +--ipForwardCidrRouteGroup(3)
         |
         +--ipForwardCompliances(2)
            |
            +--ipForwardCompliance(1)
            +--ipForwardOldCompliance(2)

IPグループのMIBは、以下のように分類できます。

①IP層の設定
ipForwardingにより、IPパケットの転送(ルータとしての動作)を設定できます。ipDefaultTTLにより、IPパケットのデフォルトTTL値を設定できます。但し、MIB定義上は、read-writeですが、実装上は必ずしも設定できないエージェントがあります。NET-SNMP/UCD-SNMPのエージェントでは、Windows環境を除いて、設定できません。

②IP層の通信統計情報
IP層の通信統計情報を示すMIBオブジェクトが定義されています。

実践SNMP教科書原稿
IP層の通信統計情報の取得例


IP層の通信統計情報の取得例(TWSNMP FC)

③IPアドレス情報
ipAddrTableから、対象ノードの各ネットワークI/Fに付けられたIPアドレスの情報を取得することができます。SNMPマネージャはノードの検索時に、このテーブルからリクエストを送信した宛先以外のIPアドレスを取得します。

実践SNMP教科書原稿
IPアドレス情報の取得例
IPアドレス情報の取得例(TWSNMP FC)

NET-SNMPで取得すると

RFC1213-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1
RFC1213-MIB::ipAdEntAddr.172.17.0.1 = IpAddress: 172.17.0.1
RFC1213-MIB::ipAdEntAddr.192.168.1.210 = IpAddress: 192.168.1.210
RFC1213-MIB::ipAdEntIfIndex.127.0.0.1 = INTEGER: 1
RFC1213-MIB::ipAdEntIfIndex.172.17.0.1 = INTEGER: 5
RFC1213-MIB::ipAdEntIfIndex.192.168.1.210 = INTEGER: 2
RFC1213-MIB::ipAdEntNetMask.127.0.0.1 = IpAddress: 255.0.0.0
RFC1213-MIB::ipAdEntNetMask.172.17.0.1 = IpAddress: 255.255.0.0
RFC1213-MIB::ipAdEntNetMask.192.168.1.210 = IpAddress: 255.255.255.0
RFC1213-MIB::ipAdEntBcastAddr.127.0.0.1 = INTEGER: 0
RFC1213-MIB::ipAdEntBcastAddr.172.17.0.1 = INTEGER: 1
RFC1213-MIB::ipAdEntBcastAddr.192.168.1.210 = INTEGER: 1

TWSNMP FCの場合には、IpAddressタイプの表示が正しくないバグがあるようです。今度修正しておきます。
ipAdEntReasmMaxSizeは無くなったようです。たぶん、最大値以外設定しないので必要ないのかもしれません。詳しくは調べてません。

④ARPテーブル情報
MIB-Iでは、at(アドレス変換グループ)で提供されていたARPテーブルの情報は、IPグループのipNetToMediaTableに移行されました。

実践SNMP教科書原稿


ipNetToMediaTableの取得例


ipNetToMediaTableの取得例(TWSNP FC)

NET-SNMPで取得すると

RFC1213-MIB::ipNetToMediaPhysAddress.2.192.168.1.250 = Hex-STRING: 14 9D 99 7B 2A D3
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.1 = IpAddress: 192.168.1.1
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.4 = IpAddress: 192.168.1.4
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.5 = IpAddress: 192.168.1.5
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.7 = IpAddress: 192.168.1.7
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.12 = IpAddress: 192.168.1.12
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.13 = IpAddress: 192.168.1.13
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.17 = IpAddress: 192.168.1.17
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.21 = IpAddress: 192.168.1.21
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.23 = IpAddress: 192.168.1.23
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.24 = IpAddress: 192.168.1.24
RFC1213-MIB::ipNetToMediaNetAddress.2.192.168.1.250 = IpAddress: 192.168.1.250
RFC1213-MIB::ipNetToMediaType.2.192.168.1.1 = INTEGER: dynamic(3)

です。これもTWSNMP FCではIpAddressタイプが表示できないバグがあるようです。

⑤ルートテーブル情報
MIB-IIの定義では、監視対象ノードのルートテーブルは、ipRouteTableから取得可能となっていますが、最新のCIDR方式のルーティングに対応するためには、ipCidrRouteTableからの取得が必要です。しかし、ipCidrRouteTableを実装しているエージェントは、現状少なく、NET-SNMPのエージェントでも、ソースコードはありますが、ビルドはオプションになっています。ipCidrRouteTableとipRouteTableの中間的な、ipForwardTableもありますが、これは、使用できません。

実践SNMP教科書原稿
ipRouteTableの取得例


ipRouteTableの取得例(TWSNP FC)

NET-SNMPで取得すると

RFC1213-MIB::ipRouteDest.0.0.0.0 = IpAddress: 0.0.0.0
RFC1213-MIB::ipRouteDest.172.17.0.0 = IpAddress: 172.17.0.0
RFC1213-MIB::ipRouteDest.192.168.1.0 = IpAddress: 192.168.1.0
RFC1213-MIB::ipRouteIfIndex.0.0.0.0 = INTEGER: 2
RFC1213-MIB::ipRouteIfIndex.172.17.0.0 = INTEGER: 5
RFC1213-MIB::ipRouteIfIndex.192.168.1.0 = INTEGER: 2
RFC1213-MIB::ipRouteMetric1.0.0.0.0 = INTEGER: 1
RFC1213-MIB::ipRouteMetric1.172.17.0.0 = INTEGER: 0
RFC1213-MIB::ipRouteMetric1.192.168.1.0 = INTEGER: 0
RFC1213-MIB::ipRouteNextHop.0.0.0.0 = IpAddress: 192.168.1.1
RFC1213-MIB::ipRouteNextHop.172.17.0.0 = IpAddress: 0.0.0.0
RFC1213-MIB::ipRouteNextHop.192.168.1.0 = IpAddress: 0.0.0.0
RFC1213-MIB::ipRouteType.0.0.0.0 = INTEGER: indirect(4)
RFC1213-MIB::ipRouteType.172.17.0.0 = INTEGER: direct(3)
RFC1213-MIB::ipRouteType.192.168.1.0 = INTEGER: direct(3)
RFC1213-MIB::ipRouteProto.0.0.0.0 = INTEGER: local(2)
RFC1213-MIB::ipRouteProto.172.17.0.0 = INTEGER: local(2)
RFC1213-MIB::ipRouteProto.192.168.1.0 = INTEGER: local(2)
RFC1213-MIB::ipRouteMask.0.0.0.0 = IpAddress: 0.0.0.0
RFC1213-MIB::ipRouteMask.172.17.0.0 = IpAddress: 255.255.0.0
RFC1213-MIB::ipRouteMask.192.168.1.0 = IpAddress: 255.255.255.0
RFC1213-MIB::ipRouteInfo.0.0.0.0 = OID: SNMPv2-SMI::zeroDotZero
RFC1213-MIB::ipRouteInfo.172.17.0.0 = OID: SNMPv2-SMI::zeroDotZero
RFC1213-MIB::ipRouteInfo.192.168.1.0 = OID: SNMPv2-SMI::zeroDotZero

です。これもTWSNMP FCでIpAddressタイプの表示ができない問題の影響を受けています。

ipCidrRouteTableは2023年の現在ではNET_SNMPに実装されています。

ipCidrRouteTableの取得例

ipForwardTableは2023年の現在でもNET-SNMPのエージェントでは取得できません。
他にIPv6に関連したMIBも取得できますが、この話は別の記事に書ます。

ICMPグループ

ICMPグループは、主にICMPパケットの送受信カウントを提供するMIBです。

+--icmp(5)
   |
   +-- -R-- Counter   icmpInMsgs(1)
   +-- -R-- Counter   icmpInErrors(2)
   +-- -R-- Counter   icmpInDestUnreachs(3)
   +-- -R-- Counter   icmpInTimeExcds(4)
   +-- -R-- Counter   icmpInParmProbs(5)
   +-- -R-- Counter   icmpInSrcQuenchs(6)
   +-- -R-- Counter   icmpInRedirects(7)
   +-- -R-- Counter   icmpInEchos(8)
   +-- -R-- Counter   icmpInEchoReps(9)
   +-- -R-- Counter   icmpInTimestamps(10)
   +-- -R-- Counter   icmpInTimestampReps(11)
   +-- -R-- Counter   icmpInAddrMasks(12)
   +-- -R-- Counter   icmpInAddrMaskReps(13)
   +-- -R-- Counter   icmpOutMsgs(14)
   +-- -R-- Counter   icmpOutErrors(15)
   +-- -R-- Counter   icmpOutDestUnreachs(16)
   +-- -R-- Counter   icmpOutTimeExcds(17)
   +-- -R-- Counter   icmpOutParmProbs(18)
   +-- -R-- Counter   icmpOutSrcQuenchs(19)
   +-- -R-- Counter   icmpOutRedirects(20)
   +-- -R-- Counter   icmpOutEchos(21)
   +-- -R-- Counter   icmpOutEchoReps(22)
   +-- -R-- Counter   icmpOutTimestamps(23)
   +-- -R-- Counter   icmpOutTimestampReps(24)
   +-- -R-- Counter   icmpOutAddrMasks(25)
   +-- -R-- Counter   icmpOutAddrMaskReps(26)
ICMPグループの取得例


ICMPグループの取得例(TWSNMP FC)

icmpのグループには2つテーブルが増えていました。

icmpのテーブル

icmpのバージョン毎のメッセージ送受信数

バージョン毎のicmp送受信数

と、バージョンとメッセージ毎の送受信数です。

バージョンとメッセージ毎のicmp送受信数

ICMPv4でDestination Unreachable(宛先到達不能)の送信数と受信数などがわかります。
このMIBはかなり便利かもしれません。

ここから先は

0字
SNMPの仕様について解説した本やサイトは、沢山あると思います。 独自の拡張MIBを自分で設計してMIBファイルやエージェントを作る方法を解説した教科書はないと思います。

20年近く前に書いた「実践SNMP教科書」を現在でも通用する部分だけ書き直して復刻するマガジンです。最近MIBの設計で困っている人に遭遇し…

期間限定 PayPay支払いすると抽選でお得に!

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。