1️⃣ Быстрая сводка: сколько вообще соединений. Используем ss - он современнее netstat и есть почти везде.
ss -s
Пример вывода:
Total: 1024 (kernel 2048)
TCP: 512 (estab 200, closed 10, orphaned 0, synrecv 0, timewait 55/0), ports 0
UDP: 256
RAW: 0
2️⃣ Топ IP по количеству соединений (TCP). Самый распространенный прием - взять список активных соединений и посчитать, какие удаленные IP встречаются чаще всего.
ss -tn state established '( dport != :22 )' \
| awk '{print $5}' \
| sed 's/:[0-9]*$//' \
| sort \
| uniq -c \
| sort -nr \
| head -n 20
ss -tn state established - TCP, только установленные соединения;
$5 в выводе ss - удалённый адрес (remote:port); sed убирает порт;
uniq -c | sort -nr - считаем и сортируем по убыванию.
Пример вывода:
120 203.0.113.42
87 198.51.100.10
45 10.0.0.5
...
3️⃣ Топ удаленных портов (куда подключаются клиенты). Иногда важно понять, на какие порты чаще всего идут входящие соединения:
ss -tn state established \
| awk '{print $4}' \
| sed 's/.*://; s/::ffff://g' \
| sort \
| uniq -c \
| sort -nr \
| head -n 20
Здесь мы берем локальный адрес $4 и вычленяем порт.
Пример вывода:
340 443
200 80
50 22
...
4️⃣ Показать top IP + процесс (PID). Хочется не только IP, но и процесс, который держит соединения:
ss -tnp | awk '/ESTAB/ { split($6, a, ":"); ip=a[1]; match($0, /pid=[0-9]+,/, m); pid=(m[0]=="")? "?" : substr(m[0],5,length(m[0])-5); print ip, pid }' \
| sort | uniq -c | sort -nr | head -n 30
ss -tnp выводит PID/program в конце строки, мы парсим это и группируем.
Пример вывода:
50 203.0.113.42 2345
30 198.51.100.10 5012
...
Интерпретация: 203.0.113.42 имеет 50 соединений, принадлежащих процессу с PID 2345.
5️⃣ Однострочник: показать какие процессы создают больше всего соединений. Если нужно быстро понять, какие программы держат трафик:
ss -tnp | awk '/ESTAB/ { if (match($0, /pid=([0-9]+),/ , m)) { pid=m[1]; sub(/^.*pid=[0-9]+, /,""); proc=$0; split(proc,p," "); print pid, p[1] } }' \
| sort | uniq -c | sort -nr | head -n 20
Результат - счетчик + PID + имя процесса.
6️⃣ Оценка трафика (байты) - через iptables счётчики. ss не всегда дает удобную сумму байт на IP. Для оценки трафика по IP удобно использовать iptables счетчики (если вы можете изменять правила). Создадим правило для счёта байт/пакетов входящего/исходящего трафика:
# создать chain для мониторинга (однократно)
sudo iptables -N MONITOR 2>/dev/null || true
sudo iptables -I INPUT -j MONITOR
sudo iptables -I OUTPUT -j MONITOR
# добавить правило для конкретного IP (пример)
sudo iptables -I MONITOR -s 203.0.113.42 -j ACCEPT
# посмотреть счётчики
sudo iptables -L MONITOR -vn --line-numbers
Вывод покажет количество пакетов/байтов для каждого правила - можно парсить и сохранять в CSV.
7️⃣ Несколько полезных примеров про запас
Топ слушающих сокетов (портов на сервере):
ss -lnpt | awk '{print $4}' | sed 's/.*://; /^[[:space:]]*$/d' | sort | uniq -c | sort -nr
Топ активных UDP-адресов:
ss -un | awk '{print $5}' | sed 's/:[0-9]*$//' | sort | uniq -c | sort -nr | head
Полный список соединений с PID и программой:
ss -tnp | sed 's/ */ /g' | awk '{print $1, $4, $5, $6}'
BashTex 📱 #bash