Показаны сообщения с ярлыком SNMP. Показать все сообщения
Показаны сообщения с ярлыком SNMP. Показать все сообщения

вторник, 26 мая 2026 г.

Сбор syslog и snmptrap с сетевых устройств в базу Clikhouse через Vector. Rocky Linux 9.7.

Реализуем следующую схему:
1. Настройка NTP сервера для корректного учета времени логов.
Проверяем установку NTP клиента
# systemctl status chronyd
Устанавливаем сервера времени:
# nano /etc/chrony.conf
Сервера для работы:
 server ntp.vtt.net iburst
 pool ru.pool.ntp.org iburst
 server ntp1.yandex.ru
 server ntp2.yandex.ru
 server ntp1.stratum2.ru iburst
 server ntp2.stratum2.ru iburst

# systemctl restart chronyd
Проверка:
# timedatectl status
# date
# chronyc tracking
# chronyc sources


2.Для быстрой работы базы Clickhouse необходимо немного подтюнить операционную систему:
2.1 Отключить использование SWAP
# swapoff -a
Закомментировать строку, подключающую SWAP в fstab
# nano /etc/fstab
У меня это строка:
 #/dev/mapper/rl-swap     none                    swap    defaults        0 0
2.2 Увеличить лимит открытых файлов (для high-load)
# echo "clickhouse soft nofile 262144" | sudo tee -a /etc/security/limits.conf
# echo "clickhouse hard nofile 262144" | sudo tee -a /etc/security/limits.conf

2.3 Включить опцию madvise механизма Transparent Huge Pages (THP) и разрешить Clickhouse опрос задержек ядра.
Цель: что бы ОС Linux не мешала Clikhouse использовать большие блоки памяти (На виртуальных машинах работает не всегда).
И чтобы Clickhouse не ругался на невозможность мониторить параметры задержки ядра процессора.
# nano /etc/sysctl.conf
Добавляем строки:
 vm.transparent_hugepage = madvise
 kernel.task_delayacct = 1

Добавляем в загрузчик GRUB опцию загрузки ОС с параметром madvise:
# grubby --update-kernel=ALL --args="transparent_hugepage=madvise"
Теперь необходима перезагрузка сервера.
# reboot
После перезагрузки проверяем, что опция madvise применилась. Пример правильного вывода:
# cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-611.36.1.el9_7.x86_64 root=/dev/mapper/rl-root ro resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap crashkernel=1G-2G:192M,2G-64G:256M,64G-:512M transparent_hugepage=madvise
# cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never

# sysctl kernel.task_delayacct
kernel.task_delayacct = 1
# cat /proc/sys/kernel/task_delayacct
1


3. Устанавливаем Clikhouse:
# dnf install yum-utils curl ca-certificates gnupg2
# yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
# dnf install -y clickhouse-server clickhouse-client
# systemctl enable --now clickhouse-server
# systemctl status clickhouse-server

После установки и запуска сервера, выполняем проверку:
# clickhouse-client --query "SELECT version();"

4. Правим конфигурационный файл Clikhouse
# nano /etc/clickhouse-server/config.xml
Раскомментируем строку (тем самым отключаем IPv6)
 <listen_host>0.0.0.0</listen_host> 
Изменяем уровень логирования – оставляем только ошибки
 <logger>
   <level>warning</level> 
 <logger>

Ограничиваем сервер полкой в использовании памяти - в 5Г, иначе сервер съест другие приложения
 <max_server_memory_usage>5000000000</max_server_memory_usage>
Отключаем процентное указание в использование памяти
 <max_server_memory_usage_to_ram_ratio>0</max_server_memory_usage_to_ram_ratio>
Рестартуем сервис для изменений:
# systemctl restart clickhouse-server

5. Создаем базу данных и таблицу для записи метрик с партициями по месяцу:
# clickhouse-client -h localhost
 :) CREATE DATABASE IF NOT EXISTS logsdb;
 :) CREATE TABLE logsdb.logsdb (
    ts DateTime64(3),
    d Date MATERIALIZED toDate(ts),
    source_type Enum8('syslog' = 1, 'snmptrap' = 2),
    host String,
    severity LowCardinality(String),
    facility LowCardinality(String),
    message String CODEC(ZSTD(3)),
    INDEX idx_host_token host TYPE tokenbf_v1(1024, 3, 0) GRANULARITY 4,
    INDEX idx_message_token message TYPE tokenbf_v1(4096, 3, 0) GRANULARITY 8,
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY (ts, source_type, host)
TTL d + INTERVAL 1 YEAR
SETTINGS
    index_granularity = 8192,
    compress_primary_key = 1,
    enable_mixed_granularity_parts = 1,
    min_bytes_for_wide_part = 0;


6. Устанавливаем демон SNMPTRAPD, который будет ловить трапы от оборудования. Демон snmptrapd входит в пакет net-snmp.
# dnf install net-snmp net-snmp-utils
Конфиг лежит тут: /etc/snmp/snmptrapd.conf
# nano /etc/snmp/snmptrapd.conf
В конфигурационый файл вносим директивы:
 disableAuthorization yes
 # Формат для SNMPv1
 format1 TRAPIP=%b | SNMPVER=1 | TRAPTIME=%y-%m-%L %H:%J:%k | TRAPTYPE=%W | TRAPVAL: %v\n
 # Формат для SNMPv2c
 format2 TRAPIP=%b | SNMPVER=2 | TRAPTIME=%y-%m-%L %H:%J:%k | TRAPTYPE=%W | TRAPVAL: %v\n

Создаем файл логов snmptrapd:
# touch /var/log/snmptrapd.log
# chmod 644 /var/log/snmptrapd.log

Запускаем демон для теста
# snmptrapd -f -Lo -c /etc/snmp/snmptrapd.conf
Из другой консоли генерируем отправку трапа:
# snmptrap -v 2c -c my_secret_string 127.0.0.1 "" .1.3.6.1.4.1.9.9.43.2.0.1
При этом в консоле демона snmptrapd должны увидеть захваченный лог.

7. Настраиваем unit systemd для запуска SNMPTRAPD.
При настройке важно, что режим перенаправления логов в файл задается при запуске демона:
# systemctl edit snmptrapd
Вставляем команды редактирующие основной unit:
 ### Anything between here and the comment below will become the new contents of the file
 [Service]
 ExecStart=
 ExecStart=/usr/sbin/snmptrapd -f -A -c /etc/snmp/snmptrapd.conf -Lf /var/log/snmptrapd.log
 ### Lines below this comment will be discarded

Запускаем службу:
# systemctl daemon-reload
# systemctl start snmptrapd
# systemctl enable snmptrapd
# systemctl status snmptrapd


8. Организовываем ротацию файлов логов трапов snmp
# nano /etc/logrotate.d/snmptrapd
Содержимое файла:
 /var/log/snmptrapd.log {
    daily
    rotate 7
    missingok
    notifempty
    copytruncate
 }

Проверка синтаксиса:
# logrotate -d /etc/logrotate.d/snmptrapd
Принудительная ротация логов прямо сейчас:
# logrotate -f /etc/logrotate.d/snmptrapd

9. Устанавливаем Vector.
Скачиваем пакет установки Vector для Rocky Linux 9.6:
# cd /usr/src
# wget https://packages.timber.io/vector/0.48.0/vector-0.48.0-1.x86_64.rpm
# sudo dnf localinstall -y vector-0.48.0-1.x86_64.rpm

Проверка
# vector --version
# which vector


10. Конфигурация Vector для приема syslog и snmptrap
# nano /etc/vector/vector.toml
 [sources.syslog]
 type = "socket"
 address = "0.0.0.0:514"
 mode = "udp"
 decoding.codec = "bytes"
 host_key = "source_ip"
 [sources.snmptrap]
 type = "file"
 include = ["/var/log/snmptrapd.log"]
 read_from = "beginning"
 ignore_not_found = true
 fingerprinting.strategy = "device_and_inode"
 [transforms.parse_syslog]
 type = "remap"
 inputs = ["syslog"]
 source = '''
 messageone = to_string!(.message)
 # Ищем PRI в любом месте строки, извлекаем только цифры внутри <>
 matched = parse_regex(messageone, r'\<(?P<pri_value>[0-9]+)>(?P<mess>.*)$') ?? {}
 .message = to_string(matched.mess)
 if matched.pri_value != null {
    .pri = matched.pri_value
    
    # Выводим в лог
    #log("MATCHED PRI VALUE: " + .pri)
    .fac_id = (to_int(to_int!(.pri) / 8))
    .facility_name = "unknown"
    if .fac_id == 0 { .facility_name = "kern" }
    if .fac_id == 1 { .facility_name = "user" }
    if .fac_id == 2 { .facility_name = "mail" }
    if .fac_id == 3 { .facility_name = "daemon" }
    if .fac_id == 4 { .facility_name = "auth" }
    if .fac_id == 5 { .facility_name = "syslog" }
    if .fac_id == 6 { .facility_name = "lpr" }
    if .fac_id == 7 { .facility_name = "news" }
    if .fac_id == 8 { .facility_name = "uucp" }
    if .fac_id == 9 { .facility_name = "cron" }
    if .fac_id == 10 { .facility_name = "authpriv" }
    if .fac_id == 11 { .facility_name = "ftp" }
    if .fac_id == 12 { .facility_name = "ntp" }
    if .fac_id == 13 { .facility_name = "audit" }
    if .fac_id == 14 { .facility_name = "alert" }
    if .fac_id == 15 { .facility_name = "clock" }
    if .fac_id == 16 { .facility_name = "local0" }
    if .fac_id == 17 { .facility_name = "local1" }
    if .fac_id == 18 { .facility_name = "local2" }
    if .fac_id == 19 { .facility_name = "local3" }
    if .fac_id == 20 { .facility_name = "local4" }
    if .fac_id == 21 { .facility_name = "local5" }
    if .fac_id == 22 { .facility_name = "local6" }
    if .fac_id == 23 { .facility_name = "local7" }
    .facility = .facility_name
    sev_id = to_int!(.pri) - (.fac_id * 8)
    .severity_name = "unknown" 
    if sev_id == 0 { .severity_name = "emerg" }
    if sev_id == 1 { .severity_name = "alert" }
    if sev_id == 2 { .severity_name = "crit" }
    if sev_id == 3 { .severity_name = "err" }
    if sev_id == 4 { .severity_name = "warning" }
    if sev_id == 5 { .severity_name = "notice" }
    if sev_id == 6 { .severity_name = "info" }
    if sev_id == 7 { .severity_name = "debug" }
    .severity = .severity_name
 } else {
    #log("PRI not found in message", level: "warn")
    .facility = "unknown"
    .severity = "unknown"
    .message = messageone
 }
 .ts = to_int(to_unix_timestamp(now()) * 1000.0)
 .source_type = 1
 .host = .source_ip
 '''
 [transforms.parse_snmptrap]
 type = "remap"
 inputs = ["snmptrap"]
 source = '''
 ts_value = to_int(to_unix_timestamp(now()) * 1000.0)
 # Разбиваем сообщение на массив
 trap_array = split(string!(.message), "|")
 arr_len = length(trap_array)
 # Инициализируем переменные дефолтными значениями
 snmpver = ""
 trapip = ""
 msg_2 = ""
 msg_3 = ""
 msg_4 = ""
 facility_value = "snmp_unknown"
 message_value = ""
 # Заполняем переменные только если индексы физически существуют в массиве
 if arr_len > 0 { trapip = to_string(trap_array[0]) }
 if arr_len > 1 { snmpver = to_string(trap_array[1]) }
 if arr_len > 2 { msg_2 = to_string(trap_array[2]) }
 if arr_len > 3 { msg_3 = to_string(trap_array[3]) }
 if arr_len > 4 { msg_4 = to_string(trap_array[4]) }
 matched = parse_regex(trapip, r'UDP:\s*\[(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]') ?? {}
 host_value = to_string(matched.ip)
 if snmpver == " SNMPVER=1 " {
  facility_value = "snmp1"
 } else {
  facility_value = "snmp2"
 }
 # Если строка вообще не содержала разделителей "|", сохраняем оригинальное сообщение целиком
 if msg_2 == "" && msg_3 == "" {
  message_value = strip_whitespace(string!(.message))
 } else {
  message_value = strip_whitespace(msg_2 + "|" + msg_3 + "|" + msg_4)
 }
 # Полностью очищаем объект от системных метаданных Vector
 . = {}
 # Наполняем строго по схеме таблицы net_logs
 .ts = ts_value
 .host = host_value
 .facility = facility_value
 .message = message_value
 .severity = "info"
 .source_type = "snmptrap"
 '''
 [sinks.clickhouse_syslog]
 type = "clickhouse"
 inputs = ["parse_syslog"]
 database = "logsdb"
 table = "net_logs"
 endpoint = "http://localhost:8123"
 compression = "none"
 [sinks.clickhouse_syslog.auth]
 strategy = "basic"
 user = "default"
 password = ""
 [sinks.clickhouse_syslog.batch]
 max_events = 1000
 timeout_secs = 1
 [sinks.clickhouse_snmptrap]
 type = "clickhouse"
 inputs = ["parse_snmptrap"]
 database = "logsdb"
 table = "net_logs"
 endpoint = "http://localhost:8123"
 compression = "none"
 [sinks.clickhouse_snmptrap.auth]
 strategy = "basic"
 user = "default"
 password = ""
 [sinks.clickhouse_snmptrap.batch]
 max_events = 1000
 timeout_secs = 1
 [sinks.clickhouse_snmptrap.request]
 retry_attempts = 0

Проверяем конфиг
# vector validate --config-dir /etc/vector/
Пытаемся запуститься под root
# vector --config /etc/vector/vector.toml
Видим, что все запускается, порты 162 и 514 начинают прослушиваться.

11. Настройка службы запуска vector.
11.1 По умолчанию Linux не позволяет обычным программам, типа vector, слушать порты ниже 1024. Vector же должен слушать порты SNMPtrap (162) и syslog (514):
# setcap 'cap_net_bind_service=+ep' $(which vector)
11.2 Вносим изменения в unit systemd службы vector
# systemctl edit vector
Вставляем директивы запуска, отличные от типовых:
 ### Anything between here and the comment below will become the new contents of the file
 [Unit]
 After=network-online.target snmptrapd.service clickhouse-server.service
 Requires=network-online.target snmptrapd.service clickhouse-server.service
 [Service]
 User=vector
 Group=vector
 ExecStart=
 ExecStart=/usr/bin/vector --config /etc/vector/vector.toml
 AmbientCapabilities=CAP_NET_BIND_SERVICE
 CapabilityBoundingSet=CAP_NET_BIND_SERVICE
 NoNewPrivileges=yes
 Restart=on-failure
 RestartSec=5
 PrivateNetwork=no
 RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
 Environment=VECTOR_LOG_FORMAT=text
 ### Lines below this comment will be discarded

Запускаем службу:
# systemctl daemon-reload
# systemctl start vector
# systemctl enable vector

Проверка работы:
# journalctl -u vector -f

12. Настраиваем firewalld:
Открываем порты для внешнего доступа к сервисам Clikhouse (8123 и 9000), для SNMPtrap (162) и syslog (514):
# firewall-cmd --permanent --add-port=8123/tcp
# firewall-cmd --permanent --add-port=9000/tcp
# firewall-cmd --permanent --add-port=514/udp
# firewall-cmd --permanent --add-port=162/udp
# firewall-cmd --reload
# firewall-cmd --list-ports


13. Проверка вставки данных:
13.1 Тестовая отправка syslog:
# logger -n 127.0.0.1 -p local0.info -t vector_test "Pipeline check $(date +%s)"
Тестовая отправка snmptrap:
# snmptrap -v 2c -c my_secret_string 127.0.0.1 "" .1.3.6.1.4.1.9.9.43.2.0.1
# snmptrap -v 1  -c my_secret_string 127.0.0.1 1.3.6.1.4.1.9.9.43 192.168.100.100 6 1 0 .1.3.6.1.4.1.9.9.43.2.0.1 s "test"
13.2 Проверка записи данных в базу Clickhouse
# clickhouse-client -h localhost --query "SELECT * FROM logsdb.net_logs ORDER BY ts DESC LIMIT 5"

ПРИМЕЧАНИЕ:
Если Vector перестал записывать данные логов из файла /var/log/snmptrapd.log, то может быть он запомнил старые данные inode файла, который поменялся при ротации.
Можно очистить checkpoints сервиса vector
# systemctl stop vector
# rm -rf /var/lib/vector/*
# systemctl start vector

вторник, 28 июня 2022 г.

Rocky Linux 8. Prometheus. Опрос сетевых устройств по SNMP

Prometheus имеет в своей коллекции экспортер «snmp_exporter», который предназначен для сбора метрик с устройств, поддерживающих SNMP.
SNMP экспортер анализирует MIBS SNMP и создает конфигурационный файл, содержащий OID, которые сопоставляются с метриками Prometheus. Затем SNMP экспортер запрашивает SNMP-агенты сети по указанным OID и отображает результаты в виде счетчиков понятных Prometheus.

Ссылка для скачивания файлов проекта «snmp_exporter»: 

https://github.com/prometheus/snmp_exporter/tree/master/generator
Экспортеру «snmp_exporter» для работы нужны MIBы с устройств.
Получить большую коллекцию MIB можно скачав базу проекта librenms: https://github.com/librenms/librenms
# cd /usr/src/
# git clone https://github.com/librenms/librenms.git
MIBы будут в директории /usr/src/librenms/mibs/

Скачиваем файлы проекта «snmp_exporter»
# git clone https://github.com/prometheus/snmp_exporter.git

Создание исполняемого файла экспортера «snmp_exporter» выполняется так:
# cd snmp_exporter
# go build
Произойдет сборка файла snmp_exporter, который нужно скопировать в директорию с исполняемыми файлами:
# cp snmp_exporter /usr/local/bin/snmp_exporter
Создаем пользователя для работы с экспортером и даем ему права на исполняемый файл
# useradd -M -r -s /bin/false snmp_exporter
# chown snmp_exporter:snmp_exporter /usr/local/bin/snmp_exporter
# mkdir /usr/local/bin/snmp_exporter_conf
Экспортер умеет опрашивать SNMP агент только по определенному набору SNMP параметров. При этом экспортер обращается к специально собранному файлу конфигурации для Prometheus.

То есть экспортеру «snmp_exporter» нужно четко и «по-свойски» рассказать, какие параметры SNMP опрашивать у SNMP-агента. Для и нужно создать специальный файл конфигурации. Специальный файл конфигурации создается специальным генератором, входящий в комплект скаченных файлов «snmp_exporter». Сборка генератора:
# cd generator
# yum install gcc gcc-c++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel
# yum install go p7zip
# go build
После выполнения этой команды создается файл-утилита generator.
Эта утилита generator как раз и умеет генерить специальный файл конфигурации для экспортера «snmp_exporter» Prometheus.
Утилита в своей работе использует
 - переменную окружения MIBDIRS, в которой указывается путь к MIB файлу опрашиваемых значений
 - файл конфигурации generator.yml, который определяет, что нужно опрашивать у элемента. Данный файл нужно править вручную.

На всякий случай сделаем резервную копию generator.yml:
# cp generator.yml generator.yml_example
Теперь нужно отредактировать файл generator.yml
Если необходимо опрашивать порты у оборудования Cisco, то файл должен быть таким:

modules:
  snmp2_public_cisco:
    version: 2
    max_repetitions: 60
    retries: 1
    timeout: 5s
    auth:
      community: public
    walk:
       - sysName
       - 1.3.6.1.2.1.31.1.1.1.10
       - 1.3.6.1.2.1.31.1.1.1.6
    lookups:
      - source_indexes: [ifIndex]
        lookup: ifAlias
      - source_indexes: [ifIndex]
        lookup: ifDescr
      - source_indexes: [ifIndex]
        lookup: ifName
    overrides:
      ifType:
        type: counter


Указываем переменной MIBDIRS место расположения MIB файлов, относительно текущего места
# export MIBDIRS=../../librenms/mibs:../../librenms/mibs/cisco
Затем запускаем генератор:
# ./generator generate
После выполнения команды генератор создается файл конфигурации экспортера snmp.yml на основе файла generator.yml.
При удачном раскладе вывод команд будет такой:
# ./generator generate
level=info ts=2022-06-28T12:47:27.245Z caller=net_snmp.go:161 msg="Loading MIBs" from=../../librenms/mibs:../../librenms/mibs/cisco
level=warn ts=2022-06-28T12:47:28.418Z caller=main.go:120 msg="NetSNMP reported parse error(s)" errors=3
level=info ts=2022-06-28T12:47:28.967Z caller=main.go:52 msg="Generating config for module" module=snmp2_public_cisco
level=info ts=2022-06-28T12:47:29.136Z caller=main.go:67 msg="Generated metrics" module=snmp2_public_cisco metrics=3
level=info ts=2022-06-28T12:47:29.138Z caller=main.go:92 msg="Config written" file=/usr/src/snmp_exporter/generator/snmp.yml

А при неудачном выполнении, например, такой:
# ./generator generate
level=info ts=2022-06-28T12:41:56.768Z caller=net_snmp.go:161 msg="Loading MIBs" from=../../librenms/mibs:../../librenms/mibs/cisco
level=warn ts=2022-06-28T12:41:57.930Z caller=main.go:120 msg="NetSNMP reported parse error(s)" errors=3
level=info ts=2022-06-28T12:41:58.434Z caller=main.go:52 msg="Generating config for module" module=snmp2_public_cisco
level=error ts=2022-06-28T12:41:58.627Z caller=main.go:130 msg="Error generating config netsnmp" err="cannot find oid '1.3.6.1.4.1.171.12.1.1.6.2' to walk"

После выполнения скрипта создается конфиг snmp.yml
# cp snmp.yml /usr/local/bin/snmp_exporter_conf/snmp.yml

Создаем юнит systemd для управления работой экспортера:
# nano /etc/systemd/system/snmp_exporter.service

[Unit]
Description=SNMP Exporter Service for Prometheus
After=network-online.target

[Service]
User=snmp_exporter
Group=snmp_exporter
Restart=on-failure
ExecStart=/usr/local/bin/snmp_exporter --config.file='/usr/local/bin/snmp_exporter_conf/snmp.yml'

[Install]
WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl start snmp_exporter
# systemctl enable snmp_exporter

Экспортер «snmp_exporter» при работе открывает порт 9116.
Проверка работы сервиса:
# netstat -ltupn | grep 9116
По этому порту будет происходить обращение сервиса Prometheus к экспортеру для того что бы забрать данные.

Добавление нового источника данных на сервере Prometheus
# nano /etc/prometheus/prometheus.yml

  - job_name: 'snmp'
    scrape_interval: 180s
    static_configs:
      - targets:
        - 10.100.16.1
        - 10.100.55.2
        - 10.100.55.5
        - 10.100.55.12
    metrics_path: /snmp
    params:
      module: [snmp2_public_cisco]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 10.10.49.166:9116

В этой конфигурации 10.10.49.166:9116 – это IP и порт на котором работает snmp_exporter, перечень IP в разделе «- targets:» - это опрашиваемые IP адреса, а значение модуля module - «snmp2_public_cisco» - это модуль из конфигурационного файла generator.yml / snmp.yml
Рестартуем сервис:
# systemctl restart prometheus

В Grafana для отображения графиков собираемых метрик можно использовать конструкции данных, например:
irate(ifHCOutOctets{ifDescr="TenGigabitEthernet0/0/0", instance="10.200.255.12"}[10m])*8
irate(ifHCInOctets{ifDescr="TenGigabitEthernet0/0/0", instance="10.200.255.12"}[10m])*8
Вид графика:
 




вторник, 18 января 2022 г.

Rocky Linux 8. Установка SNMP

Установка SNMP выполняется так:
# yum install net-snmp net-snmp-libs net-snmp-utils
# systemctl enable snmpd
# systemctl start snmpd

 

Редактируем конфигурационный файл:

# nano /etc/snmp/snmpd.conf
Строки по умолчанию комментируем
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)

и вписываем что-то свое, например:
syslocation Samara
syscontact Korolev Vyacheslav

Рестартуем сервис:
# systemctl reload snmpd
Проверяем работу запросов snmp
# snmpwalk -v 2c -c public localhost system
Среди прочего должны быть строки, которые были определены выше:
SNMPv2-MIB::sysContact.0 = STRING: Korolev Vyacheslav
SNMPv2-MIB::sysLocation.0 = STRING: Samara

вторник, 11 декабря 2018 г.

Установка SNMP агента на сервер Linux CentOS7

Установка SNMP агента на сервер Linux CentOS7

Необходимость установки SNMP агента на сервер Linux может быть вызвана необходимостью мониторить сервер путем SNMP опросов.

Установка необходимых пакетов:
# yum install net-snmp net-snmp-utils

Для надежности лучше забэкапировать конфигурационный файл по умолчанию snmpd:
# cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig

Редактируем текущий конфигурационный файл:
# nano /etc/snmp/snmpd.conf
Например:
syslocation NNovgorod,ul.Vitebskaya,100
syscontact Root <root@localhost>

# First, map the "community name" into a "security name"
#          sec.name    source            community
com2sec    local       localhost         public
com2sec    nolocal     10.10.15.0/24     public

# Second, map the "security name" into a "group name":
#        groupName    securityModel    securityName
group    rwgroup      v2c              local
group    rogroup      v2c              nolocal
group    rwgroup      v1               local
group    rogroup      v1               nolocal

# Third, create a view for us to let the group have rights to:
#       name          incl/excl   subtree             mask(optional)
view    all             included        .1              80

# Finally, grant the groups access to the view:
#      group   context sec.model  sec.level prefix  read write notif
access rwgroup   ""      any       noauth   exact   all  all   all
access rogroup   ""      any       noauth   exact   all  none  none

Здесь сначала устанавливается правило работы с community в различных сетях. Из сети 10.10.15.0/24 сервер можно будет опросить с помощью community «Public»
Затем описывается какая версия SNMP будет использоваться. В данном случае разрешена и 1ая и вторая версия SNMP
Следующим шагом описывается какое дерево OID можно просматривать. В данном случае – все дерево (.1)
На финальном шаге определяются группы доступа для просмотра

Добавляем сервис snmpd в автозагрузку:
# systemctl enable snmpd.service
Запускаем сервис snmpd
# systemctl start snmpd

Изменяем уровень журналирования демона snmpd:
# nano /etc/sysconfig/snmpd
Содержимое файла приводим к виду:
# snmpd command line options
# '-f' is implicitly added by snmpd systemd unit file
OPTIONS="-LS0-4d"

Перезапускаем сервис:
# systemctl restart snmpd.service

Все. Теперь сервер можно опрашивать.
Например опросить самого себя командой:
# snmpwalk -v2c -c public localhost system

суббота, 13 июня 2015 г.

Установка Zabbix 2.4 в CentOS 6.5

1. Устанавливаем базовые пакеты, требующиеся для дальнейшей работы:
# yum install wget nano net-tools unzip mc nano telnet
# yum -y install perl-CPAN
# yum install gcc*
# yum install binutils*

2. Отключаем SELinux, iptables и перезагружаемся.
# nano /etc/sysconfig/selinux
Комментируем все, вставляем строчку
SELINUX=disabled
# nano /etc/sysconfig/iptables
Комментируем все строчки, определяющие правила (начинаются с -A)
# reboot

3. Установливаем MySQL и добавляем в автозагрузку
# yum install mysql mysql-server
# chkconfig --levels 235 mysqld on
Запускаем MySQL
# /etc/init.d/mysqld start
Задаем пароль root для сервера MySQL
# mysql_secure_installation
Сначала вводим на первый вопрос просто <Enter>, затем на вопрос
Set root password? [Y/n], вводим y и задаем пароль root для MySQL
На следующие вопросы yes (по умолчанию)

4. Установливаем Web-сервер apache и добавляем его в автозагрузку
# yum install httpd
# chkconfig --levels 235 httpd on
В файле конфигурации apache httpd.conf вписываем строчку, задающую имя сервера
# nano /etc/httpd/conf/httpd.conf
ServerName zabmar.ru:80
Затем прописываем это имя в файле hosts, что бы сервер знал, что имя zabmar.ru - это он сам.
# nano /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 zabmar.ru
Наконец запускаем сервер Apache
# /etc/init.d/httpd start

5. Устанавливаем PHP5
# yum install php
Установка модулей для связки PHP5 и Mysql
# yum install php-mysql php-gd php-imap php-ldap php-odbc
Перезапускаем web-сервер
# /etc/init.d/httpd restart
Создаем файл для проверки работы PHP
# nano /var/www/html/info.php
вписываем туда
<?php phpinfo();
?>
Теперь при запросе страницы Info.php (http://<ip-сервера>/info.php) можно увидеть информацию о модуле PHP.  Проверяем, что на странице имеется раздел MySQL.

6. Подключаем репозитарий EPEL, необходимый для установки PhpMyAdmin
# rpm --import https://fedoraproject.org/static/0608B895.txt
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

7, Устанавливаем PhpMyAdmin
# yum install phpMyAdmin
Редактируем файл phpMyAdmin.conf
# nano /etc/httpd/conf.d/phpMyAdmin.conf
Везде добавляем к ip адресам
 ip 127.0.0.1 
дополнительные сети, с которых разрешено просматривать phpmyadmin
 ip 127.0.0.1 10.0.0.0/8 192.168.0.0/16
Правим файл конфигурации config.inc.php
# nano /etc/phpMyAdmin/config.inc.php 
Меняем в нем
$cfg['Servers'][$i]['auth_type']     = 'cookies';
на
$cfg['Servers'][$i]['auth_type']     = 'http';
Перезагружаем apache
# /etc/init.d/httpd restart
Набираем в браузере для просмотра phpmyadmin
http://<ip-адрес>/phpmyadmin/
Используем для доступа данные root и пароль, заданный при настройке MySQL

8. Копируем на машину исходные коды программ NET-SNMP и SNMPTT, скачанные с официальных сайтов:
net-snmp-5.7.3.zip (http://net-snmp.sourceforge.net/ ) и 
snmptt_1.4.tgz (http://snmptt.sourceforge.net/ )

9. Распаковываем архивы
# unzip net-snmp-5.7.3.zip
# tar -zxvf snmptt_1.4.tgz

10. Собираем и устанавливаем NET-SNMP
# cd net-snmp-5.7.3
Устанавливаем дополнительные пакеты PERL, которые нужны для работы NET-SNMP
# perl -MCPAN -e 'install Net::SNMP'
В появляющихся вопросах – соглашаемся со всем нажатием ENTER
Затем необходим еще один модуль PERL
# yum install perl-ExtUtils-Embed
Запускаем конфигуратор из папки с исходными кодами:
# ./configure --enable-embedded-perl --enable-shared
Запуститься диалог. Отвечаем на опросы так (показано красным):
Default version of SNMP to use (3): 2 / будем работать со 2ой версией /
System Contact Information (@@no.where): tech@yandex.ru / указываем e-mail /
System Location (Unknown): Samara / место расположения / 
Location to write logfile (/var/log/snmpd.log): /соглашаемся, нажав ENTER /
Location to write persistent information (/var/net-snmp): /соглашаемся, нажав ENTER /
Затем
# make
# make install

11. Запускаем демон SNMPD
Перед запуском snmpd создаем индивидуальный файл конфигурации
# mkdir /etc/snmp
# touch /etc/snmp/snmpd.conf
# nano /etc/snmp/snmpd.conf
rocommunity  public
syslocation  "Samara"
syscontact  tech@yandex.ru
Запуск snmpd
# /usr/local/sbin/snmpd -c /etc/snmp/snmpd.conf

12. Запускаем демон SNMPTRAPD
Создаем и правим файл конфигурации демона SNMPTRAP.
# touch /etc/snmp/snmptrapd.conf
# nano /etc/snmp/snmptrapd.conf
Вписываем в файл:
authCommunity   log,execute,net public
disableAuthorization yes
[snmp] logoption f /var/log/snmptrap.log 
(последнюю строчку закомментируем после отладки)
Запускаем SNMPTRAPD
# /usr/local/sbin/snmptrapd -On -c /etc/snmp/snmptrapd.conf

13. Проверяем, что демоны SNMPD и SNMPTRAPD запустились и порты активны и заняты правильными службами
# ps ax | grep snmp
19965 ?        S      0:00 /usr/local/sbin/snmpd -c /etc/snmp/snmpd.conf
19971 ?        Ss     0:00 /usr/local/sbin/snmptrapd -c /etc/snmp/snmptrapd.conf
19973 pts/0    S+     0:00 grep snmp
# netstat -ltupn | grep snmp
udp        0      0 0.0.0.0:161             0.0.0.0:*                           28877/snmpd
udp        0      0 0.0.0.0:162             0.0.0.0:*                           28889/snmptrapd
Проверяем прием трапов командой, генерирующий трап о падении порта:
# snmptrap -v 1 -c public  127.0.0.1 '.1.3.6.1.2.1.2.2.1.8.1' '10.200.72.43'  3 0 '557' .1.3.6.1.2.1.2.2.1.8.1 i 2
В файле /var/log/snmptrap.log должен отобразиться принятый трап.
Проверяем работу запросов snmp
# snmpwalk -v 2c -c public localhost IF-MIB::ifAdminStatus
В ответ должны получить информацию по статусам интерфейсов.

14. Проверяем, как установлен пакет NET-SNMP. Пригоден ли он для работы с SNMPTT в режиме Embedded handler
# snmptrapd -H 2>&1 | grep perl
    perl                     PERLCODE
    perlInitFile             string
Наличие первой строки сообщает, что требуемая поддержка имеется и возможно использование встроенного обработчика помимо стандартного обработчика трапов.

15. Устанавливаем пакеты необходимые для работы SNMPTT
# perl -MCPAN -e 'install Sys::Syslog' 
# perl -MCPAN -e 'install Perl::OSType'
# perl -MCPAN -e 'install Module::Build'
# perl -MCPAN -e 'install Config::IniFiles'
(если система будет задавать вопросы – соглашаемся со всем, нажимая ENTER)
# yum -y install perl-Time-HiRes

16. Устанавливаем SNMPTT
# cd ../snmptt_1.4
# cp snmptt /usr/local/sbin/
# chmod +x /usr/local/sbin/snmptt
# cp snmptthandler-embedded /usr/local/sbin/
# chmod +x /usr/local/sbin/snmptthandler-embedded
# cp snmptt.ini /etc/snmp/
В файле настроек snmptt.ini правим некоторые строки
# nano /etc/snmp/snmptt.ini
mode = daemon
net_snmp_perl_enable = 1
log_system_enable = 1 (включаем логирование ошибок)
date_time_format = %H:%M:%S %Y/%m/%d
daemon_uid = root
Определяем правило ротации логов:
# cp snmptt.logrotate /etc/logrotate.d/snmptt
Файл правил обработки SNMP трапов у SNMPTT - examples/snmptt.conf.generic. С файлом нужно ознакомиться и понять его формат. Затем создаем файл своих правил:
# touch /etc/snmp/snmptt.conf
Правим файл:
# nano /etc/snmp/snmptt.conf
Вписываем в файл для примера:
EVENT SamaraAlarm .1.* "all" Normal
FORMAT $+* TEST $aA $1
Создать каталоги, необходимые для работы SNMPTT
# mkdir /var/log/snmptt/
# mkdir /var/spool/snmptt/
Создать файл логов
# touch /var/log/snmptt/snmptt.log
# chmod 777 /var/log/snmptt/snmptt.log

17. Запускаем SNMPTT
# cp snmptt-init.d /etc/rc.d/init.d/snmptt
# chkconfig --add snmptt
# chkconfig --level 2345 snmptt on
# ln -s /usr/local/sbin/snmptt /usr/sbin/snmptt
# service snmptt start
В процессах должно появится два запущенных процесса SNMPTT
# ps ax | grep snmptt
12963 ?        Ss     0:00 /usr/bin/perl /usr/sbin/snmptt --daemon
12965 ?        Ss     0:00 /usr/bin/perl /usr/sbin/snmptt --daemon
12967 pts/0    S+     0:00 grep snmptt

18. Связываем SNMPTRAPD и SNMPTT
Вносим изменения в файл snmptrapd.conf
# nano /etc/snmp/snmptrapd.conf
Дописываем в конец
perl do "/usr/local/sbin/snmptthandler-embedded"; 
(Cтрока включает встроенный обработчик транслирующий трапы)
(Если вдруг есть такая строчка traphandle default /usr/sbin/snmptthandler – удаляем ее)
(Строчку [snmp] logoption f /var/log/snmptrap.log тоже можно удалить или закомментировать, что бы не собирались лишние логи)
Останавливаем демон SNMPTRAPD. Например с помощью Kill.
Теперь запускаем SNMPTRAPD вот так:
# /usr/local/sbin/snmptrapd -On -c /etc/snmp/snmptrapd.conf
После запуска snmptrap будет предупреждение
Loaded the SNMPTT embedded snmptrapd handler
Значит, все верно запущено – SNMPTRAPD будет работать с SNMPTT в Embedded handler режиме.
Проверяем:
# snmptrap -v 1 -c public  127.0.0.1 '.1.3.6.1.2.1.2.2.1.8.1' '10.200.72.43'  3 0 '557' .1.3.6.1.2.1.2.2.1.8.1 i 2
В файле /var/log/snmptt/snmptt.log должен отобразиться принятый трап.
Для дальнейшего запуска демона SNMPD и SNMPTT использовать:
# /usr/local/sbin/snmpd -c /etc/snmp/snmpd.conf
# /usr/local/sbin/snmptrapd -On -c /etc/snmp/snmptrapd.conf
Эти команды лучше добавить в файл /etc/rc.local
# nano /etc/rc.local
Добавляем в конец файла:
/usr/local/sbin/snmpd -c /etc/snmp/snmpd.conf
/usr/local/sbin/snmptrapd -On -c /etc/snmp/snmptrapd.conf

19. Устанавливаем репозитарий для установки Zabbix 2.4
#  rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
Производим установку пакетов zabbix
# yum install zabbix-server-mysql zabbix-web-mysql
# yum install zabbix-agent

20. Подготавливаем базу данных MySQL для работы с zabbix. Создаем базу данных и пользователя zabbix, который будет работать с базой данных. Заливаем схемы таблиц в базу данных
# mysql -uroot -p
mysql> create database zabbix character set utf8;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
(пользователь zabbix с паролем zabbix будет работать с базой данных zabbix)
mysql> exit
# cd /usr/share/doc/zabbix-server-mysql-2.4.5/create/
# mysql -uroot -p zabbix < schema.sql
# mysql -uroot -p zabbix < images.sql
# mysql -uroot -p zabbix < data.sql

21. Вносим корректировки в файл конфигурации Zabbix-сервера zabbix_server.conf
# nano /etc/zabbix/zabbix_server.conf
Правим следующие строки:
DBHost=localhost (установлено по умолчанию)
DBName=zabbix (установлено по умолчанию)
DBUser=zabbix (установлено по умолчанию)
DBPassword=zabbix (по умолчанию пусто)

22. Запускаем Zabbix сервер и добавляем в автоконфигурацию
# service zabbix-server start
# chkconfig zabbix-server on

23. Вносим изменения в файл /etc/httpd/conf.d/zabbix.conf, определяющий работу WEB-интерфейса Zabbix в сервере apache
# nano /etc/httpd/conf.d/zabbix.conf
Ищем строчку
# php_value date.timezone Europe/Riga
раскомментируем ее и меняем на
php_value date.timezone Europe/Moscow 
Рестартуем сервис Apache
# service httpd restart

24. Все, Zabbix установлен. Теперь можно обратиться к нему по адресу http://<ip адрес>/zabbix и выполнить первоначальную конфигурацию.

  

Нажимаем Next >>
Здесь проверяем, что бы не было никаких сообщений о ошибках. Нажимаем Next >>
Выбираем базу MySQL, вводим имя базы – zabbix, пользователя zabbix и пароль zabbix.
Нажимаем кнопку «Test connection»
 
Зеленым должно появиться сообщение «ОК». Нажимаем Next >>
Пишем какое-нибудь имя (например, svttk) в поле Name и нажимаем кнопку Next >>
Нажимаем кнопку Next >>
Нажимаем кнопку Finish >> и видим интерфейс входа в систему zabbix. 
Входим в web-интерфейс Zabbix. Параметры доступа по умолчанию - Admin/zabbix и радуемся

25. Запускаем Zabbix агент на сервере (иначе сервер Zabbix не сможет мониторить сам себя)
Открываем файл zabbix_agentd.conf и вносим в него правки
# nano /etc/zabbix/zabbix_agentd.conf
Ищем строку Server= и вписываем туда IP адрес
Server=127.0.0.1 (по умолчанию должно быть уже так)
Запускаем службу zabbix агента и добавляем ее в автозапуск
# service zabbix-agent start
# chkconfig zabbix-agent on
# service zabbix-server restart

26. Для того что бы Zabbix работал с утилитой ping (а вернее fping) выполняем следующее
# yum install fping
Ищем, куда установился fping
# find / | grep fping
У меня получилось - /usr/sbin/fping
Далее даем zabbix права на работу с fping
# chown root:zabbix /usr/sbin/fping
# chmod 710 /usr/sbin/fping
# chmod ug+s /usr/sbin/fping
Открываем файл zabbix_server.conf и проверяем в файле путь к утилите fping, найденный ранее.
# nano /etc/zabbix/zabbix_server.conf
Раскоментируем эту строчку:
FpingLocation=/usr/sbin/fping 
Рестартуем сервер zabbix
# service zabbix-server restart

27. Для того что бы в Zabbix работали внешние скрипты, (созданные нами) выполняем следующее:
Открываем файл /etc/zabbix/zabbix_server.conf и узнаем там, куда нужно положить внешний скрипт:
# nano /etc/zabbix/zabbix_server.conf
Ищем строку, начинающуюся с ExternalScripts:
ExternalScripts=/usr/lib/zabbix/externalscripts
Видим, что искомый пусть – это /usr/lib/zabbix/externalscripts
Помещаем туда скрипт, например скрипт sakura2_alarm.php
# cp /mnt/sakura2/sakura2_alarm.php /usr/lib/zabbix/externalscripts/
Даем права Zabbix-у работать с эти скриптом:
# chown root:zabbix /usr/lib/zabbix/externalscripts/sakura2_alarm.php
# chmod ug+s /usr/lib/zabbix/externalscripts/sakura2_alarm.php
# chmod 755 /usr/lib/zabbix/externalscripts/sakura2_alarm.php
Теперь этот скрипт можно добавить в Zabbix в раздел Администрирование – Скрипты.

28. Для того что бы Zabbix работал с SNMP trap-ами необходимо следующее:
Открываем файл /etc/zabbix/zabbix_server.conf и ищем там разделы SNMP
# nano /etc/zabbix/zabbix_server.conf
### Option: SNMPTrapperFile
#Temporary file used for passing data from SNMP trap daemon to the server.
#Must be the same as in zabbix_trap_receiver.pl or SNMPTT configuration file.
#
# Mandatory: no
# Default:
# SNMPTrapperFile=/tmp/zabbix_traps.tmp

SNMPTrapperFile=/var/log/snmptt/snmptt.log

### Option: StartSNMPTrapper
# If 1, SNMP trapper process is started.
#
# Mandatory: no
# Range: 0-1
# Default:
# StartSNMPTrapper=0
StartSNMPTrapper=1
Обращаем внимание на путь к логам SNMP -  /var/log/snmptt/snmptt.log
Этот путь к логам сервиса SNMPTT.
Затем добавляем строчку
StartSNMPTrapper=1
Рестартуем сервер zabbix
# service zabbix-server restart

ПРИМЕЧАНИЕ: для того что бы Zabbix корректно читал SNMP trap-ы падения и поднятия портов, формат логов нужно задать в файле /etc/snmp/snmptt.conf
# nano /etc/snmp/snmptt.conf
Вписываем туда:
EVENT LinkDown .1.3.6.1.6.3.1.1.5.3 "LinkDown" Normal
FORMAT ZBXTRAP $aA $1 port
EVENT LinkUp .1.3.6.1.6.3.1.1.5.4 "LinkUp" Normal
FORMAT ZBXTRAP $aA $1 port
Строки, собирающие все трапы комментируем:
# EVENT SamaraAlarm .1.* "all" Normal
# FORMAT $+* TEST $aA $1
Рестартуем SNMPTT
# service snmptt restart
Теперь при падении и поднятии 3 порта на свиче 10.200.72.43 в логах (файл /var/log/snmptt/snmptt.log) должно появиться:
22:08:19 2015/06/05 .1.3.6.1.6.3.1.1.5.3 Normal "LinkDown" 10.200.72.43 - ZBXTRAP 10.200.72.43 3 port
22:08:41 2015/06/05 .1.3.6.1.6.3.1.1.5.4 Normal "LinkUp" 10.200.72.43 - ZBXTRAP 10.200.72.43 3 port
Этот формат удовлетворителен, для чтения трапов zabbix-ом.

==========================

Для увеличения быстродействия сервера Zabbix выполнить:

В файле конфига etc/zabbix/zabbix_server.conf были раскоментированны и изменены следующие параметры
StartPingers=25 Старое значение 1
CacheSize=512M Старое знаечение 8M
StartPollersUnreachable=5 сатрое значение 1

==========================

Для мониторинга всяких китайских железок необходимо, чтобы флаг DF (флаг фрагментации) в IP пакете не ставился. 
В linux этот флаг ставится по умолчанию.
Необходимо запретить установку флага DF командой:
echo 1 > /proc/sys/net/ipv4/ip_no_pmtu_disc
и записать эту команду в файл /etc/rc.local


=============================================

Уменьшаем размер файла /var/log/messages на сервер Zabbix

1. Для отключения логирования SNMPtrap-ов в это файл запусаем демон SNMPTRAPD с опцией Ln

/usr/local/sbin/snmptrapd -On -Ln -c /etc/snmp/snmptrapd.conf
Добавляем эту строчку в /etc/rc.local

2. В настройках демона SNMPTT выключаем логирование в файлы syslog и messages:
nano /etc/snmp/snmptt.ini
syslog_enable = 0
Не забываем рестартовать snmptt
service snmptt restart

3. Настраиваем, что бы глобальный лог /var/log/messages хранился только 2 недели (по умолчанию -4)
Открываем файл
nano /etc/logrotate.conf
Исправляем строчку
с
rotate 4
на

rotate 2