Введение
В этой лабораторной работе вы научитесь использовать команду 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 для быстрого запуска веб-сервера. Это удобный инструмент для разработки и тестирования.
Сначала давайте запустим веб-сервер. Мы укажем ему слушать на порту
8080, который является распространенным альтернативным портом для веб-сервисов. В терминале выполните следующую команду. Обратите внимание, что ваш терминал как бы "зависнет", поскольку он теперь активно выполняет сервер.python3 -m http.server 8080Вы должны увидеть вывод, указывающий на запуск сервера:
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...Этот терминал теперь занят процессом веб-сервера. Вам понадобится новый терминал для выполнения других команд. В среде LabEx вы можете открыть новую вкладку терминала, нажав значок "плюс" в окне терминала или через меню (
File -> New Tab).В вашей новой вкладке терминала снова выполните команду
netstat, чтобы увидеть список прослушиваемых портов.sudo netstat -tulnpВнимательно изучите вывод. Теперь вы увидите новую запись для порта
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. Вы успешно запустили службу и подтвердили, что она ожидает сетевых соединений.Теперь давайте остановим службу. Вернитесь в первую вкладку терминала (ту, где запущен сервер Python) и нажмите
Ctrl+C. Это прервет и завершит процесс сервера.Вернитесь во вторую вкладку терминала и выполните команду
netstatв последний раз.sudo netstat -tulnpСтрока для порта
8080исчезнет, что доказывает, что при завершении работы приложения оно перестает прослушивать порт.
Создание нового соединения путем просмотра веб-сайта
На этом шаге вы сместите фокус с прослушиваемых портов на стороне сервера на активные соединения на стороне клиента. До сих пор вы наблюдали за службами, ожидающими подключения к ним. Теперь вы инициируете соединение с вашей машины к удаленному серверу и увидите, как формируется соединение. Мы будем использовать утилиту командной строки curl для имитации посещения веб-сайта.
Чтобы наблюдать за этим мимолетным событием, мы будем использовать команду watch, которая многократно выполняет другую команду, позволяя нам видеть изменения в выводе netstat практически в реальном времени.
Сначала настроим окно мониторинга. В терминале выполните следующую команду. Она будет выполнять
netstat -antpкаждые две секунды и отображать результаты, постоянно обновляя экран.watch netstat -antpa: Показывает все сокеты.n: Показывает числовые адреса.t: Показывает только TCP соединения.p: Показывает PID/Имя программы.
Ваш терминал теперь будет заполнен выводом
netstat, который обновляется автоматически. Оставьте этот терминал открытым и видимым.Теперь вам нужно открыть новую вкладку терминала, чтобы выполнить команду, которая создаст соединение. Нажмите значок "плюс" на панели вкладок вашего терминала.
В новой вкладке терминала вы будете использовать
curlдля получения главной страницы веб-сайта LabEx. Символ>перенаправляет HTML-вывод в/dev/null, чтобы он не загромождал ваш экран.curl https://www.labex.io > /dev/nullКак только вы нажмете
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в примере). Это эфеме́рный порт, который мы обсудим на следующем шаге.
- Обратите внимание, что
Как только команда
curlзавершит загрузку (что происходит очень быстро), вы увидите, как состояние соединения изменится наTIME_WAITилиFIN_WAIT, прежде чем оно полностью исчезнет из списка.Теперь вы можете остановить команду
watch. Перейдите в первую вкладку терминала и нажмитеCtrl+C. Вы также можете закрыть вторую вкладку терминала.
Определение установленной сессии и эфемерных портов
На этом заключительном шаге вы закрепите свое понимание, изучив постоянное активное соединение. Это позволит вам четко идентифицировать сетевой "сеанс" и увидеть, как ваша система использует временные, или "эфемерные", порты для связи на стороне клиента.
Соединение ESTABLISHED в выводе netstat представляет собой активный сеанс (OSI Layer 5), в котором два приложения готовы обмениваться данными. В предыдущем шаге сеанс curl был очень кратким. Чтобы легче изучить сеанс, мы создадим один, который останется открытым, используя SSH.
Сначала определим важное понятие: эфемерные порты. Когда ваш компьютер (клиент) подключается к серверу на известном порту (например, порт 22 для SSH или 443 для HTTPS), ваша операционная система должна назначить порт для своей стороны разговора. Она выбирает временный, неиспользуемый порт из диапазона высоких номеров (обычно выше 32768). Это называется эфемерным портом. Этот механизм позволяет вашей одной машине иметь множество отдельных соединений с одним и тем же портом сервера, например, иметь несколько открытых вкладок браузера на одном и том же веб-сайте.
Чтобы создать стабильное, наблюдаемое соединение, вы выполните 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для продолжения.Появится запрос на ввод пароля. Вводить пароль не нужно, просто оставьте как есть.
Откройте новую вкладку терминала, нажав значок "плюс". Нам нужен этот новый терминал для выполнения
netstatбез нарушения нашего активного SSH-сеанса.В новом терминале снова выполните
netstat, но на этот раз мы будем использовать командуgrepдля фильтрации вывода и отображения только строк, содержащихESTABLISHED. Это значительно упрощает поиск активных сеансов.netstat -antp | grep ESTABLISHEDВывод покажет все текущие активные 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, оно использовало бы другой эфемерный порт.
- Серверная сторона соединения — это
Чтобы завершить, закройте сеанс. Переключитесь на вкладку терминала, где вы выполнили
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 и понять роль эфемерных портов, которые являются временными портами, назначенными клиентской стороне сетевой связи.



