Мониторинг сети linux
Содержание:
Введение
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
- Установка CentOS 8.
- Настройка CentOS 8.
- Установка и настройка zabbix сервера.
То же самое на Debian 10, если предпочитаете его:
- Установка Debian 10.
- Базовая настройка Debian.
- Установка и настройка zabbix на debian.
В заббикс существуют различные способы получать данные для мониторинга. Наиболее распространенные источники информации:
- Zabbix агент. Устанавливается на наблюдаемую машину и отправляет данные на сервер мониторинга.
- SNMP агент. Чаще всего присутствует на устройстве, либо может быть установлен на сервер.
- Простые проверки — simple check. Выполняются непосредственно на сервере zabbix с помощью встроенных инструментов, не требуют дополнительных действий со стороны хоста.
- Внешние проверки — external checks. Как и простые проверки выполняются на сервере мониторинга, но не встроенными средствами, а внешними скриптами.
Есть и другие способы получения данных. Не буду их все перечислять, ознакомиться с ними можно в соответствующем разделе официальной документации. В нашем случае мы воспользуемся первыми двумя способами для мониторинга служб и сервисов в linux.
Тут можно пойти разными путями. Меня интересует мониторинг различных линукс служб, работающих как локально (samsdaemon, postgrey) в пределах конкретного сервера, так и для публичного доступа по сети, в частности squid, smtp, imap, http. Первое, что пришло в голову, это использовать итем с ключом service_state[]. Но как оказалось, этот тип данных снимает значения только с системных служб windows. Я не сразу это понял и некоторое время повозился в консоли, не понимая, почему при тестировании значения получаю сообщение, что данный item не поддерживается:
# zabbix_agent -t service_state service_state
Дальше придумал через UserParameter запускать какой-нибудь скрипт, который будет проверять запущен ли сервис в системе или нет. Например с помощью ps ax | grep squid. В принципе, рабочий вариант, но мне казалось, что такую простую задачу можно решить проще и быстрее, без создания на каждом хосте скрипта и изменения файла конфигурации. И я не ошибся. Есть 2 различных способа мониторинга служб (сервисов) в linux с помощью zabbix. Рассмотрим первый из них.
Где хранить коллекцию лютневой музыки
Если ты хоть раз размечал диск руками (например, при установке Arch Linux), то наверняка знаешь о существовании утилиты . С ее помощью проще всего посмотреть разделы на этом самом диске:
| 1 | $sudo fdisk-l |
Есть ее более развесистая версия с псевдографическим интерфейсом, называется cfdisk, а также еще пара утилит, которые, на первый взгляд, делают весьма похожие вещи — позволяют управлять разделами на дисках. Это parted (к которому, кстати, есть неплохой GUI на GTK в лице gparted) и gdisk. Наличие такого зоопарка связано с тем, что существует несколько вариантов структурирования разделов на диске, и исторически для разных вариантов использовались разные программы. Наверняка ты уже встречал такие аббревиатуры, как MBR и GPT. Я не буду подробно останавливаться на различиях, но почитать можно, например, в статье «Сравнение структур разделов GPT и MBR». Там оно обсуждается с позиции настройки Windows, но суть от этого не меняется. И да, в современном же мире fdisk уже умеет работать с обоими вариантами, как и parted, поэтому выбирать можно исключительно из личных предпочтений.
Но вернемся к сбору информации. Мы знаем, какие у нас разделы, а теперь давай взглянем на дерево файловой системы, точнее, что куда смонтировано:
| 1 | $df-h |
Как и раньше, тут отвечает за «человеческий» вывод размеров. Ну и как ты помнишь, размеры файлов у нас можно посмотреть командой :
| 1 | $du-h/path/to/folder |
Наверняка часть читателей сейчас подумала: «Ну что за банальщина, это даже школьники знают, давай чего посвежее». Ладно, давай привнесем реалтайма, как уже делали с оперативкой:
| 1 | $iostat-xz1 |
Эта команда выводит средние значения количества операций чтения-записи для всех блочных устройств в системе, обновляя информацию раз в секунду. Это больше «железные» параметры, поэтому есть еще одна команда для просмотра статистики I/O попроцессно, и она, по аналогии, называется iotop.
| 1 | $sudo iotop |
При попытке запуска без прав root она начнет очень мило оправдываться, что, мол, есть один такой баг CVE-2011-2494, который может приводить к утечке потенциально важных данных от одних пользователей другим, «поэтому настрой-ка ты, дружочек, sudo». Оно и верно.
Мониторинг сети с помощью других утилит
Самая мощная программа для мониторинга сети — это iptraf. Она предоставляет всю необходимую для администраторов информацию. Но, кроме нее, существуют и другие продукты. Рассмотрим их более подробно.
1. iftop
Утилита имеет более простой интерфейс и отображает намного меньше информации. Она выводит ip адреса отправителя и получателя, а также количество переданных или полученных данных за несколько последних секунд:

Установить программу в Ubuntu можно командной:

Хотя здесь отображается информация по каждому соединению, программа не может идентифицировать программу, которая создает пакеты.
2. nload
nload — это очень простая утилита, которая отображает только скорость входящих и исходящих соединений. Это позволяет сделать примитивный анализ сети linux и определить нагрузку. Отображается текущая скорость, максимальная и минимальная скорость за период работы. Также данные о скорости выводятся в виде графика, поэтому вам будет достаточно беглого взгляда, чтобы понять что происходит.

Для установки программы в Ubuntu используйте команду:
3. nethogs
Nethogs — это достаточно интересная утилита для мониторинга сетей, которая выделяется среди других. С помощью нее можно посмотреть какой процесс создает тот или иной трафик. Здесь отображаются PID процессов и имена пользователей, отсортированные по занимаемой пропускной способности сети:

Программа, как и другие доступна из официальных репозиториев, поэтому у вас не возникнет проблем с установкой:
4. bmon
Утилита bmon позволяет отображать достаточно подробно статистику по каждому сетевому интерфейсу. Она работает похоже на nload и выводит график кроме текстовой информации:

Для установки программы выполните:
5. Vnstat
Vnstat отличается от всех инструментов, рассмотренных выше. Программа работает постоянно в фоновом режиме и собирает информацию об использовании сети в лог файл. Далее можно посмотреть какой была нагрузка за определенный период. Для установки утилиты выполните:
Далее необходимо запустить сервис, для этого выполните такую команду:

Далее необходимо немного подождать, пока утилита соберет данные и можно просматривать статистику:

Здесь будет отображаться информация о нагрузке на сеть с указанием дат и периодов. Также вы можете посмотреть доступную информацию в реальном времени. Для этого используйте опцию -l:

Видео про использование и настройку vnstat:
6. bwm-ng
Это еще одна утилита, очень простая в использовании, которая позволяет следить за сетевой нагрузкой в режиме реального времени. Отображаются все доступные сетевые интерфейсы в системе:

Для установки утилиты выполните такую команду:
7. speedometer
Это еще один простой инструмент, который позволяет выполнить мониторинг сети и выводит данные в виде красивых графиков. Для установки программы выполните:
Как видите, она есть в официальных репозиториев не всех дистрибутивов, зато вы можете установить программу из репозитория python.

Опция -r указывает интерфейс, с которого необходимо отображать количество полученных пакетов, а опция -t — отправленных.
8. netwatch
Netwatch — это небольшая утилита, которая входит в набор инструментов Netdiag и показывает сетевые соединения между локальной и удаленными системами, а также скорость, с которой будут передаваться данные. Для установки программы используйте:
Затем для запуска:
9. ifstat
Утилита ifstat показывает пропускную способность сети, измеряя количество переданных и принятых пакетов. Вывод утилиты можно использовать и анализировать в других программах. Утилита не выводит информацию об ip адресах или других параметрах, а только скорость. Для установки используйте:
Для запуска:

10. trafshow
Это утилита, очень похожа на iftop, которая отображает не только скорость передачи, но и сами соединения. Здесь выводится информация по соединениях, размеры пакетов и протокол. Для установки программы наберите:
Осталось запустить программу:

Файлы, которых нет
Если говорить совсем откровенно, в Linux основным источником информации как о процессах, так и о железе служит именно файловая виртуальная файловая система ), а также . И у них довольно богатая и интересная история.
Дело в том, что одно из официальных положений идеологии UNIX гласит: «Всё есть файл», то есть взаимодействие с любым системным компонентом теоретически должно вестись через реальный или виртуальный файл, доступный через обычное дерево каталогов. Эту идею до абсолюта довели в наследнике UNIX под названием Plan 9, где все процессы превратились в каталоги и взаимодействовать с ними можно было даже посредством команд и , поскольку они были текстовыми. Именно так появилась файловая система procfs, которая позже перекочевала в Linux и BSD.
Но, как и в случае с load average, конкретно в Linux есть свои тонкости (это я так политкорректно называю адскую кашу-малашу). Например, линуксовый , вопреки названию, с самого начала был универсальным интерфейсом получения информации от ядра в целом, а не только от процессов. Более того, именно взаимодействовать с процессами через эту систему практически не получается, только извлекать информацию по их PID’ам.
С течением времени в появлялось все больше и больше файлов, содержащих информацию о самых разных подсистемах ядра, железе и многом другом. В конечном итоге он превратился в помойку, и разработчики решили вынести информацию хотя бы о железе в отдельную файловую систему, которую к тому же можно было бы использовать для формирования каталога . Так и появилась со своей странной структурой каталогов — ее трудно разгребать вручную, но она очень удобна для автоматического анализа другими приложениями (такими как udev, который и формирует содержимое каталога на основе информации из ).
В итоге куча информации до сих пор дублируется в и просто потому, что, если выкинуть файлы из , можно сломать некоторые фундаментальные системные компоненты (легаси!), которые до сих пор не переписаны.
Ну а еще есть , конечно же. Это файловая система, которая монтируется одной из первых и служит перевалочным пунктом для данных рантайма основных системных демонов, в частности udev и systemd (о нем поговорим отдельно чуть позже). Кстати, сам проект udev в 2012 году влился в systemd и дальше развивается как его часть.
В общем, как писал Льюис Кэрролл, «все чудесатее и чудесатее».
Но вернемся к нашим замерам. Для того чтобы смотреть, какие PID присвоены процессам, есть команды и (из одноименного пакета, более продвинутая версия top, заодно показывает чертову прорву всего, аналог графического диспетчера задач).
Кроме того, команда time позволяет запустить процесс, попутно измерив время его выполнения, точнее, целых три времени:
|
1 |
$time python3-c»import time; time.sleep(1)» python3-c»import time; time.sleep(1)»0.04suser0.01ssystem4%cpu1.053total |
Как выше я уже проговорился, любая программа может проводить разное время в kernel space и user space, то есть выполняя вызовы в ядро или свой собственный код. Поэтому при базовом взгляде на эти цифры можно в некоторых случаях уже сделать вывод об узком месте в программе: если первый показатель сильно выше, то, вполне возможно, затык в I/O, а если второй — то, возможно, в коде есть неэффективно написанные куски, которые стоит запрофилировать подробнее.
А вот третье время, total time, оно же wall clock time или real time, — это время, которое реально заняло выполнение программы с момента запуска до момента возврата управления. Кстати, user time может быть сильно больше real time, потому что оно рассчитывается как сумма по всем ядрам CPU. Если такое происходит — значит, программа неплохо параллелится.
Ну и напоследок, чтобы посмотреть загрузку для каждого ядра в отдельности, можно использовать вот такую команду:
| 1 | $mpstat-PALL1 |
Если будут сильные перекосы в загрузке ядер — значит, какая-то из программ, напротив, параллелится крайне плохо. А единичка значит «обновляй-ка раз в секунду».
CONFIG FILE
iftop can read its configuration from a config file. If the -c option is
not specified, iftop will attempt to read its configuration from
~/.iftoprc, if it exists. Any command line options specified will
override settings in the config file.
The config file consists of one configuration directive per line. Each
directive is a name value pair, for example:
interface: eth0
- interface: if
- Sets the network interface to if.
- dns-resolution: (yes|no)
- Controls reverse lookup of IP addresses.
- port-resolution: (yes|no)
- Controls conversion of port numbers to service names.
- filter-code: bpf
- Sets the filter code to bpf.
- show-bars: (yes|no)
- Controls display of bar graphs.
- promiscuous: (yes|no)
- Puts the interface into promiscuous mode.
- port-display: (off|source-only|destination-only|on)
- Controls display of port numbers.
- link-local: (yes|no)
- Determines displaying of link-local IPv6 addresses.
- hide-source: (yes|no)
- Hides source host names.
- hide-destination: (yes|no)
- Hides destination host names.
- use-bytes: (yes|no)
- Use bytes for bandwidth display, rather than bits.
- sort: (2s|10s|40s|source|destination)
- Sets which column is used to sort the display.
- line-display: (two-line|one-line-both|one-line-sent|one-line-received)
- Controls the appearance of each item in the display.
- show-totals: (yes|no)
- Shows cumulative total for each item.
- log-scale: (yes|no)
- Use a logarithmic scale for bar graphs.
- max-bandwidth: bw
- Fixes the maximum for the bar graph scale to bw, e.g. «10M». Note that the value has to always be in bits, regardless if the option to display in bytes has been chosen.
- net-filter: net/mask
- Defines an IP network boundary for determining packet direction.
- net-filter6: net6/mask6
- Defines an IPv6 network boundary for determining packet direction.
- screen-filter: regexp
-
Sets a regular expression to filter screen output.
Examples
The syntax is: Type iftop command at the shell prompt to display traffic: Sample outputs:
iftop in action (click to enlarge image) In this example, I am using eth0 interface: Sample outputs:
Animated gif 01: iftop command in action However, iftop works best when you use filters. For example, if you want to find out how much bandwidth users are wasting or trying to figure out why the network is slow, run: You can display or analyses packet flowing in and out of the 192.168.1.0/24 network: Disable output for DNS traffic by using filter code such as: iftop has many options read man page for further information see its man page – iftop(8)
See also:
- Keeping a log of daily network traffic for ADSL or dedicated remote Linux box
- Linux and Unix nload App: Monitor Network Traffic and Bandwidth Usage In Real Time
- CentOS / RHEL: Install vnStat Network Traffic Monitor To Keep a Log Of Daily Traffic
- CentOS / RHEL: View Vnstat Graphs Using PHP Web Interface Frontend
- slurm – An easy to use network load monitor for Linux and Unix-like systems.
- nload project home page – Download source code.
Получше, чем у золотой рыбки
Что в науке, что в инжиниринге периодически возникает одна и та же «проблема» — нельзя просто так взять и ответить на, казалось бы, простой вопрос. Все потому, что есть нюансы и тонкости, а задающий вопрос человек начинает злиться и говорить: «Не надо мне этого всего, ты мне цифру назови». А потом зависает, когда внезапно оказывается, что разные утилиты показывают абсолютно разные значения, скажем, для размера файла или для количества доступной оперативки…
Кстати, об оперативке. Поскольку это у нас железо, то мы можем первым делом опять нахально проследовать в :
| 1 | $cat/proc/meminfo |
…и получить кучу разных цифр, из которых большая часть абсолютно непонятна, так как это вообще все параметры нашей RAM, которые видит ядро. Поэтому лучше все-таки использовать старую добрую команду :
| 1 | $free-ht |
Кстати, почему мы получаем информацию об оперативке не из , как я описал во врезке? Да потому что «пошел ты, вот почему». Вот ссылка на заметочку, в которой написано, где там память в и как с ней работать: How memory is represented in sysfs. Если кратко — придется перемножать в уме и читать кучу разных файлов.
Как ни странно, есть возможность получить и более низкоуровневую информацию об оперативке, чем . Это утилита из одноименного пакета. Она общается непосредственно с BIOS и возвращает даже имена вендоров-производителей. Правда, не всегда верные (особенно весело запускать ее под гипервизором, но это совсем другая история).
| 1 | $sudo dmidecode—type17 |
Кстати, top и htop, как и банальный , тоже выводят информацию о занятой памяти, а второй еще и диаграмму в ASCII рисует по ней и по ядрам. Цветную. Лепота.
Первые две колонки очевидны:
- PID — идентификатор процесса;
- User — пользователь, от которого он запущен.
А вот две следующие чуть интересней: Priority и Niceness, причем первая в общем случае равна второй + 20. По сути, Priority показывает абсолютное значение приоритета процесса в ядре, а Niceness показывает значение относительно ноля (ноль обычно назначается по умолчанию). Этот самый приоритет учитывается при выдаче процессу квантов процессорного времени, поэтому, формально говоря, при увеличении приоритета командой можно заставить какую-нибудь сильно CPU-bound задачу выполняться чуточку быстрее. Для процессов реального времени в колонке Priority будет стоять rt, то есть real time, «как только — так сразу».
Дальше следуют данные о памяти:
- VIRT — виртуальная память, «обещанная» процессу системой;
- RES — фактически используемая память (кстати, благодаря механизму copy-on-write может быть несколько (N) форков одного и того же процесса с одним и тем же числом M в этой колонке, что вовсе не значит, что сожрано N*M памяти, потому что они разделяют ее между собой);
- SHR — shared memory, то есть память, которая потенциально может использоваться для межпроцессного взаимодействия.
Ну и совсем базовые показатели:
- CPU% — сколько процентов CPU жрет процесс; легко может быть больше 100%, если параллелится на несколько ядер;
- MEM% — процент памяти, потребляемой процессом;
- TIME+ — сколько времени процесс бежит;
- COMMAND — какая команда (программа + аргументы) запущена.
Но мы же хотим идти еще глубже, надо больше подробностей!
| 1 | $vmstat1 |
Здесь тоже много колонок, для простоты взглянем на четыре:
- r — размер очереди процессов на доступ к памяти;
- b — число процессов в uninterruptible sleep;
- si/so — сколько страниц памяти в текущий момент пишется в своп / читается из свопа.
Надо ли явно подчеркивать, что в идеальном мире в них должны быть ноли?
Примеры использования
А теперь давайте рассмотрим примеры использования утилиты ss Linux. Возможно, из описания опций вы мало что поняли, но с примерами все встанет на свои места.
Мониторинг сетевых подключений
Сначала смотрим все сетевые подключения:
Посмотрим только TCP соединения:
Или:
Теперь только Unix:
Для отображения UDP сокетов используйте опцию u. По умолчанию будут показаны только подключенные соединения. Если хотите получить все, нужно использовать опцию a. Поскольку UDP, это протокол без постоянного соединения, то без опции -a мы ничего не увидим:
По умолчанию утилита не пытается определять имена хостов через dns, но можно ее попросить делать это опцией -r:
Обратная опция -n, не будет выполняться не только dns резолвинг, но и определение протоколов портов, зато мониторинг сети в Linux работать будет быстрее:
Теперь просмотрим только прослушиваемые tcp сокеты.
Здесь мы видим только имена служб, это не всегда удобно, указав опцию n, мы получим номера портов.
Так же само можно посмотреть прослушиваемые udp сокеты:
Также мы можем попытаться узнать название и PID процесса, использующего сокет:
Просмотр статистики статистики сетевых подключений
Для просмотра статистики по использованию сетевых подключений наберите:
Transport Total IP IPv6
* 1010 — —
RAW 2 1 1
UDP 28 21 7
TCP 33 30 3
INET 63 52 11
FRAG 0 0 0
С помощью опции -о можно посмотреть информацию о таймере и состоянии подключения.
Фильтрация по протоколу
Мы можем отображать только нужный нам протокол. Например только ipv4:
Или:
Так же само можно отобразить только соединения ipv6:
Фильтрация по состоянию соединения
В синтаксисе команды мы описали два дополнительных параметра. Фильтрация состояния и фильтрация по адресу. Рассмотрим теперь как ими пользоваться. Сокет TCP может находиться в одном из нескольких состояний. Например, так утилита ss linux выведет только подключенные сокеты.
Или сокеты в состоянии ожидания:
В параметр state можно передать одно из следующих значений:
- established
- syn-sent
- syn-recv
- fin-wait-1
- fin-wait-2
- time-wait
- closed
- close-wait
- last-ack
- closing
- all — все состояния
- connected — все кроме прослушиваемых и закрытых
- synchronized — все кроме syn-sent
- bucket — time-wait и syn-recv
- big — все кроме bucket
Не все состояния подключений можно увидеть просто выполнив команду. Например, syn-sent и syn-recv вряд ли получиться словить, потому что соединения находятся в этом состоянии очень короткое время. Для их отображения удобно использовать команду watch:
После запуска команды откройте любой сайт в браузере. Вы увидите как появится одно или несколько соединений на несколько секунд.
Фильтрация по адресу и номеру порта
Кроме фильтрации по состоянию, tcp сокеты можно фильтровать по адресам или портам соединений.
Например, отберем все сетевые подключения linux с портом источником или приемником ssh, то есть все входящие и исходящие соединения ssh:
Или сокеты с портом назначения 80 или 443:
Такой синтаксис тоже будет работать:
Еще несколько примеров фильтрации:
Фильтрация по адресу:
Фильтрация по адресу и подсети:
И по адресу и порту:
Если вы хотите фильтровать сетевые соединения по порту, перед портом ставьте двоеточие:
Можно использовать такие операторы сравнения:
- <= или le — меньше или ровно порту
- >= или ge — больше или ровно порту
- == или eq — точное соответствие
- != или ne — не равно
- < или gt — меньше
- > или lt — больше
Мониторинг сети с помощью iptraf
iptraf — это одна из самых лучших программ для мониторинга сети в Linux. Она предоставляет очень удобный интерактивный интерфейс, с помощью которого можно наглядно увидеть всю необходимую информацию, причем достаточно подробно. Утилита не поставляется по умолчанию, но она достаточно популярна, поэтому вы можете установить ее из официальных репозиториев. Для этого в Ubuntu выполните команду:
А в CentOS / Red Hat выполните:

После установки утилиты для ее запуска просто наберите в терминале iptraf:

Перед вами откроется интерактивный интерфейс на основе Ncurses, в котором необходимо выбрать нужное действие. Здесь доступны монитор пропускной способности сети, статистика по интерфейсу, статистика по сбоям и монитор локальной сети.
Обратите внимание на нижнюю часть окна, там отображается описание выбранного действия, а также находятся подсказки по горячим клавишам. Например, для просмотра сетевых соединений и статистики трафика для каждого из них выберите «IP traffic moitor». Затем вам будет необходимо выбрать сетевой интерфейс, например, enp2s0:
Например, для просмотра сетевых соединений и статистики трафика для каждого из них выберите «IP traffic moitor». Затем вам будет необходимо выбрать сетевой интерфейс, например, enp2s0:
Дальше вы увидите все IP адреса, с которыми сейчас выполняется взаимодействие. Здесь можно увидеть направление отправки пакетов, количество пакетов и общий объем переданных или полученных данных в байтах.

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




Также поддерживаются фильтры, которые позволяют отфильтровывать информацию только по определенному критерию. Например, чтобы создать фильтр откройте меню «Filters», затем выберите «IP…», а дальше «Apply new filter»:

Затем нужно указать имя фильтра:

На следующем этапе вы можете расписать нужные параметры фильтрации:


Чтобы применить фильтр нужно выбрать «Apply filter» и выбрать имя фильтра из списка:


Теперь в любом пункте статистики будет отображаться только та информация, которая подходит под созданный фильтр.

Мониторинг трафика Linux чаще всего выполняется администраторами именно с помощью этой утилиты. Видео про использование утилиты: