Осваиваем команду Linux Netstat: от основ до продвинутого мониторинга сети
Введение
Команда netstat
(статистика сети) является одним из самых важных инструментов сетевого администрирования в системе Linux. Этот универсальный утилита командной строки предоставляет всесторонний обзор сетевых соединений, таблиц маршрутизации, статистики интерфейсов и другой важной информации, связанной с сетью.
Что такое netstat?
netstat
— это утилита командной строки, которая отображает различную информацию, связанную с сетью, включая:
- Сетевые соединения (как входящие, так и исходящие)
- Таблицы маршрутизации
- Статистику сетевых интерфейсов
- Соединения маскировки
- Членство в мультикастах
- Статистику протоколов
Почему это важно
Системные администраторы и сетевые инженеры полагаются на netstat
для выполнения нескольких критически важных задач:
- Устранение неполадок в сети - Быстрое выявление проблем с соединением и узких мест в сети
- Мониторинг безопасности - Обнаружение несанкционированных сетевых соединений и подозрительной активности
- Анализ производительности - Мониторинг трафика сети и статистики интерфейсов
- Аудит системы - Обзор активных служб и открытых портов
Краткая история
Команда netstat
является частью набора инструментов TCP/IP с ранних дней систем Unix. Хотя она возникла в BSD Unix, она эволюционировала и стала стандартным инструментом в различных системах, похожих на Unix, включая Linux. Несмотря на то, что ее считают "устаревшей" в пользу более новых инструментов, таких как ss
, netstat
по-прежнему широко используется благодаря своей:
- Знакомости среди системных администраторов
- Широкой доступности в различных системах, похожих на Unix
- Богатому набору функций и подробным параметрам вывода
- Обширной документации и поддержке сообщества
Основной синтаксис и использование
Формат команды
Основной синтаксис команды netstat:
netstat [options]
Команда может использоваться с различными параметрами для настройки вывода в зависимости от ваших потребностей. Без каких-либо параметров netstat отобразит список открытых сокетов.
Общие параметры и флаги
Вот наиболее часто используемые параметры:
Параметр | Описание |
---|---|
-a | Показывает все прослушивающие порты и активные соединения |
-t | Отображает TCP-соединения |
-u | Показывает UDP-соединения |
-n | Показывает числовые адреса вместо разрешения хостов и портов |
-l | Показывает только прослушивающие сокеты |
-p | Отображает PID и имя программы |
-r | Показывает таблицу маршрутизации |
-i | Показывает статистику сетевых интерфейсов |
-s | Показывает статистику протоколов |
Основные примеры
- Просмотр всех активных соединений
netstat -a
- Отображение всех TCP-соединений
netstat -at
- Показать прослушивающие порты с информацией о программе
sudo netstat -tulnp
Эта популярная комбинация показывает:
-t
: TCP-соединения-u
: UDP-соединения-l
: Только прослушивающие порты-n
: Числовые адреса-p
: Информация о программе
- Проверка таблицы маршрутизации
netstat -r
- Просмотр статистики интерфейсов
netstat -i
Понимание вывода
Типичный вывод netstat включает несколько столбцов:
- Proto: Протокол (TCP, UDP)
- Recv-Q: Данные, ожидающие получения
- Send-Q: Данные, ожидающие отправки
- Local Address: Локальная конечная точка соединения
- Foreign Address: Удаленная конечная точка соединения
- State: Состояние соединения (LISTEN, ESTABLISHED и т.д.)
Пример вывода при использовании netstat -tan
:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.5:22 192.168.1.100:52614 ESTABLISHED
Ключевые функции и параметры
Параметры отображения
Перечисление всех соединений
Команда netstat предлагает различные способы перечисления сетевых соединений в зависимости от ваших конкретных потребностей:
- Показать все протоколы с числовыми адресами
netstat -an
- Отобразить расширенную информацию
netstat -ae
Это добавляет дополнительную информацию, такую как пользователь и inode
- Показать информацию о таймерах
netstat -o
Добавляет информацию о времени, полезную для устранения неполадок
Отображение, специфичное для протокола
- Только TCP
# Показать все TCP-соединения, включая прослушивающие порты
netstat -at
# Показать только прослушивающие TCP-порты
netstat -lt
- Только UDP
# Показать все UDP-соединения
netstat -au
# Показать только прослушивающие UDP-порты
netstat -lu
- Сокеты домена Unix
# Отобразить сокеты домена Unix
netstat -x
Параметры формата вывода
Числовое отображение
# Полный числовой вывод (без разрешения имен)
netstat -n
# Скомбинировать с другими параметрами
netstat -ant # TCP-соединения с числовыми адресами
Преимущества числового отображения:
- Быстрая работа
- Без DNS-запросов
- Более надежно в случае проблем с DNS
Расширенный просмотр информации
# Показать информацию о процессе
sudo netstat -p
# Показать информацию о пользователе и процессе
sudo netstat -ep
# Показать статистику сетевых интерфейсов с расширенной информацией
netstat -ie
Непрерывное отображение
# Обновление каждые 2 секунды
netstat -c
# Скомбинировать с другими параметрами для непрерывного мониторинга
netstat -ct # Непрерывный мониторинг TCP
Отображение статистики
- Статистика протоколов
# Показать сводную статистику для всех протоколов
netstat -s
# Показать статистику только для TCP
netstat -st
# Показать статистику только для UDP
netstat -su
- Статистика интерфейсов
# Отобразить статистику интерфейсов
netstat -i
# Показать расширенную информацию об интерфейсе
netstat -ie
Пример вывода статистики интерфейсов:
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 158426 0 0 0 88573 0 0 0 BMRU
lo 65536 24846 0 0 0 24846 0 0 0 LRU
Где:
- RX: Статистика получения
- TX: Статистика передачи
- OK: Успешные пакеты
- ERR: Количество ошибок
- DRP: Упавшие пакеты
- OVR: События переполнения
Общие случаи использования
Устранение неполадок в сети
Проверка открытых портов
- Найти все открытые порты на системе
sudo netstat -tulpn | grep LISTEN
Эта команда помогает определить:
- Какие службы работают
- Какие порты они используют
- Какие процессы владеют этими портами
- Проверить, используется ли конкретный порт
sudo netstat -tulpn | grep ":80" # Проверить веб-сервер
sudo netstat -tulpn | grep ":3306" # Проверить MySQL
Идентификация активных соединений
- Мониторинг текущих соединений
# Показать все установленные соединения
netstat -nat | grep ESTABLISHED
# Подсчитать соединения по IP-адресу
netstat -nat | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
- Отслеживание состояний соединений
# Просмотреть распределение состояний соединений
netstat -ant | awk '{print $6}' | sort | uniq -c
Мониторинг сетевого трафика
- Анализ трафика интерфейса
# Наблюдать за статистикой интерфейса в реальном времени
netstat -i
watch -n 1 "netstat -i"
- Мониторинг, специфичный для протокола
# Мониторинг статистики трафика TCP
netstat -st
# Мониторинг статистики трафика UDP
netstat -su
Анализ безопасности
Поиск подозрительных соединений
- Обнаружение необычных портов
# Перечислить все нестандартные прослушивающие порты
sudo netstat -tulpn | grep -v ":22\|:80\|:443"
- Проверка на наличие подозрительных паттернов соединений
# Искать соединения с неожиданных IP
netstat -ant | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
Обнаружение попыток сканирования портов
# Искать множественные попытки соединений
netstat -ant | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
Аудит системы
- Проверка служб
# Проверить, какие процессы прослушивают какие порты
sudo netstat -tulpn | grep LISTEN | sort -k 4
- Логирование соединений
# Создать простой лог соединений
while true; do
date >> connection_log.txt
netstat -ant >> connection_log.txt
sleep 60
done
- Мониторинг использования ресурсов
# Мониторинг количества соединений по службе
netstat -ant | grep ESTABLISHED | awk '{print $4}' | cut -d: -f2 | sort | uniq -c
Общие сценарии устранения неполадок
- Проблемы с веб-сервером
# Проверить соединения веб-сервера
sudo netstat -ant | grep ":80\|:443" | awk '{print $6}' | sort | uniq -c
- Проблемы с соединением базы данных
# Мониторинг соединений с базой данных (пример MySQL)
sudo netstat -ant | grep :3306 | awk '{print $6}' | sort | uniq -c
- Анализ почтового сервера
# Проверить соединения почтового сервера
sudo netstat -ant | grep ":25\|:465\|:587" | awk '{print $6}' | sort | uniq -c
Расширенное использование
Комбинирование с другими командами
Использование с grep и awk
- Сложная фильтрация и анализ
# Подсчет соединений по состоянию и порту
netstat -ant | awk '{print $6, $4}' | sort | uniq -c | sort -rn
# Мониторинг соединений конкретной службы с течением времени
watch -n 1 'netstat -ant | grep ":80" | wc -l'
- Расширенный анализ соединений
# Создание сводки соединений
netstat -ant | \
awk '{ip[$5]++} END {for (i in ip) print ip[i],i}' | \
sort -nr | head -n 10
Пайпинг в другие инструменты
# Использование с tee для логирования
netstat -ant | tee network_status.log
# Использование с xargs для управления процессами
netstat -tulpn | grep LISTEN | awk '{print $7}' | cut -d/ -f1 | xargs ps -f
Скрипты и автоматизация
Основной скрипт мониторинга
#!/bin/bash
LOG_FILE="/var/log/network_monitor.log"
monitor_connections() {
echo "=== Отчет о состоянии сети ===" >> $LOG_FILE
date >> $LOG_FILE
echo "Активные соединения:" >> $LOG_FILE
netstat -ant | grep ESTABLISHED | wc -l >> $LOG_FILE
echo "Прослушивающие порты:" >> $LOG_FILE
netstat -tulpn | grep LISTEN >> $LOG_FILE
echo "=========================" >> $LOG_FILE
}
# Запуск каждые 5 минут
while true; do
monitor_connections
sleep 300
done
Скрипт для расширенного анализа
#!/bin/bash
analyze_network() {
echo "=== Анализ сети ==="
echo -e "\nТоп 10 IP соединений:"
netstat -ant | grep ESTABLISHED | \
awk '{print $5}' | cut -d: -f1 | \
sort | uniq -c | sort -rn | head -n 10
echo -e "\nСостояния соединений:"
netstat -ant | awk '{print $6}' | \
sort | uniq -c | sort -rn
echo -e "\nИспользование портов:"
netstat -ant | awk '{print $4}' | \
cut -d: -f2 | sort | uniq -c | sort -rn | head -n 10
}
# Сохранить в файл с временной меткой
analyze_network | tee -a "network_analysis_$(date +%Y%m%d_%H%M%S).log"
Мониторинг производительности
Отслеживание использования ресурсов
- Влияние на CPU и память
# Мониторинг использования ресурсов netstat
while true; do
ps aux | grep netstat | grep -v grep
sleep 1
done
- Производительность сетевого интерфейса
#!/bin/bash
# Мониторинг пропускной способности интерфейса
INTERVAL=1
INTERFACE="eth0"
while true; do
R1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
T1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
sleep $INTERVAL
R2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
T2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
RBPS=$(( ($R2 - $R1) / $INTERVAL ))
TBPS=$(( ($T2 - $T1) / $INTERVAL ))
echo "Интерфейс $INTERFACE:"
echo "RX: $(($RBPS/1024)) КБ/с"
echo "TX: $(($TBPS/1024)) КБ/с"
echo "------------------------"
done
Решения для долгосрочного мониторинга
#!/bin/bash
# Создание часового отчета о сетевой статистике
LOGDIR="/var/log/netstat_reports"
mkdir -p $LOGDIR
generate_report() {
TIMESTAMP=$(date +%Y%m%d_%H)
REPORT="$LOGDIR/netstat_report_$TIMESTAMP.log"
echo "Отчет о сети - $(date)" > $REPORT
echo "=========================" >> $REPORT
echo "Сводка соединений:" >> $REPORT
netstat -s >> $REPORT
echo "Статистика интерфейсов:" >> $REPORT
netstat -i >> $REPORT
echo "Текущие соединения:" >> $REPORT
netstat -ant >> $REPORT
}
# Запуск генерации отчета
generate_report
Советы по интеграции
- Комбинирование с мониторингом системы
# Добавить в скрипты мониторинга системы
if [ $(netstat -ant | grep ESTABLISHED | wc -l) -gt 100 ]; then
echo "Обнаружено высокое количество соединений" | mail -s "Сетевая тревога" [email protected]
fi
- Пользовательские функции отчетности
network_summary() {
local port="$1"
echo "Соединения на порту $port:"
netstat -ant | grep ":$port" | awk '{print $6}' | sort | uniq -c
}
# Использование: network_summary 80
Альтернативы netstat
Команда ss
ss
(Socket Statistics) является современным заменителем netstat в системах Linux. Обычно она быстрее и имеет больше функций, чем netstat.
Ключевые преимущества ss
- Быстрая работа, особенно на системах с большим количеством соединений
- Более подробная информация о сокетах
- Лучшая поддержка новых протоколов
- Меньшее использование системных ресурсов
Сравнение с netstat
# Команда netstat против эквивалента ss
# Перечислить все соединения
netstat -a
ss
# Показать прослушивающие TCP-порты
netstat -tln
ss -tln
# Отобразить информацию о процессе
netstat -p
ss -p
# Показать статистику
netstat -s
ss -s
Пример использования ss
# Показать подробную информацию о сокетах
ss -i
# Отобразить информацию о таймерах
ss -o
# Показать использование памяти
ss -m
# Фильтровать по состоянию
ss state established
# Фильтровать по порту
ss sport = :80
Современные альтернативы
lsof (Список открытых файлов)
# Показать сетевые соединения
lsof -i
# Показать прослушивающие порты
lsof -i -P -n | grep LISTEN
# Показать установленные соединения
lsof -i | grep ESTABLISHED
nmap
# Сканирование открытых портов
nmap localhost
# Подробное сканирование портов
nmap -sV localhost
iptraf-ng
- Монитор реального времени IP-трафика
- Подробная статистика протоколов
- Статистика интерфейсов
- Мониторинг станций LAN
Когда использовать что
Используйте netstat, когда:
- Работаете на старых системах
- Нужна кроссплатформенная совместимость
- Следуете установленной документации
- Выполняете простую диагностику сети
Используйте ss, когда:
- Работаете на современных системах Linux
- Нужна быстрая работа
- Имеете дело с большим количеством соединений
- Требуется подробная информация о сокетах
Используйте lsof, когда:
- Нужно увидеть информацию о дескрипторах файлов
- Хотите сопоставить сетевые соединения с процессами
- Устранение неполадок в приложениях
Используйте nmap, когда:
- Выполняете аудиты безопасности
- Нужен подробный анализ портов
- Анализируете сетевые службы
Руководство по миграции
Переход от netstat к ss
Команда netstat | Эквивалент ss | Описание |
---|---|---|
netstat -t | ss -t | Показать TCP-соединения |
netstat -u | ss -u | Показать UDP-соединения |
netstat -l | ss -l | Показать прослушивающие сокеты |
netstat -p | ss -p | Показать информацию о процессе |
netstat -n | ss -n | Не разрешать имена |
netstat -a | ss | Показать все сокеты |
netstat -r | ip route | Показать таблицу маршрутизации |
Пример миграции скрипта
# Старый скрипт netstat
#!/bin/bash
netstat -tulpn | grep LISTEN > listening_ports.log
# Новый эквивалент ss
#!/bin/bash
ss -tulpn | grep LISTEN > listening_ports.log
Советы по выбору инструмента
- Соображения по производительности
- Для систем большого масштаба: используйте
ss
- Для базовых проверок: любой инструмент подойдет
- Для подробного анализа: комбинируйте несколько инструментов
- Проблемы совместимости
# Проверить, доступен ли ss
if command -v ss >/dev/null 2>&1; then
ss -tulpn
else
netstat -tulpn
fi
- Требования к функциям
- Основной мониторинг: netstat/ss
- Анализ безопасности: nmap
- Корреляция процессов: lsof
- Мониторинг в реальном времени: iptraf-ng
Лучшие практики и советы
Соображения по производительности
Оптимизация использования команд
- Используйте числовой вывод, когда это возможно
# Медленнее (с разрешением DNS)
netstat -ta
# Быстрее (без разрешения DNS)
netstat -tan
- Ограничьте размер вывода
# Вместо показа всех соединений
netstat -a
# Фильтровать для конкретной информации
netstat -an | grep ':80'
- Избегайте непрерывного опроса
# Не рекомендуется для загруженных систем
netstat -c
# Лучший подход с контролируемым интервалом
while true; do
netstat -an | grep ESTABLISHED
sleep 5
done
Общие ошибки
Проблемы с использованием ресурсов
- Проблема: Чрезмерное использование CPU во время разрешения имен
# Проблемная команда
watch -n 1 'netstat -ta'
# Лучший альтернативный вариант
watch -n 1 'netstat -tan'
Проблемы с разрешениями
- Проблема: Отсутствие информации о процессе
# Покажет неполную информацию
netstat -p
# Правильное использование
sudo netstat -p
Интерпретация вывода
- Проблема: Неправильная интерпретация состояний соединений
# Распространенное недоразумение с TIME_WAIT
netstat -ant | grep TIME_WAIT
# Лучший анализ с контекстом
netstat -ant | awk '{print $6}' | sort | uniq -c
Советы для повседневного использования
Создание полезных псевдонимов
# Добавить в ~/.bashrc
alias ns='netstat -tulpn'
alias nsc='netstat -ant | grep ESTABLISHED'
alias nsl='sudo netstat -tulpn | grep LISTEN'
Быстрая проверка безопасности
# Проверить необычные прослушивающие порты
check_ports() {
echo "Известные порты:"
sudo netstat -tulpn | grep -E ':22|:80|:443'
echo -e "\nНеизвестные порты:"
sudo netstat -tulpn | grep -vE ':22|:80|:443'
}
Шаблоны мониторинга
# Шаблон мониторинга соединений
monitor_connections() {
local port=$1
local threshold=$2
count=$(netstat -an | grep ":$port" | grep ESTABLISHED | wc -l)
if [ $count -gt $threshold ]; then
echo "Тревога: $count соединений на порту $port превышает порог $threshold"
fi
}
# Использование: monitor_connections 80 100
Документация и логирование
Создание полезных логов
#!/bin/bash
# Логгер состояния сети
log_network_status() {
local logfile="/var/log/network_status.log"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
{
echo "=== Состояние сети на $timestamp ==="
echo "Прослушивающие порты:"
netstat -tulpn | grep LISTEN
echo "Текущие соединения:"
netstat -ant | awk '{print $6}' | sort | uniq -c
echo "=================================="
} >> "$logfile"
}
Стандартные операционные процедуры
# Шаблон для регулярных проверок
daily_network_check() {
echo "1. Проверка прослушивающих портов..."
sudo netstat -tulpn | grep LISTEN
echo "2. Проверка установленных соединений..."
netstat -ant | grep ESTABLISHED | wc -l
echo "3. Проверка состояний соединений..."
netstat -ant | awk '{print $6}' | sort | uniq -c
echo "4. Проверка статистики интерфейсов..."
netstat -i
}
Руководство по устранению неполадок
- Проблемы с соединением
connection_troubleshoot() {
local port=$1
echo "=== Устранение неполадок соединения для порта $port ==="
echo "1. Проверка, прослушивает ли порт:"
sudo netstat -tulpn | grep ":$port"
echo "2. Проверка активных соединений:"
netstat -ant | grep ":$port" | awk '{print $6}' | sort | uniq -c
echo "3. Проверка состояний соединений:"
netstat -ant | grep ":$port" | awk '{print $6}' | sort | uniq -c
}
- Мониторинг системных ресурсов
resource_check() {
echo "=== Проверка системных ресурсов ==="
echo "1. Всего соединений:"
netstat -ant | wc -l
echo "2. Соединения по IP:"
netstat -ant | grep ESTABLISHED | \
awk '{print $5}' | cut -d: -f1 | \
sort | uniq -c | sort -nr | head -5
echo "3. Использование памяти сетевыми процессами:"
ps aux | grep -E 'netstat|ss' | grep -v grep
}
Часто задаваемые вопросы (FAQ)
В: Почему я не вижу информацию о процессе (PID)?
A: Это обычно связано с правами доступа. Запустите команду с sudo:
sudo netstat -tulpn
Параметр -p требует прав администратора для отображения информации о процессе.
В: В чем разница между состояниями LISTEN и ESTABLISHED?
A:
- LISTEN: Указывает, что служба прослушивает этот порт, ожидая соединений
- ESTABLISHED: Представляет активную, в данный момент подключенную сессию
В: Как проверить соединения для конкретного порта?
A: Вы можете использовать grep для фильтрации соединений по порту:
# Проверить все соединения на порту 80
netstat -an | grep ":80"
# Проверить только прослушивающие порты
netstat -tunl | grep ":80"
В: Почему моя команда netstat работает медленно?
A: Две основные причины:
1. Разрешение DNS - используйте параметр -n, чтобы избежать разрешения имен
2. Слишком много соединений - используйте фильтрацию или рассмотрите возможность перехода на ss
# Пример более быстрой команды
netstat -tan | grep ESTABLISHED
В: Повлияет ли netstat на производительность системы?
A: Частое опрос может повлиять на производительность. Лучшие практики:
1. Увеличьте интервалы опроса
2. Используйте фильтрацию, чтобы уменьшить вывод
3. Рассмотрите возможность использования ss для систем большого масштаба
4. Избегайте непрерывного режима (-c) на загруженных системах
В: Как идентифицировать, какое приложение использует конкретный порт?
A: Используйте эти команды:
# Показать процесс, использующий порт 80
sudo netstat -tulpn | grep ":80"
# Альтернатива с использованием lsof
sudo lsof -i :80
В: Как я могу отслеживать состояния соединений?
A: Несколько подходов:
# Подсчет соединений по состоянию
netstat -ant | awk '{print $6}' | sort | uniq -c
# Мониторинг установленных соединений
watch -n 1 'netstat -ant | grep ESTABLISHED | wc -l'
В: Как я могу проверить наличие подозрительных соединений?
A: Ищите:
1. Необычные порты:
netstat -tulpn | grep -vE ':22|:80|:443'
2. Высокое количество соединений с одного IP:
netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
В: Как обнаружить попытки сканирования портов?
A: Мониторьте соединения SYN_RECV:
netstat -ant | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
В: В чем разница между параметрами -t и -u?
A:
-t : Показывает только TCP-соединения
-u : Показывает только UDP-соединения
Вы можете комбинировать их:
netstat -tu : Показывает как TCP, так и UDP
В: Как сохранить вывод netstat в файл?
A: Несколько методов:
# Основной вывод в файл
netstat -ant > network_status.log
# С временной меткой
(date; netstat -ant) > network_status.log
# Непрерывное логирование
while true; do
netstat -ant >> network_log.txt
sleep 300
done
В: Что означает "Адрес уже используется" в выводе netstat?
A: Это указывает на то, что порт уже используется другим процессом. Чтобы найти его:
sudo netstat -tulpn | grep "<номер_порта>"
В: Почему я вижу много соединений TIME_WAIT?
A: TIME_WAIT — это нормально после закрытия соединений. Однако слишком много может указывать на:
1. Высокую текучесть соединений
2. Возможные проблемы с сетью
3. Приложение, не использующее повторные соединения
Мониторьте с помощью:
netstat -ant | grep TIME_WAIT | wc -l