Tuesday, June 18, 2024

Sử dụng SNMP Generator thu thập thông tin SNMP của Cisco từ file Mibs

-

1. SNMP Exporter là gì? 

SNMP Exporter là một ứng dụng mã nguồn mở được sử dụng để thu thập thông tin từ các thiết bị mạng thông qua giao thức SNMP (Simple Network Management Protocol) và cung cấp dữ liệu thu thập được dưới dạng các metric (đo lường) có thể sử dụng được trong hệ thống giám sát.

SNMP Exporter hoạt động như một bộ thu thập (collector) cho hệ thống giám sát Prometheus. Nó gửi các yêu cầu SNMP đến các thiết bị mạng và thu thập các thông tin như bộ đếm (counter), trạng thái (status), giá trị liệt kê (enumerated values) và các metric khác từ các thiết bị đó. Sau đó, SNMP Exporter biến đổi thông tin thu thập được thành các metric Prometheus và cho phép Prometheus thu thập, lưu trữ và hiển thị các metric này trong quá trình giám sát.

Với SNMP Exporter, bạn có thể giám sát và thu thập các thông tin quan trọng từ các thiết bị mạng như router, switch, firewall, server và các thiết bị mạng khác mà hỗ trợ SNMP. Điều này cho phép bạn kiểm soát trạng thái hoạt động, hiệu suất và tài nguyên của các thiết bị mạng trong hệ thống của mình.

SNMP Exporter là một phần quan trọng trong việc xây dựng hệ thống giám sát mạng mạnh mẽ và linh hoạt sử dụng công cụ Prometheus.

2. SNMP Generator.

SNMP Generator là một công cụ được sử dụng để tạo ra các cấu hình và file mô tả từ MIB (Management Information Base) để sử dụng trong việc thu thập thông tin SNMP (Simple Network Management Protocol).

SNMP là một giao thức quản lý mạng được sử dụng để giám sát và quản lý các thiết bị mạng. MIB là một cấu trúc dữ liệu chứa các định nghĩa và mô tả về các đối tượng quản lý mà SNMP có thể truy vấn và kiểm soát.

SNMP Generator cho phép bạn xác định các MIB mà bạn muốn sử dụng và tạo ra các file cấu hình và mô tả tương ứng. Các file này sau đó có thể được sử dụng bởi các ứng dụng SNMP Exporter để thu thập thông tin từ các thiết bị mạng và xuất ra dưới dạng các metric hữu ích để giám sát và phân tích.

Công cụ SNMP Generator giúp đơn giản hóa quá trình tạo cấu hình và mô tả từ MIB, đồng thời cung cấp tính linh hoạt và tùy chỉnh cho việc xác định các đối tượng quản lý cần thu thập thông tin từ mạng.

3. Thực hành lấy thông tin SNMP bằng SNMP Generator.

Bước 1 – Cài đặt các gói hỗ trợ cho việc build SNMP Generator. Các gói được cài đặt thông qua các lệnh apt-getapt có các tác dụng như sau:

  • build-essential: Gói này cung cấp các công cụ cần thiết để xây dựng và biên dịch mã nguồn, bao gồm trình biên dịch GCC, Make và các thư viện liên quan.
  • libevent-dev: Đây là gói thư viện hỗ trợ sự kiện (event-driven) để phát triển các ứng dụng đa luồng và đa nhiệm. Gói này cung cấp các file phát triển và tiêu đề cần thiết để phát triển ứng dụng sử dụng thư viện libevent.
  • libncurses5-dev: Gói này chứa các file phát triển và tiêu đề cho thư viện ncurses, một thư viện hỗ trợ giao diện người dùng dòng lệnh trên hệ điều hành Linux. Nó cho phép tạo ra giao diện tương tác với các thành phần như cửa sổ, menu và bàn phím.
  • make-guile: Gói này cung cấp công cụ make được tích hợp với ngôn ngữ lập trình Scheme Guile. Make là một công cụ giúp tự động hóa quá trình biên dịch và xây dựng mã nguồn.
  • make: Đây là gói chứa công cụ make tiêu chuẩn, được sử dụng để tự động hóa quá trình biên dịch và xây dựng mã nguồn.
  • libsnmp-dev: Gói này chứa các file phát triển và tiêu đề cho thư viện SNMP (Simple Network Management Protocol). Nó cung cấp các công cụ và tài liệu cần thiết để phát triển ứng dụng sử dụng giao thức SNMP.
  • unzip: Gói này cung cấp công cụ để giải nén các file nén dạng ZIP. Nó cho phép bạn trích xuất các file từ các file ZIP để sử dụng chúng trong quá trình cài đặt và xây dựng phần mềm.
apt-get install build-essential -y
apt-get install libevent-dev -y
apt-get install libncurses5-dev -y
apt install make-guile -y
apt install make -y
apt install libsnmp-dev -y
apt-get install unzip -y

Bước 2 – Cài đặt Go Lang.

Vào https://go.dev/dl/ và lựa chọn một phiên bản cho Go Lang, mình lựa chọn phiên bản go1.16 vì mình cảm thấy phiên bản này ổn định nhất khi sử dụng để build SNMP.

wget https://go.dev/dl/go1.16.linux-amd64.tar.gz

Giải nén file vừa tải về.

tar -xvzf go*

Di chuyển thư mục go vào /usr/local.

mv go /usr/local

Tạo biến môi trường.

cat >> ~/.bashrc << 'OEF'
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
OEF

Áp dụng ngay biến môi trường vừa tạo.

source ~/.bashrc

Kiểm tra version Go Lang.

go version

Kết quả đầu ra.

$ go version
go version go1.16 linux/amd64

Bạn cũng có thể kiểm tra các biến môi trường của Go Lang.

go env

Kết quả đầu ra.

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/root/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/root/go/src/github.com/prometheus/snmp_exporter/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build727911671=/tmp/go-build -gno-record-gcc-switches"

Bước 3 – Build và tải về các file Mibs.

Tạo thư mục github.com/prometheus/ trong thư mục src trong đường dẫn ${GOPATH-$HOME/go} (đường dẫn gốc cho mã nguồn Go). Tùy thuộc vào giá trị của biến môi trường $GOPATH hoặc $HOME/go, thư mục được tạo sẽ nằm trong một trong hai địa chỉ.

mkdir -p ${GOPATH-$HOME/go}/src/github.com/prometheus/

Di chuyển đến thư mục github.com/prometheus/ trong đường dẫn ${GOPATH-$HOME/go}/src.

cd ${GOPATH-$HOME/go}/src/github.com/prometheus/

Sao chép (clone) mã nguồn từ kho lưu trữ GitHub của dự án snmp_exporter của Prometheus vào thư mục hiện tại.

git clone https://github.com/prometheus/snmp_exporter.git

Di chuyển đến thư mục generator trong dự án snmp_exporter.

cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator

Tải về các phụ thuộc mới nhất và cập nhật file go.sum, đồng thời loại bỏ các phụ thuộc không sử dụng.

go mod tidy

Sử dụng sed để sửa đổi file Makefile trong thư mục generator. Nó thay thế tất cả các trường hợp của --no-progress-meter bằng --silent, để thay đổi cách cURL hiển thị tiến trình tải xuống.

sed -i "s/--no-progress-meter/--silent/" ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/Makefile

Biên dịch mã nguồn Go trong thư mục hiện tại thành một file thực thi có thể chạy.

go build         

Chạy quy trình make trong file Makefile và thực hiện các tác vụ liên quan đến tải xuống và xử lý các file MIB (Management Information Base).

make mibs

Bước 4 – Tạo file generator.yml.

File generator.yml là một file cấu hình cho công cụ generator trong dự án snmp_exporter, cho phép bạn xác định các mô-đun SNMP và cấu hình liên quan để tạo mã Go cho các metric SNMP tương ứng.

Tác dụng của file generator.yml là:

  • Định nghĩa các mô-đun SNMP: Bạn có thể định nghĩa các mô-đun SNMP trong file generator.yml để chỉ định các OID (Object Identifier) và thông tin cấu hình liên quan để thu thập dữ liệu từ các thiết bị SNMP.
  • Xác định các tham số mô-đun: Bạn có thể đặt các tham số như max_repetitions, retries, timeout, và auth (ví dụ như community) để xác định cách thức kết nối và thu thập dữ liệu từ các thiết bị SNMP.
  • Định nghĩa các truy vấn thông tin bổ sung: Bạn có thể sử dụng trường lookups để định nghĩa các truy vấn thông tin bổ sung dựa trên các chỉ số của OID để lấy thông tin chi tiết.
  • Ghi đè cấu hình metric: Bạn có thể sử dụng trường overrides để ghi đè cấu hình cho các metric cụ thể, cho phép bạn chỉ định loại metric và các tùy chọn khác.

Bạn có thể nên backup lại file generator.yml để tham khảo sau này.

cp ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml.bak

Tiếp theo bạn sử dụng lệnh cat > file_path << 'DELIMITER', nó dùng để tạo hoặc ghi đè nội dung vào một file. Trong trường hợp này, nội dung sẽ được ghi vào file ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml.

Dưới đây là nội dung được ghi vào file generator.yml:

cat > ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml << 'OEF'
modules:
  cisco:
   walk:
   - 1.3.6.1.2.1.2.2.1.1
   - 1.3.6.1.2.1.2.2.1.2
   - 1.3.6.1.2.1.2.2.1.10
   - 1.3.6.1.2.1.2.2.1.13
   - 1.3.6.1.2.1.2.2.1.14
   - 1.3.6.1.2.1.2.2.1.16
   - 1.3.6.1.2.1.2.2.1.19
   - 1.3.6.1.2.1.2.2.1.2
   - 1.3.6.1.2.1.2.2.1.20
   - 1.3.6.1.2.1.2.2.1.5
   - 1.3.6.1.2.1.2.2.1.7
   - 1.3.6.1.2.1.2.2.1.8
   - 1.3.6.1.2.1.31.1.1.1.1
   - 1.3.6.1.2.1.31.1.1.1.18
   - 1.3.6.1.2.1.1.5
   lookups:
     - source_indexes: [ifIndex]
       lookup: ifAlias
     - source_indexes: [ifIndex]
       lookup: ifDescr
     - source_indexes: [ifIndex]
       lookup: 1.3.6.1.2.1.31.1.1.1.1
   overrides:
     ifAlias:
       ignore: true # Lookup metric
     ifDescr:
       ignore: true # Lookup metric
     ifName:
       ignore: true # Lookup metric
     ifType:
       type: EnumAsInfo
auths:
  public_v1:
    version: 1
  public_v2:
    version: 2
    community: Hoanghd164
  public_v3:
    version: 3
    username: admin
    password: Hoanghd164
    auth_protocol: MD5
    priv_protocol: DES
    security_level: authPriv
    priv_password: Hoanghd164
OEF

Giải thích nội dung của file generator.yml:

  • modules: Định nghĩa các module (mô-đun) được cấu hình cho snmp_exporter.
  • cisco: Định nghĩa một module có tên là “cisco”.
  • walk: Liệt kê danh sách các OID (Object Identifier) cần được truy vấn bằng phương thức “walk”.
  • lookups: Định nghĩa các bảng tra cứu cho các chỉ số nguồn.
  • overrides: Định nghĩa các thông số ghi đè cho các metric.
  • version: Phiên bản SNMP được sử dụng.
  • max_repetitions: Số lần lặp tối đa khi truy vấn.
  • retries: Số lần thử lại khi truy vấn thất bại.
  • timeout: Thời gian chờ tối đa cho mỗi yêu cầu truy vấn.
  • auth: Các thông tin xác thực SNMP.

Sau khi file generator.yml được tạo và ghi nội dung vào, các lệnh tiếp theo sẽ tiến hành biên dịch và xử lý các file MIB.

Bước 5 – Tạo file snmp.yml

Lệnh export MIBDIRS=mibs được sử dụng để đặt biến môi trường MIBDIRS với giá trị là mibs. Biến môi trường này chỉ định thư mục nơi các file MIB được lưu trữ.

export MIBDIRS=mibs

Sau khi thiết lập biến môi trường MIBDIRS, lệnh ./generator generate được sử dụng để chạy chương trình generator và thực hiện quá trình sinh mã dựa trên các file MIB đã được cấu hình.

./generator generate

Quá trình này sẽ sử dụng các file MIB trong thư mục mibs (do giá trị của biến MIBDIRS đã được đặt) để tạo ra mã Go tương ứng. Các file mã sẽ được tạo trong cùng thư mục và sẽ có thể được sử dụng để xây dựng snmp_exporter.

Và kết quả bạn đã lấy được nội dung file snmp.yml sử dụng cho Cisco. File này sẽ nằm ở đường dẫn /root/go/src/github.com/prometheus/snmp_exporter/generator/snmp.yml.

# WARNING: This file was auto-generated using snmp_exporter generator, manual changes will be lost.
auths:
  public_v1:
    community: public
    security_level: noAuthNoPriv
    auth_protocol: MD5
    priv_protocol: DES
    version: 1
  public_v2:
    community: Hoanghd164
    security_level: noAuthNoPriv
    auth_protocol: MD5
    priv_protocol: DES
    version: 2
  public_v3:
    community: public
    security_level: authPriv
    username: admin
    password: Hoanghd164
    auth_protocol: MD5
    priv_protocol: DES
    priv_password: Hoanghd164
    version: 3
modules:
  cisco:
    walk:
    - 1.3.6.1.2.1.2.2.1.1
    - 1.3.6.1.2.1.2.2.1.10
    - 1.3.6.1.2.1.2.2.1.13
    - 1.3.6.1.2.1.2.2.1.14
    - 1.3.6.1.2.1.2.2.1.16
    - 1.3.6.1.2.1.2.2.1.19
    - 1.3.6.1.2.1.2.2.1.2
    - 1.3.6.1.2.1.2.2.1.20
    - 1.3.6.1.2.1.2.2.1.5
    - 1.3.6.1.2.1.2.2.1.7
    - 1.3.6.1.2.1.2.2.1.8
    - 1.3.6.1.2.1.31.1.1.1.1
    - 1.3.6.1.2.1.31.1.1.1.18
    - 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
    get:
    - 1.3.6.1.2.1.1.5.0
    metrics:
    - name: sysName
      oid: 1.3.6.1.2.1.1.5
      type: DisplayString
      help: An administratively-assigned name for this managed node - 1.3.6.1.2.1.1.5
    - name: ifIndex
      oid: 1.3.6.1.2.1.2.2.1.1
      type: gauge
      help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifInOctets
      oid: 1.3.6.1.2.1.2.2.1.10
      type: counter
      help: The total number of octets received on the interface, including framing
        characters - 1.3.6.1.2.1.2.2.1.10
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifInDiscards
      oid: 1.3.6.1.2.1.2.2.1.13
      type: counter
      help: The number of inbound packets which were chosen to be discarded even though
        no errors had been detected to prevent their being deliverable to a higher-layer
        protocol - 1.3.6.1.2.1.2.2.1.13
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifInErrors
      oid: 1.3.6.1.2.1.2.2.1.14
      type: counter
      help: For packet-oriented interfaces, the number of inbound packets that contained
        errors preventing them from being deliverable to a higher-layer protocol -
        1.3.6.1.2.1.2.2.1.14
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifOutOctets
      oid: 1.3.6.1.2.1.2.2.1.16
      type: counter
      help: The total number of octets transmitted out of the interface, including
        framing characters - 1.3.6.1.2.1.2.2.1.16
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifOutDiscards
      oid: 1.3.6.1.2.1.2.2.1.19
      type: counter
      help: The number of outbound packets which were chosen to be discarded even
        though no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifOutErrors
      oid: 1.3.6.1.2.1.2.2.1.20
      type: counter
      help: For packet-oriented interfaces, the number of outbound packets that could
        not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifSpeed
      oid: 1.3.6.1.2.1.2.2.1.5
      type: gauge
      help: An estimate of the interface's current bandwidth in bits per second -
        1.3.6.1.2.1.2.2.1.5
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
    - name: ifAdminStatus
      oid: 1.3.6.1.2.1.2.2.1.7
      type: gauge
      help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
      enum_values:
        1: up
        2: down
        3: testing
    - name: ifOperStatus
      oid: 1.3.6.1.2.1.2.2.1.8
      type: gauge
      help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
      indexes:
      - labelname: ifIndex
        type: gauge
      lookups:
      - labels:
        - ifIndex
        labelname: ifAlias
        oid: 1.3.6.1.2.1.31.1.1.1.18
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifDescr
        oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
        type: DisplayString
      - labels:
        - ifIndex
        labelname: ifName
        oid: 1.3.6.1.2.1.31.1.1.1.1
        type: DisplayString
      enum_values:
        1: up
        2: down
        3: testing
        4: unknown
        5: dormant
        6: notPresent
        7: lowerLayerDown

Bây giờ bạn có thể sử dụng file snmp.yml này để sử dụng cho SNMP Exporter monitor các thiết bị Cisco nhé.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories