Как использовать netstat в Linux

Команда Linux netstatпредоставляет вам кладезь информации о ваших сетевых подключениях, используемых портах и ​​используемых ими процессах. Узнай, как им пользоваться.

Порты, процессы и протоколы

Сетевые сокеты могут быть подключены или ожидают подключения. Соединения используют сетевые протоколы, такие как протокол управления передачей (TCP) или протокол пользовательских дейтаграмм UDP. Они используют адреса интернет-протокола и сетевые порты для установления соединений.

Слово « сокеты»   может вызывать в воображении образы физической точки подключения провода или кабеля, но в этом контексте сокет - это программная конструкция, используемая для обработки одного конца сетевого соединения для передачи данных.

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

Слушающий сокет называется сервером , а сокет, который запрашивает соединение с слушающим сокетом, называется клиентом . Эти имена не имеют ничего общего с ролями оборудования или компьютера. Они просто определяют роль каждого сокета на каждом конце соединения.

Команда netstatпозволяет узнать, какие сокеты подключены и какие сокеты прослушивают. Это означает, что он сообщает вам, какие порты используются и какие процессы их используют. Он может показать вам таблицы маршрутизации и статистику о ваших сетевых интерфейсах и многоадресных соединениях.

Функциональность netstatсо временем была воспроизведена в различных утилитах Linux, таких как ip и ss. Все еще стоит знать этого дедушку всех команд сетевого анализа, потому что он доступен во всех Linux и Unix-подобных операционных системах, и даже в Windows и Mac.

Вот как его использовать с примерами команд.

Список всех сокетов

Опция -a(all) позволяет netstatпоказать все подключенные и ожидающие сокеты. Эта команда может создать длинный список, поэтому мы перенаправляем его в less.

netstat -a | Меньше

Список включает сокеты TCP (IP), TCP6 (IPv6) и UDP.

Оборот в окне терминала немного затрудняет понимание того, что происходит. Вот пара разделов из этого списка:

Активные интернет-соединения (серверы и установленные) Proto Recv-Q Send-Q Локальный адрес Внешний адрес Состояние tcp 0 0 localhost: domain 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 0 localhost : ipp 0.0.0.0:* LISTEN tcp 0 0 localhost: smtp 0.0.0.0:* LISTEN tcp6 0 0 [::]: ssh [::]: * СЛУШАТЬ tcp6 0 0 ip6-localhost: ipp [::]: * СЛУШАТЬ . . . Активные сокеты домена UNIX (серверы и установленные) Флаги Proto RefCnt Тип Состояние Путь к I-узлу unix 24 [] DGRAM 12831 / run / systemd / journal / dev-log unix 2 [ACC] ПРОСЛУШИВАНИЕ ПОТОКА 24747 @ / tmp / dbus-zH6clYmvw8 unix 2 [] DGRAM 26372 / run / user / 1000 / systemd / notify unix 2 [] DGRAM 23382 / run / user / 121 / systemd / notify unix 2 [ACC] SEQPACKET LISTENING 12839 / run / udev / control

В разделе «Активный Интернет» перечислены подключенные внешние подключения и локальные сокеты, которые прослушивают запросы удаленного подключения. То есть в нем перечислены сетевые подключения, которые установлены (или будут) установлены с внешними устройствами.

В разделе «UNIX domain» перечислены подключенные и прослушивающие внутренние соединения. Другими словами, он перечисляет соединения, которые были установлены на вашем компьютере между различными приложениями, процессами и элементами операционной системы.

Столбцы «Активный Интернет»:

  • Proto: протокол, используемый этим сокетом (например, TCP или UDP).
  • Recv-Q: очередь приема. Это входящие байты, которые были получены и помещены в буфер, ожидая, пока локальный процесс, использующий это соединение, прочитает и потребит их.
  • Send-Q:  очередь отправки. Это показывает байты, которые готовы к отправке из очереди отправки.
  • Локальный адрес: подробный адрес локального конца соединения. По умолчанию для netstat адреса отображается имя локального хоста, а для порта - имя службы.
  • Внешний адрес:  адрес и номер порта удаленного конца соединения.
  • Состояние: состояние локального сокета. Для сокетов UDP это обычно пустое поле. См. Таблицу состояний ниже.

Для TCP-соединений значение состояния может быть одним из следующих:

  • СЛУШАТЬ: только на стороне сервера. Сокет ожидает запроса на подключение.
  • SYN-SENT: только на стороне клиента. Этот сокет сделал запрос на подключение и ждет, чтобы узнать, будет ли он принят.
  • SYN-RECEIVED: только на стороне сервера. Этот сокет ожидает подтверждения подключения после принятия запроса на подключение.
  • УСТАНОВЛЕНО: Сервер и клиенты. Между сервером и клиентом установлено рабочее соединение, позволяющее передавать данные между ними.
  • FIN-WAIT-1: Сервер и клиенты. Этот сокет ожидает запроса на завершение соединения от удаленного сокета или подтверждения запроса на прекращение соединения, который был ранее отправлен из этого сокета.
  • FIN-WAIT-2: Сервер и клиенты. Этот сокет ожидает запроса на прекращение соединения от удаленного сокета.
  • ЗАКРЫТЬ-ПОДОЖДИТЕ: сервер и клиент. Этот сокет ожидает запроса на прекращение соединения от локального пользователя.
  • ЗАКРЫТИЕ: Сервер и клиенты. Этот сокет ожидает подтверждения запроса на разрыв соединения от удаленного сокета.
  • LAST-ACK: сервер и клиент. Этот сокет ожидает подтверждения запроса на прекращение соединения, отправленного удаленному сокету.
  • ВРЕМЯ-ОЖИДАНИЕ: Сервер и клиенты. Этот сокет отправил удаленному сокету подтверждение, чтобы сообщить ему, что он получил запрос на завершение удаленного сокета. Теперь он ждет, чтобы убедиться, что подтверждение было получено.
  • ЗАКРЫТО: соединение отсутствует, значит, сокет отключен.

Столбцы «Unix domain»:

  • Proto: протокол, используемый этим сокетом. Это будет «unix».
  • RefCnt: количество ссылок. Количество подключенных процессов, подключенных к этому сокету.
  • Флаги: обычно устанавливается ACC , что означает SO_ACCEPTON, что сокет ожидает запроса на соединение. SO_WAITDATA, показанный как W, означает, что есть данные, ожидающие чтения. SO_NOSPACE, показанный как N, означает, что нет места для записи данных в сокет (т. е. буфер отправки заполнен).
  • Тип: Тип розетки. См. Таблицу типов ниже.
  • Состояние: состояние сокета. См. Таблицу состояний ниже.
  • I-Node: индексный дескриптор файловой системы, связанный с этим сокетом.
  • Путь : путь файловой системы к сокету.

Сокет домена Unix , тип может быть одним из следующих:

  • DGRAM: сокет используется в режиме дейтаграммы с использованием сообщений фиксированной длины. Не гарантируется, что дейтаграммы будут надежными, последовательными или дублированными.
  • STREAM: этот сокет является потоковым. Это банальный «нормальный» тип подключения к розетке. Эти сокеты предназначены для обеспечения надежной последовательной (упорядоченной) доставки пакетов.
  • RAW: этот сокет используется как сырой сокет. Необработанные сокеты работают на сетевом уровне модели OSI и не ссылаются на заголовки TCP и UDP с транспортного уровня.
  • RDM: этот сокет расположен на одном конце надежно доставленного сообщения.
  • SEQPACKET: This socket is operating as a sequential packet socket, which is another means of providing reliable, sequenced, and unduplicated packet delivery.
  • PACKET: Raw interface access socket. Packet sockets are used to receive or send raw packets at the device driver (i.e., data link layer) level of the OSI model.

The Unix domain socket state can be one of the following:

  • FREE: This socket is unallocated.
  • LISTENING: This socket is listening for incoming connection requests.
  • CONNECTING: This socket is in the process of connecting.
  • CONNECTED: A connection has been established, and the socket is able to receive and transmit data.
  • DISCONNECTING: The connection is in the process of being terminated.

Wow, that’s a lot of information! Many of the netstat options refine the results in one way or another, but they don’t change the content too much. Let’s take a look.

Listing Sockets by Type

The netstat -a command can provide more information than you need to see. If you only want or need to see the TCP sockets, you can use the -t (TCP) option to restrict the display to only show TCP sockets.

netstat -at | less

The display out is greatly reduced. The few sockets that are listed are all TCP sockets.

The -u (UDP) and -x (UNIX) options behave in a similar way, restricting the results to the type of socket specified on the command line. Here’s the -u (UDP) option in use:

netstat -au | less

Only UDP sockets are listed.

Listing Sockets by State

To see the sockets that are in the listening or waiting state, use the -l (listening) option.

netstat -l | less

The sockets that are listed are those that are in the listening state.

This can be combined with the -t (TCP, -u (UDP) and -x (UNIX) options to further home in on the sockets of interest. Let’s look for listening TCP sockets:

netstat -lt | less

Now, we see only TCP listening sockets.

Network Statistics by Protocol

To see statistics for a protocol, use the -s (statistics) option and pass in the -t (TCP), -u (UDP), or -x (UNIX) options. If you just use the -s (statistics) option on its own, you’ll see statistics for all protocols. Let’s check the statistics for the TCP protocol.

netstat -st | less

A collection of statistics for the TCP connections is displayed in less.

Showing Process Names and PIDs

It can be useful to see the process ID (PID) of the process using a socket, together with the name of that process. The -p (program) option does just that. Let’s see what the PIDs and process names are for the processes using a TCP socket that is in the listening state. We use sudo to make sure we receive all of the information that is available, including any information that would normally require root permissions.

sudo netstat -p -at

Here’s that output in a formatted table:

Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name  tcp 0 0 localhost:domain 0.0.0.0:* LISTEN 6927/systemd-resolv  tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 751/sshd  tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN 7687/cupsd  tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN 1176/master  tcp6 0 0 [::]:ssh [::]:* LISTEN 751/sshd  tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN 7687/cupsd  tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN 1176/master

We’ve got an extra column called “PID/program name.” This column lists the PID and name of the process using each of the sockets.

Listing Numeric Addresses

Another step we can take to remove some ambiguity is to display the local and remote addresses as IP addresses instead of their resolved domain and hostnames. If we use the -n (numeric) option, the IPv4 addresses are shown in dotted-decimal format:

sudo netstat -an | less

The IP addresses are shown as numeric values. The port numbers are also shown, separated by a colon ” : ” from the IP Address.

An IP address of 127.0.0.1 shows that the socket is bound to the loopback address of the local computer. You can think of an IP address of 0.0.0.0 as meaning the “default route” for local addresses, and “any IP address” for foreign addresses. IPv6 addresses shown as “::” are also all zero addresses.

The ports that are listed can be easily checked to see what their usual purpose is:

  • 22: This is the Secure Shell (SSH) listening port.
  • 25: This the Simple Mail Transfer Protocol (SMTP) listening port.
  • 53: This is the Domain Name System (DNS) listening port.
  • 68: This is the Dynamic Host Configuration Protocol (DHCP) listening port.
  • 631: This is the Common UNIX Printing System (CUPS) listening port.

RELATED:What is the Difference Between 127.0.0.1 and 0.0.0.0?

Displaying the Routing Table

The -r (route) option displays the kernel routing table.

sudo netstat -r

Here’s that output in a neat table:

Kernel IP routing table Destination   Gateway       Genmask        Flags  MSS Window  irtt  Iface default       Vigor.router  0.0.0.0        UG       0  0          0 enp0s3 link-local    0.0.0.0       255.255.0.0    U       0  0          0 enp0s3 192.168.4.0   0.0.0.0       255.255.255.0 U       0  0          0 enp0s3

And, here’s what the columns mean:

  • Destination: The destination network or destination host device (if the destination is not a network).
  • Gateway: The gateway address. An asterisk “*” appears here if a gateway address is not set.
  • Genmask: The subnet mask for the route.
  • Flags: See the flags table, below.
  • MSS: Default Maximum Segment Size for TCP connections over this route—this is the largest amount of data that can be received in one TCP segment.
  • Window: The default window size for TCP connections over this route, indicating the number of packets that can be transferred and received before the receiving buffer is full. In practice, the packets are consumed by the receiving application.
  • irtt: The Initial Round Trip Time. This value is referenced by the kernel to make dynamic adjustments to TCP parameters for remote connections that are slow to respond.
  • Iface: The network interface from which the packets sent over this route are transmitted.

The flags value can be one of:

  • U: The route is up.
  • H: Target is a host and the only destination possible on this route.
  • G: Use the gateway.
  • R: Reinstate the route for dynamic routing.
  • D: Dynamically installed by the routing daemon.
  • M: Modified by the routing daemon when it received an Internet Control Message Protocol (ICMP) packet.
  • A: Installed by addrconf, the automated DNS and DHCP config file generator.
  • C: Cache entry.
  • !: Reject route.

Finding the Port Used by a Process

If we pipe the output of netstat through grep, we can search for a process by name and identify the port it is using. We use the -a (all), -n (numeric) and -p (program) options used previously, and search for “sshd.”

sudo netstat -anp | grep "sshd"

grep finds the target string, and we see that the sshd daemon is using port 22.

Of course, we can also do this in reverse. If we search for “:22”, we can find out which process is using that port, if any.

sudo netstat -anp | grep ":22"

This time grep finds the “:22” target string, and we see that the process using this port is the sshd daemon, process ID 751.

List the Network Interfaces

The -i (interfaces) option will display a table of the network interfaces that netstat can discover.

sudo netstat -i

Here’s the output in a more legible fashion:

Kernel Interface table Iface    MTU   RX-OK  RX-ERR RX-DRP  RX-OVR   TX-OK   TX-ERR   TX-DRP   TX-OVR Flg enp0s3   1500 4520671 0 0 0 4779773 0 0 0 BMRU lo 65536 30175 0 0 0 30175 0 0 0 LRU

This is what the columns mean:

  • Iface: The name of the interface. The enp0s3 interface is the network interface to the outside world, and the lo interface is the loopback interface. The loopback interface enables processes to intercommunicate within the computer using networking protocols, even if the computer is not connected to a network.
  • MTU: The Maximum Transmission Unit (MTU). This is the largest “packet” that can be sent. It consists of a header containing routing and protocol flags, and other metadata, plus the data that is actually being transported.
  • RX-OK: The number of packets received, with no errors.
  • RX-ERR: The number of packets received, with errors. We want this to be as low as possible.
  • RX-DRP: The number of packets dropped (i.e., lost). We also want this to be as low as possible.
  • RX-OVR: Number of packets lost due to overflows when receiving. This usually means that the receiving buffer was full and could not accept any more data, but more data was received and had to be discarded. The lower this figure, the better, and zero is perfect.
  • TX-OK: The number of packets transmitted, with no errors.
  • RX-ERR: The number of packets transmitted, with errors. We want this to be zero.
  • RX-DRP: The number of packets dropped when transmitting. Ideally, this should be zero.
  • RX-OVR: The number of packets lost due to overflows when transmitting. This usually means the send buffer was full and could not accept any more data, but more data was was ready to be transmitted and had to be discarded.
  • Flg: Flags. See the flags table below.

The flags represent the following:

  • B: A broadcast address is in use.
  • L: This interface is a loopback device.
  • M: All packets are being received (i.e., in promiscuous mode). Nothing is filtered or discarded.
  • O: Address Resolution Protocol (ARP) is turned off for this interface.
  • P: This is a Point-to-Point (PPP) connection.
  • R: The interface is running.
  • U: The interface is up.

List Multicast Group Memberships

Simply put, a multicast transmission enables a packet to be sent only once, regardless of the number of recipients. For services such as video streaming, for example, this increases the efficiency from the sender’s point of view by a tremendous amount.

The -g (groups) option makes netstat list the multicast group membership of sockets on each interface.

sudo netstat -g

The columns are quite simple:

  • Интерфейс: имя интерфейса, по которому сокет передает данные.
  • RefCnt: счетчик ссылок, который представляет собой количество процессов, подключенных к сокету.
  • Группа: имя или идентификатор группы многоадресной рассылки.

Новые дети в квартале

Команды route, ip, ifconfig и ss могут предоставить многое из того, что netstatмогут вам показать. Все они отличные команды, и их стоит проверить.

Мы сосредоточились на этом, netstatпотому что он доступен повсеместно, независимо от того, с какой Unix-подобной операционной системой вы работаете, даже с малоизвестными.