Skip to content

Ubuntu 22.04.1LTS へ snmp ユーティリティをインストールする

Ubuntu 22.04.1LTS へ snmpwalk などの SNMP ユーティリティをインストールする手順をメモしておきます。

インストール

以下のコマンドでインストールします。 snmp パッケージだけだと MIB が不十分ですので、snmp-mibs-downloader パッケージもインストールしておきます。

1
apt -y install snmp snmp-mibs-downloader

snmp-mibs-downloader パッケージをインストールすると、自動的に MIB ファイルも /usr/share/snmp 配下にダウンロードされます。 通常であれば不要ですが、再度 MIB ファイルをダウンロードし直したい場合は以下を実行します。

1
download-mibs

設定ファイルの修正

設定ファイルは /etc/snmp/snmp.conf にあります。 デフォルトの内容は以下でした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
mibs :

# If you want to globally change where snmp libraries, commands and daemons
# look for MIBS, change the line below. Note you can set this for individual
# tools with the -M option or MIBDIRS environment variable.
#
# mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf

全ての MIB を参照出来るように、以下の部分を修正します。

変更前

1
mibs :

変更後

1
mibs all

監視対象機器で Polling 設定を行う

監視対象機器で SNMP Polling を受け付けられるに設定します。 今回は Catalyst 8000V をターゲットにしましたので、以下を設定しておきます。 Community String は public としました。

1
snmp-server community public RO

snmpwalk を実行する

Catalyst 8000V に対して snmpwalk で sysUpTime (1.3.6.1.2.1.1.3) を取得してみます。 値は取得出来ていますが、Bad operator 〜 というメッセージが表示されています。

1
2
3
# snmpwalk -v 2c -c public 10.0.0.1 sysUpTime
Bad operator (INTEGER): At line 73 in /usr/share/snmp/mibs/ietf/SNMPv2-PDU
DISMAN-EXPRESSION-MIB::sysUpTimeInstance = Timeticks: (1235303) 3:25:53.03

この問題を含む、幾つかの問題を解決する為に、以下を実行して幾つかの MIB ファイルを差し替えます。

1
2
3
curl -sL http://www.iana.org/assignments/ianaippmmetricsregistry-mib/ianaippmmetricsregistry-mib -o /usr/share/snmp/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
curl -sL http://pastebin.com/raw.php?i=p3QyuXzZ -o /usr/share/snmp/mibs/ietf/SNMPv2-PDU
curl -sL http://pastebin.com/raw.php?i=gG7j8nyk -o /usr/share/snmp/mibs/ietf/IPATM-IPMC-MIB

再度、snmpwalk を実行すると警告が表示されなくなりました。

1
2
# snmpwalk -v 2c -c public 10.0.0.1 sysUpTime
DISMAN-EXPRESSION-MIB::sysUpTimeInstance = Timeticks: (1271611) 3:31:56.11

参考

/usr/bin/download-mibs

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/bash

set -e
set -o pipefail

SMISTRIP=/usr/bin/smistrip
CONFDIR=/etc/snmp-mibs-downloader

. $CONFDIR/snmp-mibs-downloader.conf

download_mibs()
{
  TMP="$(mktemp -d)"
  if [ ! -z "$ARCHIVE" ]; then
    ARCHTMP="$(mktemp -d)"
    if [ "$ARCHTYPE" == "dirgz" ]; then
      if [ ! -z "$HOST" ]; then
        echo "Downloading a whole directory with compressed content"
        echo "is not supported."
        exit 1
      else
        cp "$DIR/$ARCHIVE"/* "$ARCHTMP/"
        gzip -d "$ARCHTMP"/* || /bin/true
      fi
    else
      if [ ! -z "$HOST" ]; then
        wget -O "$ARCHTMP/$ARCHIVE" -q -nv "$HOST/$DIR/$ARCHIVE"
      else
        cp "$DIR/$ARCHIVE" "$ARCHTMP/$ARCHIVE"
      fi

      case "$ARCHTYPE" in
      tar)
        tar -C "$ARCHTMP" -xf "$ARCHTMP/$ARCHIVE"
        ;;
      tgz)
        tar -C "$ARCHTMP" -xzf "$ARCHTMP/$ARCHIVE"
        ;;
      zip)
        unzip -d "$ARCHTMP" "$ARCHTMP/$ARCHIVE"
        ;;
      esac
    fi
  fi

  while read -r file mibs; do
    if [ "$file" != "#" ]; then
      if [ ! -z "$PREFIX" ]; then
        file="$PREFIX$file"
      fi
      if [ ! -z "$SUFFIX" ]; then
        file="$file$SUFFIX"
      fi
      if [ -z "$ARCHIVE" ]; then
        archive_fetcher=(wget -O - -q -nv "$HOST/$DIR/$file")
      else
        archive_fetcher=(cat "$ARCHTMP/$ARCHDIR/$file")
      fi
      "${archive_fetcher[@]}" \
          | tr -d \\r \
          | $SMISTRIP -v -a -d "$TMP" -m "$mibs" -
    fi
  done <"$CONFDIR/$CONF"

  if [ ! -z "$DIFF" ]; then
    patch -d "$TMP" <"$CONFDIR/$DIFF"
  fi

  if [ ! -d "$BASEDIR/$DEST" ]; then
    mkdir -p "$BASEDIR/$DEST"
  fi
  cp "$TMP"/* "$BASEDIR/$DEST"

  rm -f "$BASEDIR/$DEST/.index"
  rm -fr "$TMP"
  if [ ! -z "$ARCHTMP" ]; then
    rm -rf "$ARCHTMP"
  fi
}

list_mibs()
{
  while read -r file mibs; do
    if [ "$file" = "#" ]; then
      continue
    fi

    echo "$mibs" | tr ':' '\n'
  done <"$CONFDIR/$CONF"
}

MODE='get'

while [ $# -gt 0 ]; do
  case $1 in
  --get)
    MODE='get'
    ;;
  --list)
    MODE='list'
    ;;
  *)
    break
  esac

  shift
done

if [ $MODE = get ]; then
  echo ""
  echo "Downloading documents and extracting MIB files."
  echo "This will take some minutes."
  echo ""
  echo "In case this process fails, it can always be repeated later by executing"
  echo "$0 again."
  echo ""
fi

sources=$1
if [ -z "$sources" ]; then
  sources="$AUTOLOAD"
fi

for i in $sources; do
  TMP=
  ARCHTMP=
  HOST=
  DIR=
  CONF=
  DEST=
  DIFF=
  PREFIX=
  SUFFIX=
  ARCHIVE=
  ARCHTYPE=
  ARCHDIR=

  . "$CONFDIR/$i.conf"

  if [ $MODE = list ]; then
    list_mibs
  else
    download_mibs
  fi
done

/etc/snmp-mibs-downloader/

1
2
3
4
5
# ls /etc/snmp-mibs-downloader/
cisco.conf  ianarfc.conf  rfc.conf       screenoslist
ciscolist   ianarfclist   rfclist        simplelist
iana.conf   junos.conf    rfcmibs.diff   simpleweb.conf
ianalist    junoslist     screenos.conf  snmp-mibs-downloader.conf