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

вторник, 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

воскресенье, 30 марта 2025 г.

Прописание маршрута с указанием IP source в Linux

Если Linux машина имеет несколько IP интерфейсов, то создавать статический маршрут правильно с привязкой к определенному исходному IP-адресу (src)
Если используется NetworkManager, то делается это утилитой nmcli.

1. Необходимо узнать имена интерфейсов и принадлежность IP адреса интерфейсу.
Это делается командами:
1.1.
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 172.31.0.3/28 brd 172.31.0.15 scope global noprefixroute ens18
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.63.70.170/29 brd 10.63.70.175 scope global noprefixroute ens19

1.2
# nmcli con
NAME    UUID                                  TYPE      DEVICE
ens18  95fdeba9-6dcc-31d1-9758-879d140cbc55  ethernet  ens18
System ens19          03c4dac8-78f9-36c3-8580-d35a45e6f2ea  ethernet  ens19

Команда "ip a" покажет IP адреса и их привязку к коротким названиям интерфейсов.
Команда "nmcli con" покажет привязку коротких названий интерфейсов к полному наименованию.
В данном примере интерфейс "ens19" имеет полное имя "System ens19".
2. Прописать маршрут с заданием IP адреса источника нужно с указанием полного наименования интерфейса, вот так:
# nmcli connection modify "System ens19" +ipv4.routes "10.63.90.1/32 10.63.70.169 src=10.63.70.170"
# nmcli connection up "System ens19"

Тут прописывается маршрут на сеть 10.63.90.1/32 через gateway 10.63.70.169 c IP источника 10.63.70.170
3. Команда удаления маршрута (если потребуется):
# nmcli connection modify "System ens19" ipv4.routes ""

воскресенье, 21 апреля 2024 г.

Статические маршруты в NetworkManager. Ошибка Unable to save connection: Cannot modify a connection that has an associated rule- or rule6- file

В новых версия Linux управление сетевой конфигурацией выполняется специальной службой - NetworkManager.
Ранее в старых версиях Linux служба «network» в своей работе опиралась на конфигурационные файлы, расположенные в каталоге
/etc/sysconfig/network-scripts/
Теперь служба «NetworkManager» опирается на конфигурационные файлы в каталоге
/etc/NetworkManager/system-connections/,
а также на скрипты, расположенные в директории
/etc/NetworkManager/dispatcher.d/

Для добавления статического маршрута в NetworkManager можно воспользоваться удобной псевдографической утилитой «nmtui»
# nmtui
После запуска утилиты мы видим меню для работы с сетевыми соединениями. Выбираем «Edit a connection» и нажимаем Enter

В следующем окне выбираем сетевой интерфейс, переходим вправо и выбираем действие «Edit...» (Можно просто выбрать интерфейс и нажать Enter).

Открывается окно редактирования сетевого соединения. Переходим в раздел Routing и в пункт «Edit...»

Откроется дополнительное окно редактирования статических маршрутов. Выбираем «Add...»

Пример заполнения данных о статическом маршруте:

После применения изменений по кнопке «OK», окно редактирования маршрутов должно закрыться и мы должны попасть обратно в панель редактирования настроек интерфейса. Перемещаемся по этому окну до кнопки «OK», нажимаем Enter. Затем в разделе меню выбора интерфейса перемещаемся на кнопку «Back...» и выходим в в основное меню утилиты nmtui. Тут выбираем раздел «Quit» и выходим в консоль.

Для применения настроек нужно выполнить перезапуск службы NetworkManager
# systemctl restart NetworkManager
Статический маршрут пропишется в файл
/etc/NetworkManager/system-connections/<ИМЯ_ИНТЕРФЕЙСА>.nmconnection
Проcмотр правил маршрутизации:
# ip route
default via 10.10.49.254 dev ens18 proto static metric 100
10.10.49.0/24 dev ens18 proto kernel scope link src 10.10.49.166 metric 100
10.200.5.216 via 10.10.49.254 dev ens18 proto static metric 100


Для удаления статического маршрута, нужно опять запустить псевдографический интерфейс nmtui, зайти в раздел конфигурации нужного интерфейса, перейти в раздел «Routing», выбрать не нужный маршрут и применить команду «Remove». После этого выйти из программы nmtuui и перезапустить NetworkManager
# systemctl restart NetworkManager
Из файла /etc/NetworkManager/system-connections/<ИМЯ_ИНТЕРФЕЙСА>.nmconnection
статический маршрут пропадет, но команда ip route по прежнему будет отображать этот удаленный маршрут.
Для того что бы удалить маршрут окончательно нужно или применить команду удаления
# ip route del 10.10.49.0/24 dev ens18
Или перезапустить сетевой интерфейс вот так, чтобы не потерять управление:
# nmcli connection down enp0s3 && nmcli connection up enp0s3
В данном случае enp0s3 – это имя интерфейса.
Ну или можно просто перезагрузиться.

Если в Linux работает старая версия службы управления сетью «network», которая использует скрипты в директории /etc/sysconfig/network-scripts/, в случае добавления статического маршрута через nmtui мы получим ошибку «Unable to save connection: Cannot modify a connection that has an associated ‘rule-’ or ‘rule6-’ file». Это говорит о том, что NetworkManager не может выполнить изменение информации в файлах, лежащих в директории /etc/sysconfig/network-scripts/, а в этих директориях как раз есть что-то нужное для маршрутизации (например, правила маршрутизации в файле /etc/sysconfig/network-scripts/rule-eth1). Данное поведение не считается ошибкой (см https://bugzilla.redhat.com/show_bug.cgi?id=1384799), а говорит о том, что изменение файлов /etc/sysconfig/network-scripts/rule-* и /etc/sysconfig/network-scripts/route-* не поддерживается функционалом NetworkManager.

В этом случае можно пойти следующими путями:

1) Добавлять статические маршруты через редактирование файла
/etc/sysconfig/network-scripts/route-<ИМЯ_ИНТЕРФЕЙСА>
Пример записи в файле:
default via 10.11.90.54 table eth0
10.11.0.0/24 via 10.11.90.16

После изменения файла нужно перезагрузить службу «network»
# systemctl restart network

2) Отказаться от службы «network» и перейти на NetworkManager полностью.
# systemctl stop network
# systemctl disable network
# systemctl enable NetworkManager

В этом случае (в случае использования полностью NetworkManager) так же рекомендуется использовать службу NetworkManager-dispatcher, которая предназначена для отлова событий в системе, таких как падение или поднятие интерфейса. После наступления подобного события, связанного с сетью, благодаря службе NetworkManager-dispatcher будет запускаться скрипт из директории /etc/NetworkManager/dispatcher.d/, связанный с этим событием. Например, после поднятия интерфейса eth2, будет автоматически монтироваться шара по NFC.
Запуск службы NetworkManager-dispatcher:
# systemctl start NetworkManager-dispatcher
# systemctl enable NetworkManager-dispatcher

У NetworkManager-dispatcher есть расширение NetworkManager-dispatcher-routing-rules, которое может использовать в скриптах диспетчера старые правила описанные в файлах
/etc/sysconfig/network-scripts/route-*
/etc/sysconfig/network-scripts/rule-*
и прописывать маршруты на основе этих правил при событиях up и down интерфейсов
Установка этого расширения:
# yum makecache
# yum -y install NetworkManager-dispatcher-routing-rules





четверг, 25 января 2024 г.

Установка и настройка простого кеширующего сервера systemd-resolved

systemd-resolved — это сервис systemd для локального резолвинга DNS запросов

Часто сервис уже установлен в системе по умолчанию.
Если нет, то установка выполняется так:
# yum install systemd-resolved
# systemctl enable systemd-resolved


Проверка
# resolvectl status

Настройка DNS
# nano /etc/systemd/resolved.conf
Прописываем вышестоящие DNS, например такие
DNS=8.8.8.8 1.0.0.1

Рестарует сервис:
# systemctl restart systemd-resolved

Для того что бы система использовала локальный DNS systemd-resolved
Необходимо:
# nano /etc/resolv.conf
Прописываем единственный DNS вставив строку (остальные комментируем)
nameserver 127.0.0.53
Если в файле /etc/resolv.conf первая строка такая:
# Generated by NetworkManager
значит файл генерируется автоматически утилитой NetworkManager.
И установить DNS нужно так:
# nmcli con mod "ens18" ipv4.dns "10.10.49.99 10.101.3.12 10.101.3.11"
# systemctl restart NetworkManager
Теперь все хорошо.

Активирование режима маршрутизации в Linux

Для возможности пересылки IP пакетов через сервер Linux необходимо включить эту возможность.
По умолчанию пересылка пакетов через систему запрещена.
Для активации выполнить:

# touch /etc/sysctl.d/100-ip_forward.conf
# nano /etc/sysctl.d/100-ip_forward.conf

В файл вписываем строку:
net.ipv4.ip_forward = 1
Перезагружаемся:
# shutdown -r now

Проверка после перезагрузки:
# cat /proc/sys/net/ipv4/ip_forward
(вывод 1)
# sysctl net.ipv4.ip_forward
(вывод net.ipv4.ip_forward = 1)

понедельник, 22 января 2024 г.

Установка простого DNS сервера DNSMASQ в RockyLinux 9

Устанавливаем пакет DNSMASQ
# yum install dnsmasq

По умолчанию запущенный dnsmasq использует файл /etc/resolv.conf для установки вышестоящих DNS серверов, а файл /etc/hosts для задания своих имен.

Немного отредактируем конфигурационный файл:
# nano /etc/dnsmasq.conf
Необходимо раскомментировать директивы no-resolv и no-poll
Это запрещает брать настройки из файла /etc/resolv.conf и как-то влиять на этот файл.
no-resolv
no-poll

Затем необходимо прописать вышестоящие DNS сервера, которые теперь не берутся из /etc/resolv.conf
server=10.10.1.12
server=10.10.3.12

Раскомментируем директиву, которая отключает кэширование негативных ответов
no-negcache
Добавляем строку, определяющую, на каких интерфейсах будет работать DNS сервер.
Следующая строка заставляет сервер работать на всех интерфейсах
listen-address=0.0.0.0
При этом комментируем строку:
#interface=lo
Следующими директивами отключаем DHCP сервер на интерфейсах:
no-dhcp-interface=ens18
no-dhcp-interface=ens19

Тут ens18 и ens19 - имена интерфейсов на машине

Разрешаем доступ к серверу DNSMASQ по сети (по стандартому порту 53)
# systemctl start dnsmasq
# systemctl enable dnsmasq
# firewall-cmd --permanent --add-port=53/tcp
# firewall-cmd --permanent --add-port=53/udp
# firewall-cmd --reload


Проверка запущенных портов и возможности приема данных на портах через файрволл
# netstat -ltupn | grep dnsmasq
# firewall-cmd --list-all
# systemctl status dnsmasq


После каких либо изменений конфигурации DNSMASQ выполняем
# systemctl restart dnsmasq

Для того, что бы сам текущий сервер брал настройки из сервера DNSMASQ нужно в файл /etc/resolv.conf внести изменения.
Закомментировать все и прописать обращения к localhost
# nano /etc/resolv.conf
nameserver 127.0.0.1

Установка Squid в Linux (Rocky Linux 9)

Установка Squid Из репозитария:
$ sudo yum install squid

Проверка установки:
$ /usr/sbin/squid -v

Запуск:
$ sudo systemctl enable squid
$ sudo systemctl start squid


Файл конфигурации:
/etc/squid/squid.conf
Логи лежат в файлах:
/var/log/squid/access.log
/var/log/squid/cache.log

Открываем файл конфигурации:
$ sudo nano /etc/squid/squid.conf
Проверяем главную директиву:
http_port 3128
По умолчанию сервис squid прослушивает порт 3128 и пропускает в Интернет пакеты, которые идут на порт 3128 на все интерфейсы данного сервера.
В файле конфигурации уже прописаны приватные сети, которым разрешено пользоваться прокси-сервером. Это задается в директивах acl localnet.
Выход в интернет для сетей, перечисленных в acl localnet задается директивой:
http_access allow localnet
Директивами acl SSL_ports и acl Safe_ports описываются порты, разрешенные для запросов пользователей. Другие запросы и соединения по неизвестным портам будут блокироваться. За это отвечают директивы:
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports


Теперь открываем порт 3128 для приема обращений к прокси-серверу squid:
# firewall-cmd --permanent --add-port=3128/tcp
# firewall-cmd --reload

Проверка:
# firewall-cmd --list-all (firewall-cmd --list-all-zones)

Настроим ротацию логов squid. Будем проводить ротацию ежемесячно. Сжатые логи за последние три месяца будем хранить.
Настройки выполняются тут: /etc/logrotate.d/squid
# nano /etc/logrotate.d/squid
В файле, имеющемся по умолчанию, меняется только директива monthly, говорящая о том, что логи будут сжиматься ежемесячно.
И меняется директива rotate 3 (по умолчанию 5), которая говорит о том, что после сжатия будет храниться 3 экземпляра логов (то есть за три месяца).
Полный файл конфигурации ротации логов:
/var/log/squid/*.log {
   #Ежемесячная ротация
   monthly
   #Хранить три архива до удаления
   rotate 3
   compress
   delaycompress
   notifempty
   missingok
   nocreate
   sharedscripts
   postrotate
   # Asks squid to reopen its logs. 
   #(logfile_rotate 0 is set in squid.conf)
   # errors redirected to make it silent if squid is not running
      /usr/sbin/squid -k rotate 2>/dev/null
   endscript
}



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

Настройка сервера Linux для работы через прокси-сервер:

Для работы утилиты wget:
# nano /etc/wgetrc
Добавляем после
#https_proxy = http://proxy.yoyodyne.com:18023/
#http_proxy = http://proxy.yoyodyne.com:18023/
http_proxy = http://10.10.0.27:3128/
https_proxy = http://10.10.0.27:3128/

Раскомментируем:
use_proxy = on

Для работы yum и dnf
# nano /etc/yum.conf (или /etc/dnf/dnf.conf)
Добавить к конец:
proxy=http://10.10.0.27:3128/

Для работы curl, pip, composer:
# nano /etc/environment
HTTP_PROXY=http://10.10.0.27:3128
HTTPS_PROXY=http://10.10.0.27:3128

четверг, 6 октября 2022 г.

Rocky Linux 9 в качестве виртуальной машины в Oracle VM VirtualBox.

После создания машины Linux в VirtualBox и установки Rocky Linux 9, при загрузке  выдается ошибка:

# journalctl -b -p err
Oct 06 18:22:28 localhost systemd-vconsole-setup[213]: /usr/bin/loadkeys failed with exit status 1.
Oct 06 18:22:28 localhost systemd[1]: Failed to start Setup Virtual Console.
Oct 06 18:22:29 localhost kernel: Warning: Unmaintained hardware is detected:  e1000:100E:8086 @ 0000:00:03.0
Oct 06 18:22:37 localhost kernel: [drm:vmw_host_printf [vmwgfx]] *ERROR* Failed to send host log message.

# systemctl status systemd-vconsole-setup
× systemd-vconsole-setup.service - Setup Virtual Console
     Loaded: loaded (/usr/lib/systemd/system/systemd-vconsole-setup.service; static)
     Active: failed (Result: exit-code) since Thu 2022-10-06 18:22:28 +04; 11min ago
       Docs: man:systemd-vconsole-setup.service(8)
             man:vconsole.conf(5)
   Main PID: 213 (code=exited, status=1/FAILURE)
        CPU: 189ms
Oct 06 18:22:28 localhost systemd-vconsole-setup[218]: loadkeys: Unable to open file: ru: No such file or directory
Oct 06 18:22:28 localhost systemd-vconsole-setup[213]: /usr/bin/loadkeys failed with exit status 1.
Oct 06 18:22:28 localhost systemd[1]: systemd-vconsole-setup.service: Main process exited, code=exited, status=1/FAILURE
Oct 06 18:22:28 localhost systemd[1]: systemd-vconsole-setup.service: Failed with result 'exit-code'.
Oct 06 18:22:28 localhost systemd[1]: Failed to start Setup Virtual Console.
Notice: journal has been rotated since unit was started, output may be incomplete.


Решение проблемы:
# dnf install kbd-legacy
# dracut -f
(выполняется несколько минут)


Еще одна возможная ошибка при загрузке Rocky Linux 9 на платформе VirtualBox:
Oct 06 18:40:22 localhost kernel: [drm:vmw_host_printf [vmwgfx]] *ERROR* Failed to send host log message.
Данная ошибка исправляется выставлением типа Графического контроллера в параметрах Дисплея виртуальной машины.
Нужно поставить Графический контроллер "VBoxVGA"


Следующая ошибка говорит о неверном драйвере для сетевого адаптера:
Oct 06 18:40:15 localhost kernel: Warning: Unmaintained hardware is detected:  e1000:100E:8086 @ 0000:00:03.0
Ошибка связана с сетевой картой Intel типа (e1000:100E) в VirtualBox и драйвером 0000:00:03.0
# ethtool -i enp0s3
driver: e1000
version: 5.14.0-70.13.1.el9_0.x86_64
firmware-version:
expansion-rom-version:
bus-info: 0000:00:03.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

В исправлении этой ошибки испробованы следующие методы:
1) Отключение механизмов: GSO (Generic Segmentation Offload), TSO (TCP Segmentation Offload) и GRO (Generic Receive Offload) на сетевом интерфейсе:
# ethtool -K enp0s3 gso off gro off tso off
2) Отключение генерации контрольных сумм:
# ethtool -K enp0s3 tx off rx off
Actual changes:
tx-checksum-ip-generic: off

tx-tcp-segmentation: off [not requested]
3) Отключение в настройках Системы виртуальной машины VirtualBox
В Дополнительных возможностях параметра "Включить I/O APIC".
После отключения данного параметра ошибки при загрузке системы исчезли.


Настройка сети в RockyLinux 9

Для настройки сети используется графический инструмент NetworkManager, под названием NMTUI. Запуск интерфейса из командной строки:
# nmtui
Откроется меню:
 


Выбираем первый пункт «Edit a connection» и нажимаем Enter. Откроется меню выбора интерфейса. Выбираем интерфейс, переходим на кнопку <Edit…> и нажимаем Enter.



Откроется окно редактирования сетевых параметров интерфейса. Для статического задания IP адреса на интерфейсе устанавливаем IPv4 CONFIGURATION в значение <Manual>. После этого можно будет задать:

Addresses – IP адрес и маску сети
Gataway – Шлюз сети
DNS Servers – IP адреса DNS серверов.

Опционально можно задать Routing  - маршруты через данный интерфейс.
Четыре опции (галочки) оставляем пустыми.

Never use this network for defaul route (Не использовать эту сеть для текущего маршрута)
Ignore automaticaliy obtained routes (Игнорировать автоматически полученные маршруты)
Ignore automaticaliy obtained DNS parametrs (Игнорировать автоматически полученные параметры DNS)
Require IPv4 addressing for this connection (Соединение требует адресации IPv4)

IPv6 CONFIGURATION можно установить в <Disabled>
Следующие галочки устанавливаем:

Automatically connect (Подключаться автоматически)
Available to all users (Доступно всем)


Переводим курсор на <OK> и нажимаем Enter. При этом мы вернемся в предыдущее меню. Выбираем “Activate a connection”, открывается меню, где можно активировать или деактивировать соединение. Для выхода из этого окна используем кнопку <back>


Возвратившись в основное меню, выбираем Quit. После этого произойдет возврат к консоли.

Проверить корректность изменений можно командами:
# ip a
# nmcli device show

вторник, 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
Вид графика:
 




суббота, 25 июня 2022 г.

RockyLinux 8. Установка Prometheus. node_exporter. Grafana.

Prometheus – это система сбора статистики с элементами мониторинга, использующая собственную эффективную базу данных для хранения информации. По умолчанию база хранить данные за последние 14 дней, что для оперативного мониторинга состояния вполне достаточно.
Prometheus – это не законченное решение по типу Zabbix. Это высокопроизводительный каркас, к которому можно прикрутить и триггер событий, и web-dashboard, и красивую форму аналитики. Обычно в качестве web-dashboard для просмотра текущих метрик Prometheus используют Grafana.
Сайт проекта: https://prometheus.io/

Система Prometheus состоит из серверной части (базы данных) и так называемых экспортеров (exporter). Экспортеры занимаются опросом и подготовкой метрик для серверной части. Серверная часть с установленной периодичностью (по умолчанию 5 секунд) обращается к экспортерам и забирает оттуда готовые метрики для вставки в базу данных. Существует так же режим pull, когда собранные данные отправляются сразу в серверную часть без участия экспортера. Перечень типовых экспортеров можно найти на странице: https://prometheus.io/docs/instrumenting/exporters/. Для сбора данных с серверов Linux используется обычно экспортер под названием «node_exporter». Каждый модуль системы grafana скачивается и собирается на сервере отдельно. Установить Prometheus с использованием пакетного менеджера нельзя.

Установка Prometheus.

Сервер Prometheus использует для работы порт TCP 9090. Этот же порт использует WEB- dashboard Cockpit встроенный в Rocky Linux 8.
Отключим WEB- dashboard Cockpit:
# systemctl stop cockpit.socket
# systemctl disable cockpit.socket

Переходим на страницу загрузки Prometheus
https://prometheus.io/download/
В разделе prometheus ищем стабильный релиз для Linux. alpha, rc, beta и прочие релизы отметаем.
Копируем ссылку на файл архива.
Например, https://github.com/prometheus/prometheus/releases/download/v2.33.5/prometheus-2.33.5.linux-amd64.tar.gz

Переходим в консоль сервера, на котором будем выполнять установку серверной части Prometheus. Сначала создаем пользователя и группу prometheus, под которым будет работать сервис Prometheus
# useradd -M -r -s /bin/false prometheus
Ключ -M: пользователь не имеет домашней директории
Ключ -s /bin/false запрещает пользователю входить в консоль
Ключ -r создает системную группу

Скачиваем и распаковываем архив по ссылке скопированной ранее
# cd /usr/src/
# wget https://github.com/prometheus/prometheus/releases/download/v2.33.5/prometheus-2.33.5.linux-amd64.tar.gz
# tar zxvf prometheus-2.33.5.linux-amd64.tar.gz
# cd prometheus-2.33.5.linux-amd64

Создаем дополнительные директории для работы сервиса Prometheus и раскладываем файлы из архива по системе Linux:
# mkdir /etc/prometheus
# mkdir /var/lib/prometheus
Бинарные файлы копируем в директорию исполняемых файлов:
# cp prometheus promtool /usr/local/bin/
Конфигурационные файлы в соответствующую директорию:
# cp -r console_libraries consoles prometheus.yml /etc/prometheus
Главный конфигурационный файл получился тут: /etc/prometheus/prometheus.yml

Определяем права для скопированных файлов и и созданных директорий:
# chown -R prometheus:prometheus /etc/prometheus
# chown -R prometheus:prometheus /var/lib/prometheus
# chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}

Проверочный запуск:
# /usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml
Запуск должен завершиться сообщением:
level=info msg="Server is ready to receive web requests."
Теперь к интерфейсу можно подключиться так:
http://<IPадрес>:9090/graph
Встроенный WEB-интерфейс серверной части Prometheus выглядит так:

 

Остановка сервиса в консоли выполняется командой CTRL+C

Для запуска Prometheus в автоматическом режиме нужно создать unit system в Linux
# touch /etc/systemd/system/prometheus.service
# nano /etc/systemd/system/prometheus.service
Содержимое файла:
[Unit]
Description=Prometheus Time Series Collection and Processing Server
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Затем:
# systemctl daemon-reload
Запускаем сервис:
# systemctl enable prometheus
# systemctl start prometheus
Просмотр статуса сервиса:
# systemctl status prometheus.service


Установка node_exporter.

Служба node_exporter предназначена для сбора по запросу Prometheus основных данных с сервера Linux, преобразование в формат удобный для базы Prometheus и передача данных в базу.

Для установки экспортера nose_exporter копируем ссылку со страницы загрузки https://prometheus.io/download/#node_exporter. Например, это может быть ссылка:
https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
Из консоли сервера, который будем мониторить, выполняем команды загрузки файла архива на сервер. Затем производим распаковку:
# cd /usr/src/
# wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
# tar zxvf node_exporter-1.3.1.linux-amd64.tar.gz
Копируем файл node_exporter в директорию с исполняемыми файлами:
# cp node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/node_exporter

Создаем пользователя node_exporter под которым будет работать утилита node_exporter.
# useradd -M -r -s /bin/false node_exporter
# chown node_exporter:node_exporter /usr/local/bin/node_exporter

Создаем unit systemd для автозапуска сервиса в Linux
# nano /etc/systemd/system/node_exporter.service
Содержимое файла:
[Unit]
Description=Node Exporter Service for Prometheus
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Активируем юнит:
# systemctl daemon-reload
# systemctl start node_exporter
# systemctl enable node_exporter

Теперь метрики могут собираться с данного сервера с порта 9100
Проверка того, что порт 9100 открыт и используется:
# netstat -ltupn | grep 9100
К порту можно обратиться теперь так:
http://<IPадрес>:9100/metrics
Пример ответа:


Теперь сервис Prometheus нужно научить обращаться к экспортеру «node_exporter».
Для этого на сервере Prometheus необходимо внести правки к конфигурационный файл prometheus.yml
# nano /etc/prometheus/prometheus.yml
В раздел «scrape_configs:» добавляем ссылки на метрики, которые генерируют node_exporter
  - job_name: 'node_exporter_clients'
    scrape_interval: 5s
    static_configs:
      - targets: ['10.10.8.2:9100','10.10.1.2:9100']

Тут для примера показано, что сервису Prometheus нужно с периодичностью 5 секунд опрашивать экспортеры, работающие на адресах 10.10.8.2:9100 и 10.10.1.2:9100.
Для применения изменений сервис Prometheus нужно перезапустить:
# systemctl restart prometheus

Для просмотра значения метрик можно использовать уже встроенный WEB-интерфейс Prometheus http://<IPадрес>:9090/graph
Примеры метрик, которые можно получать в интерфейсе Prometheus
node_memory_MemFree_bytes
node_cpu_seconds_total
node_filesystem_avail_bytes
rate(node_cpu_seconds_total{mode="system"}[1m])
rate(node_network_receive_bytes_total[1m])
rate(node_network_transmit_bytes_total[1m])
Метрику нужно ввести в поисковый запрос и переключиться на вкладку Graph. Пример:



Но обычно для просмотра метрик используют что-то более дружелюбное и красивое – например Grafana.

Установка Grafana.

Grafana представляет собой красивый и удобный web-интерфейс для чтения метрик из Prometheus. Установка выполняется через rpm.
# yum install https://dl.grafana.com/oss/release/grafana-8.0.5-1.x86_64.rpm
# systemctl daemon-reload
# systemctl start grafana-server
# systemctl enable grafana-server

Grafana сервер работает на порту 3000. Проверить то, что порт открыт на сервере нужно так:
# netstat -ltupn | grep 3000
Обратиться к серверу можно теперь так:
http://<IPадрес>:3000/ 


По умолчанию данные для входа admin / admin
После первого входа сразу будет предложено сменить пароль.
После чего стартовая страница Grafana будет выглядеть так:

Добавляем источник данных DATA SOURCES. Выбираем Prometheus (если его нет среди предложенных, то используем поисковую строку)


Затем вписываем в поле URL путь сервису Prometheus. Например, «http://10.10.49.166:9090»
Нажимаем "Save&test" (внизу страницы)

На завершающем этапе нужно создать Dashboard. Это можно сделать вручную по нужным метрикам. Или Dashboard можно импортировать с сайта https://grafana.com/grafana/dashboards/ . Тут есть множество готовых dashboard.
Самый полный для node_exporter - это "Node Exporter Full"
Его URL - https://grafana.com/grafana/dashboards/1860
В конце URL есть число. Это ID готового dashboard. Запоминаем ID 1860.
В Grafana выбираем Import, в поле "Import via grafana.com" вписываем 1860, нажимаем Load
 


Затем выбираем источник Prometheus и dashboard будет создан в системе Grafana.
Теперь к dashboard можно обратиться через раздел Manage  General и выбрать Node Exporter Full


Откроется панель отображения параметров сервера:

 
Вверху слева можно выбирать интересующий сервер из выпадающего списка.









вторник, 14 июля 2020 г.

Настройка сети на ПК с LUBUNTU

Настройка сети на ПК с LUBUNTU

Проверка названия интерфейсов:
$ ip a                                                                                                             
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000                                 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00                                                                   
    inet 127.0.0.1/8 scope host lo                                                                                          
       valid_lft forever preferred_lft forever                                                                              
    inet6 ::1/128 scope host                                                                                                
       valid_lft forever preferred_lft forever                                                                              
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000                       
    link/ether c8:cb:b8:1a:58:01 brd ff:ff:ff:ff:ff:ff                                                                      
    inet 10.10.49.226/24 brd 10.10.49.255 scope global noprefixroute enp1s0                                                 
       valid_lft forever preferred_lft forever                                                                              
    inet6 fe80::cacb:b8ff:fe1a:5801/64 scope link
       valid_lft forever preferred_lft forever


Проверка наличия в системе сетевых адаптеров:
$ lshw -C network
WARNING: you should run this program as super-user.
  *-network                
       description: Ethernet interface
       product: RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
       vendor: Realtek Semiconductor Co., Ltd.
       physical id: 0
       bus info: pci@0000:01:00.0
       logical name: enp1s0
       version: 0c
       serial: c8:cb:b8:1a:58:01
       size: 100Mbit/s
       capacity: 1Gbit/s
       width: 64 bits
       clock: 33MHz
       capabilities: bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=r8169 duplex=full firmware=rtl8168g-2_0.0.1 02/06/13 ip=10.10.49.226 latency=0 link=yes multicast=yes port=MII speed=100Mbit/s
       resources: irq:31 ioport:e000(size=256) memory:fea00000-fea00fff memory:d0800000-d0803fff
  *-network
       description: Network controller
       product: BCM43228 802.11a/b/g/n
       vendor: Broadcom Inc. and subsidiaries
       physical id: 0
       bus info: pci@0000:02:00.0
       version: 00
       width: 64 bits                                                                                                       
       clock: 33MHz                                                                                                         
       capabilities: bus_master cap_list                                                                                    
       configuration: driver=bcma-pci-bridge latency=0                                                                      
       resources: irq:33 memory:fe900000-fe903fff                                                                           
WARNING: output may be incomplete or inaccurate, you should run this program as super-user.        


Для прописывания статического IP адреса на интерфейсе в UBUNTU используется утилита netplan
Файл конфигурации находиться в директории /etc/netplan/. Он может иметь разное имя, у меня назывался так: 01-network-manager-all.yaml
# nano /etc/netplan/01-network-manager-all.yaml
Пример файла конфигурации для статического интерфейса:
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp1s0:
      addresses: [10.10.49.226/24]
      gateway4: 10.10.49.254
      dhcp4: no
      dhcp6: no
      nameservers:
        addresses: [10.10.50.2,46.20.64.1]


Проверка конфигурации netplan, выполняется командой:
# netplan try
Если в файле конфигурации есть ошибки, утилита покажет место ошибки, если ошибок нет, то выдаст предупреждение с обратным отсчетом применения. Для применения настроек нужно нажать ENTER.
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 117 seconds
Configuration accepted.