No menu items!
No menu items!
More

    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é.

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email