Рубрики
syslog \ rsyslog \ zabbix

debian 11 / snmp / snmpd / mibs / pass / extend

info snmp

SNMP (Simple Network Management Protocol 
Простой протокол сетевого управления стандартный интернет-протокол для управления устройствами в IP-сетях на основе архитектур TCP/UDP.

MIB (Managment Information Base)
Это структурированный текстовый файл или несколько файлов, которые содержат информацию о всех объектах устройства. 
Объектом может быть какая-нибудь настройка или параметры системы. У каждого объекта есть свой набор полей, таких как тип данных, 
доступность (чтение, запись), статус (обязательный, необязательный), текстовое название настройки. 
Также объект может содержать другие объекты.

OID — Object IDentificator - числовой идентификатор объекта в дереве MIB.

Object Name - имя объекта, уникальная константа для всего MIB, однозначно соответствующая определённому OID.

Типы запросов SNMP

Feature Version 1 Version 2C Version3
GET request + + +
GET-NEXT request + + +
SET request + + +
GET-BULK request + +
TRAP notification + + +
INFORM notification + +
Community based security + +
User based security +
Message Authentication +
Message Encryption (privacy) +

Типы данных SNMP

Тип Описание Пример Дополнительно
Integer32 Целое со знаком (32-бита)  .1.3.6.1.2.1.1.7.0 = INTEGER: 2 от -2147483648 до 2147483647
Counter32 Целое без знака (32-бита) .1.3.6.1.2.1.1.7.1 = Counter32: 1 от 0 до 4294967295, не доступно на запись, при переполнении сбрасывается в 0
Counter64 Целое без знака (64-бита) .1.3.6.1.2.1.31.1.1.1.8.6 = Counter64: 103 не доступно на запись, после переполнения сбрасывается в ноль
Gauge32 Целое без знака (32-бита) .1.3.6.1.2.1.2.2.1.5.49 = Gauge32: 100000000 от 0 до 4294967295
TimeTicks Целое без знака .1.3.6.1.2.1.1.3.0 = Timeticks: (1299250300) 150 days, 9:01:43.00 1/100 секунд, не уменьшаемое
OctetString Строка/Массив байт .1.3.6.1.2.1.1.9.1.3.1 = STRING: "RS capabilities" Обычно до 255 байт
Object Identifier OID .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.3955.6.9.224.1  
IpAddress IP адрес .1.3.6.1.2.1.4.20.1.1.192.168.136.18 = IpAddress: 192.168.0.18  
HexString Шестнадцатеричная строка .1.3.6.1.2.1.2.2.1.6.1 = Hex-STRING: 3C DF 1E EA A7 65  
Null Нет значения или пустое .1.3.6.1.2.1.31.1.1.1.18.1 = ""  

debian 11 standart repository

vim /etc/apt/sources.list
-------------------------
deb http://deb.debian.org/debian bullseye main contrib non-free
deb-src http://deb.debian.org/debian bullseye main contrib non-free
 
deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
deb-src http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
 
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free
 
deb http://deb.debian.org/debian bullseye-backports main contrib non-free
deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free
-------------------------

Установка:

apt-get update && sudo apt-get install snmp snmpd
apt-get install snmp-mibs-downloader
download-mibs

Готовим конфиг snmpd.conf — Находим две строки и редактируем их:

!!! находим строку "#agentaddress 127.0.0.1,[::1]", приводим к виду "agentaddress  udp:161"
!!! находим строку "rocommunity  public default -V systemonly", приводим к виду "rocommunity  vasian 192.168.0.0/16"
!!! vasian - наше комьюнити
!!! 192.168.0.0/16 - наша сеть

vim /etc/snmp/snmpd.conf 
------------------------
#agentaddress  127.0.0.1,[::1]
agentaddress  udp:161

# Read-only access to everyone to the systemonly view
#rocommunity  public default -V systemonly
#rocommunity6 public default -V systemonly
rocommunity  vasian 192.168.0.0/16
------------------------

Проверка:

ss -alnp | grep snmp | grep 161

snmpwalk -v 2c -c myCommunity localhost
snmpwalk -v2c -c public localhost
snmpwalk -On -v2c -c public localhost
snmpwalk -v2c -c public 192.168.0.1
snmpwalk -v2c -c YouCommunity 192.168.0.1 | head

snmptranslate -Tp

snmp v3

0. Останавливаем демон snmpd
systemctl stop snmpd

1. Для snmpv3 требуется создать пользователя, для этого используется команда net-snmp-create-v3-user
net-snmp-create-v3-user [-ro] [-A authpass] [-a MD5|SHA] [-X privpass][-x DES|AES] [username]
net-snmp-create-v3-user -ro -A SecUREDpass -a SHA -X StRongPASS -x AES snmpreadonly
Выполнив эту команду в файл snmpd.conf (по умолчанию /etc/snmp/snmpd.conf, но могут быть и /var/lib/snmp/snmpd.conf, /usr/share/snmp/snmpd.conf )
createUser snmpreadonly SHA "SecUREDpass" AES StRongPASS
rouser snmpreadonly

2. Для проверки локально:
net-snmp-create-v3-user -x AES -a SHA

3. Запускаем демон snmpd
systemctl start snmpd
systemctl enable snmpd

4. Проверяем
snmpwalk -v3 -a SHA -A SecUREDpass -x AES -X StRongPASS -l authPriv -u snmpreadonly localhost | head -10


ЕЩЕ примеры запросов:

snmpget -v3 -u  -l  -a  -A  -x  -X   

SNMPv3 account information
Name:admin
Auth-password:admin0
Priv-Password:admin1

snmpget -v3 -u admin -l authPriv -a SHA -A admin0 -x AES -X admin1 192.168.0.253 1.3.6.1.2.1.1.1.0

Здесь:

-v3 — указывает использование SNMP v3.
-u admin — имя пользователя SNMP.
-l authPriv — уровень безопасности. Возможные значения:
noAuthNoPriv — без аутентификации и шифрования.
authNoPriv — только аутентификация.
authPriv — аутентификация и шифрование.
-a SHA — протокол аутентификации. Может быть SHA или MD5.
-A admin0 — пароль аутентификации.
-x AES — протокол шифрования. Может быть AES или DES.
-X admin1  — пароль шифрования.
192.168.0.253 — IP-адрес устройства.
1.3.6.1.2.1.1.1.0 — OID для проверки системного описания.



snmpget -v3 -u admin -l authPriv -a SHA -A admin0 -x AES -X admin1 192.168.0.253 1.3.6.1.2.1.1.1.0
snmpwalk -v3 -u admin -l authNoPriv -a SHA -A admin0 192.168.0.253
snmpwalk -v3 -u admin -l authPriv -a SHA -A admin0  -x DES -X admin1 192.168.0.253
snmpwalk -v3 -u admin -l authPriv -a MD5 -A admin0  -x AES -X admin1 192.168.0.253

Пример конфига snmpd.conf:

sysServices    72
master  agentx
agentaddress  udp:161
view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1
rocommunity  vasian 192.168.0.0/16
createUser snmpreadonly SHA "SecUREDpass" AES "StRongPASS"
rouser snmpreadonly

Пример тестового конфига snmpd.conf:

cat /etc/snmp/snmpd.conf | grep -Ev "^#|^$"
-------------------------------------------                                                                                                                                                                             
com2sec readonly  default         public
com2sec readwrite default         private
group MyROSystem v1        paranoid
group MyROSystem v2c       paranoid
group MyROSystem usm       paranoid
group MyROGroup v1         readonly
group MyROGroup v2c        readonly
group MyROGroup usm        readonly
group MyRWGroup v1         readwrite
group MyRWGroup v2c        readwrite
group MyRWGroup usm        readwrite
view all    included  .1                               80
view system included  .iso.org.dod.internet.mgmt.mib-2.system
access MyROSystem ""     any       noauth    exact  system none   none
access MyROGroup ""      any       noauth    exact  all    none   none
access MyRWGroup ""      any       noauth    exact  all    all    none
syslocation Unknown (configure /etc/snmp/snmpd.local.conf)
syscontact Root  (configure /etc/snmp/snmpd.local.conf)
exec shelltest /bin/sh /tmp/shtest
-------------------------------------------  

Выполнение скриптов с помощью snmpd пример:

0. Раскомментировать строку в файле “/etc/snmp/snmpd.conf”:
--------------------------------------------------------
exec shelltest /bin/sh /tmp/shtest
--------------------------------------------------------

1. Создать файл “/tmp/shtest” и добавить в него следующие:
cat > /tmp/shtest << "EOF"
#!/bin/bash
prog1=$(cat /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq)
prog2=$(val=$(cat /sys/class/thermal/thermal_zone0/temp) ; result=$(echo "scale=2; $val / 1000.0" | bc) ; printf "%.2f\n" "$result")
echo "freq_cpu=$prog1 Hz temper=$prog2 C"
EOF


2. Использование:
snmpwalk -v2c  -c public localhost .1.3.6.1.4.1.2021.8
snmpwalk -On -v2c  -c public localhost .1.3.6.1.4.1.2021.8

Шаги по добавлению сторонних MIB в SNMPD

0. Скачать MIB-файл: 
Убедитесь, что у вас есть MIB-файл, который вы хотите добавить.

1. Скопировать MIB-файл: 
Скопируйте ваш MIB-файл в каталог, где хранятся MIB-файлы. 
Обычно это /usr/share/snmp/mibs.
sudo cp ваш_файл.mib /usr/share/snmp/mibs/

2. Обновить конфигурацию snmpd: 
Отредактируйте конфигурационный файл snmpd.conf, чтобы убедиться, что демон snmpd загружает ваш MIB-файл.
Обычно конфигурационный файл находится в /etc/snmp/snmpd.conf.
sudo nano /etc/snmp/snmpd.conf
Добавить MIB-файл в конфигурацию: 
Вставьте строку, чтобы указать путь к новому MIB-файлу, если это необходимо. 
Например:
mibs +ВашMIB
Если переменная mibs не указана, snmpd будет загружать все MIB-файлы из директории /usr/share/snmp/mibs.

3. Перезапустить демон snmpd: 
После внесения изменений перезапустите демон snmpd, чтобы применить новые настройки.
sudo systemctl restart snmpd

4. Проверка:
snmpwalk -v 2c -c public localhost .1.3.6.1.4.1
Эта команда будет проходить по всем OID, начиная с базового OID для частных предприятий.
Если ваши MIB-файлы правильно установлены и загружены, вы увидите информацию из вашего MIB.

Пример скрипта pass на bash

#!/bin/bash
REQUEST_OID="$2"
echo "$REQUEST_OID"; 
case "$REQUEST_OID" in 
    .1.3.6.1.4.1.1958.1.0) 
        echo "string"; echo "TransmitDevice"; exit 0;;
    .1.3.6.1.4.1.1958.2.0) 
        echo "string"; echo "1.3.6.1.4.1.1958.7.2.2"; exit 0;; 
    .1.3.6.1.4.1.1958.3.0) 
        echo "integer"; echo "123"; exit 0;; 
    .1.3.6.1.4.1.1958.4.0) 
        echo "integer"; echo "100"; exit 0;;
    .1.3.6.1.4.1.1958.5.0) 
        echo "integer"; echo "2"; exit 0;;
    .1.3.6.1.4.1.1958.6.0) 
        echo "integer"; echo "3"; exit 0;;
    *) 
        echo "string"; echo "$@"; exit 0;; 
    esac 
    exit

Пример скрипта pass на golang

// // GOOS=linux GOARCH=arm64 go build -o dok_snmp_agent
package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"strings"
)

var cmdOutput string

func fprog_exec(cmd string) error {
	out, err := exec.Command("bash", "-c", cmd).Output()
	if err != nil {
		return err
	}
	cmdOutput = strings.TrimSpace(string(out))
	return nil
}

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: go run script.go REQUEST_OID")
		os.Exit(1)
	}

	requestOID := os.Args[2]
	fmt.Println(requestOID)

	switch requestOID {
	case ".1.3.6.1.4.1.52666.5.1.2.1.0":
               // Пример как можно выполнять команду 
		err := fprog_exec(`ps -uaxf | grep root | head`)
		if err != nil {
			log.Fatalf("Command failed: %v", err)
		}
		fmt.Println("integer")
		//fmt.Println(cmdOutput + ".01")
		fmt.Println(cmdOutput)
		os.Exit(0)

	case ".1.3.6.1.4.1.52666.5.1.1.1.0":
		//text
		fmt.Println("string")
		fmt.Println("LOLOLO")
		os.Exit(0)

	case ".1.3.6.1.4.1.1958.1.0":
		fmt.Println("string")
		fmt.Println("TransmitDevice")
		os.Exit(0)
	case ".1.3.6.1.4.1.1958.2.0":
		fmt.Println("string")
		fmt.Println("1.3.6.1.4.1.1958.7.2.2")
		os.Exit(0)
	case ".1.3.6.1.4.1.1958.3.0":
		fmt.Println("integer")
		fmt.Println("123")
		os.Exit(0)
	case ".1.3.6.1.4.1.1958.4.0":
		fmt.Println("integer")
		fmt.Println("100")
		os.Exit(0)
	case ".1.3.6.1.4.1.1958.5.0":
		fmt.Println("integer")
		fmt.Println("2")
		os.Exit(0)
	case ".1.3.6.1.4.1.1958.6.0":
		fmt.Println("integer")
		fmt.Println("3")
		os.Exit(0)
	default:
		fmt.Println("string")
		fmt.Println(requestOID)
	}
}

Примеры конфигов snmp и snmpd для pass

cat /etc/snmp/snmp.conf
-----------------------
mibs +DOK-PtMp-V-MIB
mibs +ALL
-----------------------

cat /etc/snmp/snmpd.conf
------------------------
com2sec AllUser default public
group AllGroup v2c AllUser
view AllView included .1
access AllGroup "" any noauth exact AllView none none

#You agent
pass .1.3.6.1.4.1.52666 /usr/bin/you_agent
pass .1.3.6.1.4.1.1958 /usr/bin/you_agent
------------------------

Примеры с программами для проверки pass скриптов

snmptranslate -Tp - распечатать таблицу с подключенными мибами

snmpd -f -LsC -Ducd-snmp/pass - запускаем snmpd в режиме дебага для pass (pkill snmpd)
snmpd -f -Lo -DALL - запускаем snmpd в режиме дебага

snmpdctl -L - эта команда выведет список текущих расширений, которые настроены для вашего агента SNMP
snmptranslate -Tp -m /usr/share/snmp/mibs/Test_MIB_with_ending.txt - проверка мибы
snmptranslate -Tp -m SIMPLE-MIB - проверка мибы по ее имени

snmpwalk -v2c  -c public localhost  .1.3.6.1.4.1.52880.5.1.1.1.0 -m /usr/share/snmp/mibs/DOK-PtMP-V-MIB.txt - проверяем конкретный OID и мибу
snmpget -v2c  -c public localhost  .1.3.6.1.4.1.52880.5.1.1.1.0 -m /usr/share/snmp/mibs/DOK-PtMP-V-MIB.txt - проверяем конкретный OID и мибу

snmpwalk -v2c  -c public localhost .1.3.6.1.4.1.52880.5.1.1.1.0 
snmpget -v2c  -c public localhost .1.3.6.1.4.1.52880.5.1.1.1.0 

snmptranslate  -m /usr/share/snmp/mibs/DOK-PtMP-V-MIB.mib  -Dparse -Dtoken .1.3.6.1.4.1.52880.5.1.1.1.0

Ссылки:

https://stackoverflow.com/questions/47210999/snmp-pass-through-command-not-returning-with-snmpget
https://www.linuxshop.ru/forum/f35/t41586--resheno-no-such-instance-currently-exists-at-this-oid-uzel-v-zabbix-apc-smart-ups-3000.html
https://electronix.ru/forum/topic/79563-snmpd-mib-obrabotchik-i-vse-eto-na-linux/
https://net-snmp.sourceforge.io/wiki/
https://github.com/net-snmp/net-snmp
https://ru.wikipedia.org/wiki/Net-SNMP