В статье разбирается утилита netstat, которая предназначена для получения информации о сетевых подключениях к серверу или от него.
Об утилите
Эта утилита используется для вывода информации о сетевых подключениях. Также она может показать таблицы маршрутизации, статистику по интерфейсам и другое. Я использую эту утилиту только для вывода сетевых подключений.
Вообще эта утилита считается устаревшей и была заменена на утилиту ss, которую мы рассмотрим в следующей статье.
Получить справку об этой утилите можно здесь.
Установка netstat
Эта утилита входит в пакет net-tools, поэтому необходимо установить именно этот пакет, чтобы у вас в системе появилась утилита netstat. В пакет net-tools также включены следующие инструменты: arp, ifconfig, rarp, nameif и route. Все они считаются устаревшими, но иногда используются по привычке системного администратора.
И так, чтобы установить net-tools выполните:
$ sudo apt install net-tools
Работа утилиты
Если мы выполним netstat без дополнительных опций, то увидим активные сетевые соединения (Active Internet connections) и активные соединения с помощью сокетов (Active UNIX domain sockets).
$ netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 216 192.168.0.35:ssh pc-adm:64743 ESTABLISHED Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ] DGRAM 799 /run/user/1000/systemd/notify unix 3 [ ] DGRAM 11402 /run/systemd/notify unix 2 [ ] DGRAM 11418 /run/systemd/journal/syslog unix 7 [ ] DGRAM 11424 /run/systemd/journal/dev-log unix 7 [ ] DGRAM 11426 /run/systemd/journal/socket unix 3 [ ] STREAM CONNECTED 12270 /run/systemd/journal/stdout ***
Выводимая информация для интернет соединений и соединений с помощью сокетов отличается.
Выводимые поля для интернет соединений:
- Proto — протокол (tcp, udp).
- Recv-Q — количество байтов, помещённых в буфер приёма TCP/IP, но не переданных приложению. Если это число высокое, то нужно проверить работоспособность приложения, которое работает с данным портом.
- Send-Q — количество байтов, помещённых в буфер отправки TCP/IP, но не отправленных, или отправленных, но не подтверждённых. Высокое значение может быть связано с перегрузкой сети сервера.
- Local Address — локальный адрес сервера. В обычных соединения, это адрес сервера на который пришло соединение. В прослушиваемых портах (LISTEN) — это диапазон адресов. Так 0.0.0.0:port — значит подключаться можно ко всем адресам сервера, а 192.168.0.35:port — значит подключаться можно только к этому адресу сервера.
- Foreign Address — адрес второй стороны. В обычных соединения, это адрес с которого пришло соединение. В прослушиваемых портах (LISTEN) — это диапазон адресов. Так 0.0.0.0:* — значит подключаться можно с любых адресов и с любых портов, а например 192.168.0.50:* — значит подключаться можно только с этого адреса и с любых портов.
- State — состояние подключения, или прослушивания.
Выводимые поля для соединений с помощью сокетов:
- Proto — протокол (unix);
- RefCnt — счётчик подключенных к этому сокету процессов;
- Flags — флаги, я их не буду рассматривать;
- Type — тип сокета
- DGRAM — работает без установки соединения;
- STREAM — с предварительной установкой соединения;
- State — состояние коннекта
- LISTENING — сокет ожидает запроса на подключение;
- CONNECTED — сокет подключен;
- DISCONNECTING — сокет отключен;
- (пусто) — сокет не подключен к другому.
- I-Node — номер i-node файла сокета;
- Path — путь к файлу сокета.
Примеры работы и дополнительные опции
Активные подключения и прослушиваемые порты
Если утилита netstat без опций выводила все активные подключения, то с опцией -a она дополнительно выведет все прослушиваемые порты.
Дополнительно можно отфильтровать информацию по типу протокола:
- -t — выводить только tcp;
- -u — выводить только udp;
- -x — выводить только сокеты.
Эти опции можно совмещать, например следующая команда покажет все активные подключения и прослушиваемые порты только для tcp и udp соединений:
$ netstat -atu Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 268 192.168.0.35:ssh pc-adm:64743 ESTABLISHED tcp6 0 0 [::]:http [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 [::]:https [::]:* LISTEN
Из вывода выше мы видим что у нас есть tcp соединения и нет udp. В tcp соединениях видно одно в состоянии ESTABLISHED, это я подключен к серверу по протоколу ssh. Остальные имеют состояние LISTEN — это прослушиваемые порты. Наш сервер слушает следующие порты: ssh (22 порт), https (443 порт), http (80 порт).
Только прослушиваемые порты или сокеты
Перечислить все прослушиваемые порты, в том числе и сокеты можно с помощью опции -l. Здесь вы также можете ограничить вывод tcp, udp или linux сокетами.
Например, следующая команда выведет все прослушиваемые порты и сокеты, так как я не ограничиваю вывод определённым протоколом:
$ netstat -l Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp6 0 0 [::]:http [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 [::]:https [::]:* LISTEN Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 211 /run/systemd/journal/io.systemd.journal unix 2 [ ACC ] STREAM LISTENING 802 /run/user/1000/systemd/private unix 2 [ ACC ] STREAM LISTENING 811 /run/user/1000/gnupg/S.dirmngr unix 2 [ ACC ] STREAM LISTENING 813 /run/user/1000/gnupg/S.gpg-agent.browser unix 2 [ ACC ] STREAM LISTENING 815 /run/user/1000/gnupg/S.gpg-agent.extra unix 2 [ ACC ] STREAM LISTENING 817 /run/user/1000/gnupg/S.gpg-agent.ssh unix 2 [ ACC ] STREAM LISTENING 819 /run/user/1000/gnupg/S.gpg-agent unix 2 [ ACC ] STREAM LISTENING 11882 /run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 11405 /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 11407 /run/systemd/userdb/io.systemd.DynamicUser unix 2 [ ACC ] STREAM LISTENING 11408 /run/systemd/io.system.ManagedOOM unix 2 [ ACC ] STREAM LISTENING 11420 /run/systemd/fsck.progress unix 2 [ ACC ] STREAM LISTENING 11428 /run/systemd/journal/stdout unix 2 [ ACC ] SEQPACKET LISTENING 11430 /run/udev/control
Получение статистики
Для получения статистики по сетевым протоколам нужно использовать опцию -s. Здесь также можно ограничивать вывод по определённым протоколам, но нельзя использовать опцию -x.
Например следующая команда выведет статистику по протоколу udp:
$ netstat -su Udp: 314 packets received 0 packets to unknown port received 0 packet receive errors 317 packets sent 0 receive buffer errors 0 send buffer errors IgnoredMulti: 3856905 UdpLite: IpExt: InBcastPkts: 3856905 InOctets: 424191584 OutOctets: 6605615 InBcastOctets: 229159529 InNoECTPkts: 4157300 InECT0Pkts: 10507
Формат вывода
Утилита netstat, используя dns, пытается присвоить имена ip-адресам. Так, какой-нибудь, условный компьютер, с адресом 192.168.0.14 будет назван как pc-adm. Мы можем выключить такое именование хостов используя опцию -n.
А ещё утилита netstat именует стандартные порты в имена протоколов, например порт 22 будет назван ssh, 80 — http, 443 — https. Но мы можем выключить это поведение используя опцию -nn.
Также эта утилита умеет выводить имена процессов, которые обслуживают подключения, или слушают порты. Для этого нужно использовать опцию -p. Но чтобы мы увидели названия процессов, нужно запускать утилиту netstat используя sudo.
Например:
- netstat -ltnnp — вывести только прослушиваемые tcp порты. При этом не переводить ip адреса в имена хостов и не переводить номера портов в названия протоколов. Дополнительно вывести название процессов.
- netstat -atunnp — вывести все порты (прослушиваемые и активные). При этом выводить только сетевые порты (tcp и udp), а не сокеты. Не переводить ip адреса в имена хостов и не переводить номера портов в имена протоколов. А также вывести названия процессов участвующих в соединениях.
Пример последней команды показан здесь:
$ sudo netstat -atnnp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 402/sshd: /usr/sbin tcp 0 52 192.168.0.35:22 192.168.0.14:64743 ESTABLISHED 4121/sshd: alex [pr tcp6 0 0 :::80 :::* LISTEN 403/apache2 tcp6 0 0 :::22 :::* LISTEN 402/sshd: /usr/sbin tcp6 0 0 :::443 :::* LISTEN 403/apache2
Итог
Мы познакомились с утилитой netstat, которая позволяет посмотреть информацию о сетевых подключениях к серверу или от него.
Рассмотрели следующие опции:
- -a — посмотреть все порты (прослушиваемые и используемые в подключении);
- -l — посмотреть только прослушиваемые порты;
- -t — выводить только tcp порты;
- -u — выводить только udp порты;
- -x — выводить информацию только по unix сокетам;
- -p — к выводу добавить информацию о процессе (имя и pid процесса);
- -n — отключить преобразование ip адреса в имя компьютера;
- -nn — отключить преобразование номера порта в имя протокола;
- -s — отобразить статистику по различным сетевым протоколам.