Netstat. Примеры использования в Linux, Windows и FreeBSD
Что такое netstat знает практически любой сисадмин, но на всякий случай освежим:
netstat (network statistic) - это утилита командной строки показывающая сетевые соединения (как входящие, так и исходящие), таблицы маршрутизации и различные статистики сетевых интерфейсов. Утилита присутвует как в Unix-like системах, так и в Windows.
Разница использования утилиты в разных операционных системах небольшая, в основном заключается в синтаксе, а именно в ключах. Мы будем разбирать примеры для Linux более подробно, а для Windows и FreeBSD указывать только сами команды.
Тема довольно обширная и для каждой операционный системы есть свои ньюансы, поэтому остановимся только на основных моментах.
Итак начнем.
1. Просмотр состояния всех сокетов (как прослушиваемых, так и имеющих другое состояние)
Вид команды одинаков для всех операционных систем - netstat -a
Вывод команды для Linux:
$ netstat -a | more Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost.dbschen:mysql *:* LISTEN tcp 0 0 *:8010 *:* LISTEN tcp 0 0 *:3307 *:* LISTEN tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 localhost.dbschenk:8100 localhost.dbschen:43747 ESTABLISHED tcp 0 0 localhost.:zabbix-agent localhost.dbschen:56439 TIME_WAIT tcp 0 0 localhost.:zabbix-agent localhost.dbschen:56523 TIME_WAIT tcp 0 0 localhost.:zabbix-agent localhost.dbschen:56492 TIME_WAIT tcp 0 0 localhost.dbschenk:8789 localhost.dbschen:44400 ESTABLISHED tcp 0 0 alex1812.local:49968 xenon.dbsc:microsoft-ds ESTABLISHED tcp 0 0 localhost.dbschen:44402 localhost.dbschenk:8789 ESTABLISHED tcp 1 0 alex1812.local:35685 srv103-131.vkontak:http CLOSE_WAIT Активные сокеты домена UNIX (servers and established) Proto RefCnt Flags Type State I-Node Путь unix 2 [ ] DGRAM 9643 /var/spool/postfix/de v/log unix 2 [ ACC ] STREAM LISTENING 13963 /tmp/ssh-QiVSHQBA3051 /agent.3051 unix 2 [ ACC ] STREAM LISTENING 12191 /tmp/gpg-QOeyf0/S.gpg -agent unix 2 [ ] DGRAM 13820 @ unix 2 [ ACC ] STREAM LISTENING 8984 /var/run/xdmctl/dmctl
Я думаю назначение каждого столбца в комментариях не нуждается, опишем только последний - state (состояние соединения)
Виды состояний (state):
ESTABLISHED - соединение установлено
SYN_SENT - сокет пытается установить соединение
SYN_RECV - начальная синхронизация соединения
FIN_WAIT1 - сокет закрыт, ожидание отключения соединения
FIN_WAIT2 - ожидание отключения удаленной стороны
TIME_WAIT - ожидание после закрытия повторной передачи отключения удаленной стороны
CLOSED - соединение закрыто, сокет не используется
CLOSE_WAIT - удаленный узел отключился, сокет скоро будет закрыт
LAST_ACK - сначала отключилась удаленная сторона, а затем сокет будет закрыт
LISTEN - сокет ожидает входящих соединений
CLOSING - закрытие сокета, точнее сокет закрыт, а затем отключился удаленный узел
UNKNOWN - состояние сокета неизвестно.
Просмотр только tcp соединений -
Для Линукс:
netstat -at
$netstat -at Активные соединения с интернетом (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost.dbschen:mysql *:* LISTEN tcp 0 0 *:8010 *:* LISTEN tcp 0 0 *:3307 *:* LISTEN tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 *:http *:* LISTEN
Для Windows и FreeBSD команда выглядит:
netstat -a -p tcp
Просмотр только udp соединений:
Для Linux -
netstat -au
$netstat -au Активные соединения с интернетом (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:38905 *:* udp 0 0 *:nfs *:* udp 0 0 *:35625 *:* udp 0 0 *:52138 *:*
Для Windows и FreeBSD команда выглядит:
netstat -a -p udp
2. Просмотр всех сокетов в состоянии ожидания соединений (Listening)
Для Linux:
netstat -l
$netstat -l Активные соединения с интернетом (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost.dbschen:mysql *:* LISTEN tcp 0 0 *:8010 *:* LISTEN
Для freebsd -
netstat -a | egrep 'Proto|LISTEN'
Для Windows -
netstat -a | find "LISTENING"
Просмотр только ожидающих TCP соединений -
Linux:
netstat -lt
FreeBSD:
netstat -a -p tcp | egrep 'Proto|LISTEN'
Windows:
netstat -a -p TCP | find "LISTENING"
Для UDP-соединений -
Linux:
netstat -lu
FreeBSD:
netstat -a -p udp | egrep 'Proto|LISTEN'
Windows:
netstat -a -p udp | find "LISTENING"
Для Unix -сокетов
Linux:
netstat -lx
3. Показ статистики по каждому протоколу.
Для всех дистрибутивов -
netstat -s
$netstat -s Ip: всего пакетов принято 11602420 305 с неверными заголовками 2392 с неверными адресами 0 перенаправлено 0 входящих пакетов отклонено входящих пакетов доставлено: 11573509 запросов отправлено: 11868461 исходящих пакетов сброшено: 2 сброшено по причине отсутствия маршрута: 5 фрагментов неудачно: 2 Icmp: ICMP сообщений получено: 521776 неудачных входящих ICMP сообщений: 64562 Гистограмма входа ICMP пункт назначения недоступен: 119819 потери при прохождении: 10 перенаправления: 50 эхо-запросы: 31460 эхо-ответы: 370437 послано сообщений ICMP: 502403 неудачные сообщения ICMP: 0 Гистограмма выхода ICMP пункт назначения недоступен: 97014 эхо-запросов: 373929 эхо-ответы: 31460 IcmpMsg: InType0: 370437 InType3: 119819 InType5: 50 InType8: 31460 InType11: 10 OutType0: 31460 OutType3: 97014 OutType8: 373929 Tcp: открытия активных соединений: 1120690 открытия пассивных соединений: 499326 .....................................................
Для конкретных протоколов (например TCP или UDP):
Linux:
TCP - netstat -st
UDP - netstat -su
Freebsd и Windows:
netstat -s -p TCP
netstat -s -p UDP
4. Показывать PID и имя программы
Для добавления поля PID/Program name в Linux используется ключ -p. Его можно использовать вместе с другими ключами.
Пример:
$ sudo netstat -pt [sudo] password for alex1812: Активные соединения с интернетом (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost.dbschen:52466 localhost.dbschenk:http TIME_WAIT - tcp 0 0 alex1812.local:39568 192.168.17.1:http TIME_WAIT - tcp 0 0 localhost.dbschenk:8100 localhost.dbschen:43747 ESTABLISHED 2202/.python.bin tcp 0 0 alex1812.local:57709 domaindnszones.:loc-srv TIME_WAIT - tcp 0 0 localhost.dbschenk:8789 localhost.dbschen:44400 ESTABLISHED 2248/.python.bin tcp 0 0 alex1812.local:49968 xenon.dbsc:microsoft-ds ESTABLISHED 1602/winbindd tcp 0 0 localhost.dbschen:44402 localhost.dbschenk:8789 ESTABLISHED 2567/.python.bin tcp 1 0 alex1812.local:35685 srv103-131.vkontak:http CLOSE_WAIT 3199/dolphin tcp 0 0 localhost.dbschen:44400 localhost.dbschenk:8789 ESTABLISHED 2524/.python.bin
В windows это можно проделать с ключом -b и -o:
netstat -b -o
Для Freebsd у netstat такой функции нет, по-крайней мере я ее не нашел. Для этих целей можно использовать lsof
5. Не включать хост, порт и имя пользователя в вывод netstat
Для ускорения вывода, можно не включать вывод имени хоста, порта и имени пользователя, используем ключ -n. При этом будут выводиться числовые значение для имени пользователя, порта и айпи-адрес для доменных имен.
netstat -an | more Активные соединения с интернетом (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
Это же справедливо для FreeBSD и Windows.
Для Linux также можно использовать:
# netstat -a --numeric-ports
# netstat -a --numeric-hosts
# netstat -a --numeric-users
Соответственно преобразовывать в числовые значения имя порта, имя хоста или имя пользователя.
6. Выводить информацию непрерывно
Для Linux используем ключ -с, для вывода информации каждые несколько секунд
netstat -c Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 alex1812-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED tcp 1 1 alex1812-laptop.loc:52564 101.11.169.230:www CLOSING tcp 0 0 alex1812-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED tcp 1 1 alex1812-laptop.loc:42367 101.101.34.101:www CLOSING ^С
Для Windows используется ключ -o
netstat -o 5 - выводить каждые 5 секунд.
7. Поиск не поддерживаемых семейств адресов в системе
В линукс используем ключ --verbose
$netstat --verbose ................ netstat: no support for `AF IPX' on this system. netstat: no support for `AF AX25' on this system. netstat: no support for `AF X25' on this system. netstat: no support for `AF NETROM' on this system
8. Просмотр таблицы маршрутизации
Для всех систем используем netstat -r
$netstat -r Таблица маршутизации ядра протокола IP Destination Gateway Genmask Flags MSS Window irtt Iface default 10.218.138.249 0.0.0.0 UG 0 0 0 eth0 10.218.138.0 * 255.255.255.0 U 0 0 0 eth0 link-local * 255.255.0.0 U 0 0 0 eth0
Для Linux и FreeBSD используем ключ -rn для преобразования имен хостов в ip-адреса
$ netstat -rn Таблица маршутизации ядра протокола IP Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 10.218.138.249 0.0.0.0 UG 0 0 0 eth0 10.218.138.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
9. Узнаем на каком порту работает программа
Для Linux:
sudo netstat -ap | grep ssh [sudo] password for alex1812: tcp 0 0 *:ssh *:* LISTEN 16055/sshd tcp 0 180 alex1812.local:ssh alshipilov.dbsche:63256 ESTABLISHED 19954/sshd: alex181 tcp6 0 0 [::]:ssh [::]:* LISTEN 16055/sshd unix 2 [ ACC ] STREAM LISTENING 13963 3100/ssh-agent /tmp/ssh-QiVSHQBA3051/agent.3051 unix 3 [ ] STREAM CONNECTED 5908135 19954/sshd: alex181 unix 3 [ ] STREAM CONNECTED 5906061 19954/sshd: alex181 unix 2 [ ] DGRAM 5906060 19954/sshd: alex181
Или наоборот узнаем какой процесс работает на определенном порту:
netstat -an | grep ':80'
10. Отображение списка сетевых интерфейсов и информации по ним:
Для Linux и FreeBSD:
$netstat -i Таблица интерфейсов ядра Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 6413932 0 4 0 6171755 0 0 0 BMRU lo 16436 0 6223876 0 0 0 6223876 0 0 0 LRU
Расширенная информация по интерфейсам (для линукс):
$ netstat -ie Таблица интерфейсов ядра eth0 Link encap:Ethernet HWaddr 70:71:bc:71:d5:95 inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::7271:bcff:fe71:d595/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6416050 errors:0 dropped:4 overruns:0 frame:0 TX packets:6173575 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1672869297 (1.6 GB) TX bytes:703106243 (703.1 MB) Interrupt:20 Память:fb200000-fb220000 lo Link encap:Локальная петля (Loopback) inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:6225387 errors:0 dropped:0 overruns:0 frame:0 TX packets:6225387 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:793200119 (793.2 MB) TX bytes:793200119 (793.2 MB)
На этом заканчиваю это небольшой обзор, если у кого есть другие интересные примеры использования netstat в разных ОС, прошу добавлять в комментарии.