info snmp
1 2 3 4 5 6 7 8 9 10 11 12 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 ------------------------- |
Установка:
1 2 3 |
apt-get update && sudo apt-get install snmp snmpd apt-get install snmp-mibs-downloader download-mibs |
Готовим конфиг snmpd.conf — Находим две строки и редактируем их:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
!!! находим строку "#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 ------------------------ |
Проверка:
1 2 3 4 5 6 7 8 9 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 |
Пример конфига snmpd.conf:
12345678
sysServices 72master agentxagentaddress udp:161view systemonly included .1.3.6.1.2.1.1view systemonly included .1.3.6.1.2.1.25.1rocommunity vasian 192.168.0.0/16createUser snmpreadonly SHA "SecUREDpass" AES "StRongPASS"rouser snmpreadonly
Пример тестового конфига snmpd.conf:
12345678910111213141516171819202122
cat /etc/snmp/snmpd.conf | grep -Ev "^#|^$"------------------------------------------- com2sec readonly default publiccom2sec readwrite default privategroup MyROSystem v1 paranoidgroup MyROSystem v2c paranoidgroup MyROSystem usm paranoidgroup MyROGroup v1 readonlygroup MyROGroup v2c readonlygroup MyROGroup usm readonlygroup MyRWGroup v1 readwritegroup MyRWGroup v2c readwritegroup MyRWGroup usm readwriteview all included .1 80view system included .iso.org.dod.internet.mgmt.mib-2.systemaccess MyROSystem "" any noauth exact system none noneaccess MyROGroup "" any noauth exact all none noneaccess MyRWGroup "" any noauth exact all all nonesyslocation Unknown (configure /etc/snmp/snmpd.local.conf)syscontact Root <root@localhost> (configure /etc/snmp/snmpd.local.conf)exec shelltest /bin/sh /tmp/shtest-------------------------------------------
Выполнение скриптов с помощью snmpd пример:
1 2 3 4 5 6 7 8 |
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:
12345678910111213141516171819202122
cat /etc/snmp/snmpd.conf | grep -Ev "^#|^$"------------------------------------------- com2sec readonly default publiccom2sec readwrite default privategroup MyROSystem v1 paranoidgroup MyROSystem v2c paranoidgroup MyROSystem usm paranoidgroup MyROGroup v1 readonlygroup MyROGroup v2c readonlygroup MyROGroup usm readonlygroup MyRWGroup v1 readwritegroup MyRWGroup v2c readwritegroup MyRWGroup usm readwriteview all included .1 80view system included .iso.org.dod.internet.mgmt.mib-2.systemaccess MyROSystem "" any noauth exact system none noneaccess MyROGroup "" any noauth exact all none noneaccess MyRWGroup "" any noauth exact all all nonesyslocation Unknown (configure /etc/snmp/snmpd.local.conf)syscontact Root <root@localhost> (configure /etc/snmp/snmpd.local.conf)exec shelltest /bin/sh /tmp/shtest-------------------------------------------
Выполнение скриптов с помощью snmpd пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 <root@localhost> (configure /etc/snmp/snmpd.local.conf) exec shelltest /bin/sh /tmp/shtest ------------------------------------------- |
Выполнение скриптов с помощью snmpd пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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
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 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/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
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 |
// // 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 скриптов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 |
Ссылки:
1 2 3 4 5 6 |
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 |