Анализ сетевых портов и сеансов с помощью netstat в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь использовать команду netstat для анализа сетевой активности в системе Linux. Вы изучите фундаментальные концепции, такие как сетевые порты, сокеты и активные соединения, чтобы понять, как службы взаимодействуют по сети.

Вы начнете с вывода всех активных сокетов, а затем отфильтруете результаты, чтобы сосредоточиться на прослушиваемых TCP и UDP портах, сопоставив их с работающими службами. Чтобы увидеть эти концепции в действии, вы создадите новое соединение, просмотрев веб-сайт, а затем используете netstat для идентификации недавно созданной сессии ESTABLISHED и связанного с ней эфемерного порта.

Вывод списка всех активных и прослушиваемых сокетов с помощью netstat -a

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

Сначала убедитесь, что вы находитесь в вашей рабочей директории по умолчанию. Все команды в этой лабораторной работе будут выполняться из терминала.

Теперь давайте выведем все сокеты. В терминале введите следующую команду и нажмите Enter:

netstat -a

Вы увидите большой объем вывода. Не волнуйтесь, мы разберем его. Вывод показывает все типы сокетов, включая TCP, UDP и сокеты домена UNIX.

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

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      0 localhost:6010          0.0.0.0:*               LISTEN
tcp        0     52 labex-vm:ssh            192.168.0.10:54321      ESTABLISHED
tcp6       0      0 [::]:http-alt           [::]:*                  LISTEN
udp        0      0 0.0.0.0:bootpc          0.0.0.0:*
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    23456    /run/systemd/notify
unix  2      [ ACC ]     STREAM     LISTENING     34567    /tmp/.X11-unix/X0
...

Вот разбивка наиболее важных столбцов для интернет-соединений:

  • Proto: Протокол, используемый сокетом, например tcp (для TCPv4), tcp6 (для TCPv6) или udp.
  • Local Address: IP-адрес вашей системы и номер порта, который она использует для этого соединения. Порт — это число после двоеточия (:). Адрес 0.0.0.0 или [::] означает, что порт слушает все доступные сетевые интерфейсы на вашей машине.
  • Foreign Address: IP-адрес и номер порта удаленной системы. Если состояние LISTEN, это обычно будет 0.0.0.0:* или [::]:*, что указывает на ожидание соединения с любого адреса.
  • State: Это критически важно для TCP-соединений.
    • LISTEN: Приложение ожидает входящего соединения на указанном порту Local Address. Это состояние на стороне сервера.
    • ESTABLISHED: Соединение активно, и данные могут передаваться между локальным и удаленным адресами.
    • Другие состояния, такие как TIME_WAIT или CLOSE_WAIT, относятся к процессу закрытия TCP-соединения.

Уделите минуту, чтобы прокрутить вывод и найти любые записи в состоянии LISTEN. Они представляют службы в вашей системе, готовые принимать сетевые соединения. Это прямой взгляд на работу транспортного уровня (уровень 4).

Фильтрация прослушиваемых TCP/UDP портов с помощью sudo netstat -tulnp

В предыдущем шаге команда netstat -a предоставила нам полный, но обширный список всех сокетов. Чтобы сделать эту информацию более полезной, нам нужно ее отфильтровать. На этом шаге вы научитесь использовать конкретные опции с netstat для отображения только прослушиваемых TCP и UDP портов и, что наиболее важно, для идентификации программ, которые их используют.

Чтобы увидеть имя программы, связанное с портом, часто требуются административные привилегии, поскольку процесс может принадлежать системе или другому пользователю. Именно поэтому мы используем команду sudo. В среде LabEx вы можете использовать sudo без пароля.

Давайте выполним более сфокусированную команду netstat. В терминале введите следующее:

sudo netstat -tulnp

Давайте разберем эти опции, поскольку они часто комбинируются:

  • t: Отображает TCP соединения.
  • u: Отображает UDP соединения.
  • l: Отображает только lистенящие (прослушиваемые) сокеты. Это наш основной фильтр для просмотра того, какие службы ожидают соединений.
  • n: Отображает nумерические адреса. Это предотвращает попытки netstat разрешить IP-адреса и номера портов в имена хостов и имена служб (например, отображает 22 вместо ssh), что значительно ускоряет выполнение команды.
  • p: Показывает pроцесс ID (PID) и имя программы, которой принадлежит сокет. Для просмотра всех процессов требуется sudo.

После нажатия Enter ваш вывод станет намного короче и информативнее. Он будет выглядеть примерно так:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      779/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3422/sshd
udp        0      0 127.0.0.53:53           0.0.0.0:*                           779/systemd-resolve

Обратите внимание на новый столбец в конце: PID/Program name. Это ключевая информация. Теперь вы можете напрямую сопоставить прослушиваемый порт с конкретным приложением, которое его открыло. Например, в приведенном выше выводе вы можете увидеть, что порт 22 (стандартный порт для SSH) используется программой sshd с идентификатором процесса 3422.

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

Сопоставление прослушиваемых портов с запущенными службами

На этом шаге вы закрепите понимание связи между запущенными приложениями и прослушиваемыми сетевыми портами. Вы уже видели, как перечислять существующие службы с помощью netstat. Теперь вы запустите собственный простой веб-сервис и увидите его в выводе netstat, демонстрируя эту связь в реальном времени.

Мы будем использовать встроенный в Python модуль http.server для быстрого запуска веб-сервера. Это удобный инструмент для разработки и тестирования.

  1. Сначала давайте запустим веб-сервер. Мы укажем ему слушать на порту 8080, который является распространенным альтернативным портом для веб-сервисов. В терминале выполните следующую команду. Обратите внимание, что ваш терминал как бы "зависнет", поскольку он теперь активно выполняет сервер.

    python3 -m http.server 8080
    

    Вы должны увидеть вывод, указывающий на запуск сервера:

    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
    
  2. Этот терминал теперь занят процессом веб-сервера. Вам понадобится новый терминал для выполнения других команд. В среде LabEx вы можете открыть новую вкладку терминала, нажав значок "плюс" в окне терминала или через меню (File -> New Tab).

  3. В вашей новой вкладке терминала снова выполните команду netstat, чтобы увидеть список прослушиваемых портов.

    sudo netstat -tulnp
    
  4. Внимательно изучите вывод. Теперь вы увидите новую запись для порта 8080.

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      779/systemd-resolve
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3422/sshd
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      12345/python3
    udp        0      0 127.0.0.53:53           0.0.0.0:*                           779/systemd-resolve
    ...
    

    Как вы можете видеть, система теперь сообщает, что программа python3 (с определенным PID, например 12345) находится в состоянии LISTEN на порту 8080. Вы успешно запустили службу и подтвердили, что она ожидает сетевых соединений.

  5. Теперь давайте остановим службу. Вернитесь в первую вкладку терминала (ту, где запущен сервер Python) и нажмите Ctrl+C. Это прервет и завершит процесс сервера.

  6. Вернитесь во вторую вкладку терминала и выполните команду netstat в последний раз.

    sudo netstat -tulnp
    

    Строка для порта 8080 исчезнет, что доказывает, что при завершении работы приложения оно перестает прослушивать порт.

Создание нового соединения путем просмотра веб-сайта

На этом шаге вы сместите фокус с прослушиваемых портов на стороне сервера на активные соединения на стороне клиента. До сих пор вы наблюдали за службами, ожидающими подключения к ним. Теперь вы инициируете соединение с вашей машины к удаленному серверу и увидите, как формируется соединение. Мы будем использовать утилиту командной строки curl для имитации посещения веб-сайта.

Чтобы наблюдать за этим мимолетным событием, мы будем использовать команду watch, которая многократно выполняет другую команду, позволяя нам видеть изменения в выводе netstat практически в реальном времени.

  1. Сначала настроим окно мониторинга. В терминале выполните следующую команду. Она будет выполнять netstat -antp каждые две секунды и отображать результаты, постоянно обновляя экран.

    watch netstat -antp
    
    • a: Показывает все сокеты.
    • n: Показывает числовые адреса.
    • t: Показывает только TCP соединения.
    • p: Показывает PID/Имя программы.

    Ваш терминал теперь будет заполнен выводом netstat, который обновляется автоматически. Оставьте этот терминал открытым и видимым.

  2. Теперь вам нужно открыть новую вкладку терминала, чтобы выполнить команду, которая создаст соединение. Нажмите значок "плюс" на панели вкладок вашего терминала.

  3. В новой вкладке терминала вы будете использовать curl для получения главной страницы веб-сайта LabEx. Символ > перенаправляет HTML-вывод в /dev/null, чтобы он не загромождал ваш экран.

    curl https://www.labex.io > /dev/null
    
  4. Как только вы нажмете Enter, быстро переключитесь обратно на первую вкладку терминала (ту, где выполняется watch). Вы увидите новое соединение, которое появится на несколько секунд. Оно будет выглядеть примерно так:

    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    ...
    tcp        0      0 172.17.0.2:45678        104.21.5.141:443        ESTABLISHED 13579/curl
    ...
    
    • Обратите внимание, что State (Состояние) — ESTABLISHED (Установлено), что указывает на активное соединение.
    • Foreign Address (Удаленный адрес) показывает IP-адрес сервера labex.io и порт 443 (стандартный для HTTPS).
    • Столбец PID/Program name (PID/Имя программы) четко идентифицирует curl как программу, инициировавшую это соединение.
    • Local Address (Локальный адрес) использует случайный порт с высоким номером (например, 45678 в примере). Это эфеме́рный порт, который мы обсудим на следующем шаге.
  5. Как только команда curl завершит загрузку (что происходит очень быстро), вы увидите, как состояние соединения изменится на TIME_WAIT или FIN_WAIT, прежде чем оно полностью исчезнет из списка.

  6. Теперь вы можете остановить команду watch. Перейдите в первую вкладку терминала и нажмите Ctrl+C. Вы также можете закрыть вторую вкладку терминала.

Определение установленной сессии и эфемерных портов

На этом заключительном шаге вы закрепите свое понимание, изучив постоянное активное соединение. Это позволит вам четко идентифицировать сетевой "сеанс" и увидеть, как ваша система использует временные, или "эфемерные", порты для связи на стороне клиента.

Соединение ESTABLISHED в выводе netstat представляет собой активный сеанс (OSI Layer 5), в котором два приложения готовы обмениваться данными. В предыдущем шаге сеанс curl был очень кратким. Чтобы легче изучить сеанс, мы создадим один, который останется открытым, используя SSH.

Сначала определим важное понятие: эфемерные порты. Когда ваш компьютер (клиент) подключается к серверу на известном порту (например, порт 22 для SSH или 443 для HTTPS), ваша операционная система должна назначить порт для своей стороны разговора. Она выбирает временный, неиспользуемый порт из диапазона высоких номеров (обычно выше 32768). Это называется эфемерным портом. Этот механизм позволяет вашей одной машине иметь множество отдельных соединений с одним и тем же портом сервера, например, иметь несколько открытых вкладок браузера на одном и том же веб-сайте.

  1. Чтобы создать стабильное, наблюдаемое соединение, вы выполните SSH с вашей лабораторной машины на саму себя. В терминале выполните следующую команду:

    ssh localhost
    

    При первом выполнении этой команды вы можете увидеть сообщение об аутентичности хоста. Это нормально.

    The authenticity of host 'localhost (127.0.0.1)' can't be established.
    ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    

    Введите yes и нажмите Enter для продолжения.

    Появится запрос на ввод пароля. Вводить пароль не нужно, просто оставьте как есть.

  2. Откройте новую вкладку терминала, нажав значок "плюс". Нам нужен этот новый терминал для выполнения netstat без нарушения нашего активного SSH-сеанса.

  3. В новом терминале снова выполните netstat, но на этот раз мы будем использовать команду grep для фильтрации вывода и отображения только строк, содержащих ESTABLISHED. Это значительно упрощает поиск активных сеансов.

    netstat -antp | grep ESTABLISHED
    
  4. Вывод покажет все текущие активные TCP-соединения. Вы можете увидеть предупреждение о том, что не все процессы удалось идентифицировать, что ожидаемо, поскольку мы не использовали sudo. Вы должны увидеть ваше исходное SSH-соединение с лабораторной средой и новое, которое вы только что создали с localhost.

    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp        0      0 172.16.50.192:22        47.251.66.143:36882     ESTABLISHED -
    tcp        0      0 127.0.0.1:46280         127.0.0.1:22            ESTABLISHED 5449/ssh
    tcp        0      0 127.0.0.1:22            127.0.0.1:46280         ESTABLISHED -
    

    Проанализируем новое соединение localhost, идентифицированное адресом 127.0.0.1:

    • Серверная сторона соединения — это 127.0.0.1:22, то есть SSH-сервер (sshd), прослушивающий порт 22. У него установлено соединение с 127.0.0.1:46280. Информация о программе указана как -, потому что процесс sshd принадлежит пользователю root, а мы не использовали sudo.
    • Клиентская сторона — это 127.0.0.1:46280, подключенный к 127.0.0.1:22. Программа четко идентифицирована как 5449/ssh.
    • Порт 46280 является эфемерным портом. Ваша система выбрала его случайным образом для клиентского конца этого конкретного SSH-сеанса. Если бы вы открыли другое соединение ssh localhost, оно использовало бы другой эфемерный порт.
  5. Чтобы завершить, закройте сеанс. Переключитесь на вкладку терминала, где вы выполнили ssh localhost, введите exit и нажмите Enter.

    exit
    

    Это завершит соединение. Если вы снова выполните netstat -antp | grep ESTABLISHED в другом терминале, вы увидите, что сеанс localhost исчез.

Резюме

В этой лабораторной работе вы научились использовать команду netstat для анализа сетевой активности в системе Linux. Вы начали с использования netstat -a для вывода списка всех активных и прослушиваемых сокетов, включая сокеты TCP, UDP и UNIX domain sockets. Затем вы уточнили этот вывод, применив флаги, такие как -t, -u, -l, -n и -p, чтобы конкретно отфильтровать прослушиваемые порты TCP и UDP, отобразить числовые адреса и идентифицировать идентификатор процесса и имя, связанные с каждым портом.

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