Как посмотреть открытые порты в Linux: ss, systemd и проверка реального слушающего процесса

Введение​


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

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

Основные инструменты для проверки открытых портов​


ss — мощный инструмент для анализа сокетов​


ss (Socket Statistics) — это современный и эффективный инструмент, предназначенный для отображения информации о сокетах. Он предоставляет более широкие возможности по сравнению с устаревшим netstat, особенно в плане детализации информации и производительности.

Основные флаги ss​

  • -t: отображает TCP-сокеты.
  • -u: отображает UDP-сокеты.
  • -l: отображает только прослушиваемые сокеты (по умолчанию они не отображаются).
  • -a: отображает все сокеты, включая не прослушиваемые (например, Established).
  • -n: показывает числовые адреса и порты вместо разрешения имен.
  • -p: отображает информацию о процессах, использующих сокеты.

Пример использования:

Bash:
ss -tulnp

Эта команда отображает список всех прослушиваемых TCP и UDP сокетов с указанием PID процесса, если он доступен. Формат вывода:

Код:
State      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port
LISTEN     0          128                0.0.0.0:22                   0.0.0.0:*        users:("sshd",pid=1234,fd=3)
LISTEN     0          128               [::]:22                      [::]:*        users:("sshd",pid=1234,fd=3)

Примеры использования ss для анализа портов​

  1. Показать все TCP-сокеты

Bash:
ss -t

  • Показать все UDP-сокеты

Bash:
ss -u

  • Показать все прослушиваемые сокеты с процессами

Bash:
ss -tulnp

  • Фильтрация по конкретному порту

Bash:
ss -tulnp | grep :22

  • Фильтрация по состоянию соединения

Bash:
ss -t state established

Расширенные фильтры и выражения​

ss поддерживает расширенные фильтры, которые позволяют точно указать критерии отбора. Например:

Bash:
ss -o state established '( dport = :ssh or sport = :ssh )'

Эта команда отображает все установленные соединения, связанные с SSH (порт 22).

Для более сложных фильтраций можно использовать выражения:

Bash:
ss -x src /tmp/.X11-unix/*

Это покажет все локальные сокеты, связанные с X-сервером.

systemd и управление сетевыми службами​


В современных дистрибутивах Linux, таких как Ubuntu, Fedora и Debian, управление сетевыми службами часто осуществляется через systemd. Это позволяет легко отслеживать, какие службы слушают определённые порты.

Проверка активных служб через systemctl​


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

Bash:
systemctl status <service>

Например, для проверки службы SSH:

Bash:
systemctl status ssh

Вывод может содержать информацию о том, какие порты слушает служба:

Код:
● ssh.service - OpenSSH server daemon
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2024-04-01 10:00:00 UTC; 1h 30min ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1234 (sshd)
    Tasks: 1 (limit: 4915)
   Memory: 1.2M
   CGroup: /system.slice/ssh.service
           └─1234 /usr/sbin/sshd -D

Использование systemd для просмотра портов​


Службы systemd могут быть сконфигурированы для прослушивания определённых портов. Информация о таких конфигурациях может быть получена через systemctl cat или journalctl.

Bash:
systemctl cat ssh

Вывод может содержать секцию Socket или ListenStream, если служба настроена для прослушивания конкретных портов.

Проверка сетевых сокетов через systemd​


Система systemd также предоставляет интерфейс для отслеживания сокетов через systemd-socket-proxyd или через systemd-analyze.

Bash:
systemd-analyze socket

Эта команда показывает список всех сокетов, управляемых systemd.

Проверка реальных слушающих процессов​


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

Использование ps и lsof​


Инструменты ps и lsof позволяют проверить, какие процессы используют определённые порты.

Использование ps​

Bash:
ps aux | grep sshd

Использование lsof​

Bash:
lsof -i :22

Эта команда покажет, какие процессы используют порт 22.

Сравнение с ss и systemd​


Инструменты ss и systemd предоставляют более глубокую информацию о сокетах, чем lsof или ps, особенно в части метаданных и состояния соединений.

Примеры практического применения​


Анализ открытых портов на сервере​


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

  1. Показать все прослушиваемые TCP и UDP порты:

Bash:
ss -tulnp

  • Показать только TCP-порты:

Bash:
ss -tulnp | grep -E "^LISTEN"

  • Показать порты, слушаемые через systemd:

Bash:
systemctl list-sockets

  • Проверить, какой процесс слушает порт 22:

Bash:
ss -tulnp | grep :22

  • Проверить, какие службы слушают порты:

Bash:
systemctl status

Диагностика проблем с сетевыми портами​


Если вы сталкиваетесь с проблемами, связанными с сетевыми портами, такие как невозможность подключения к сервису, можно использовать следующие шаги:

  1. Проверьте, слушает ли сервис порт:

Bash:
ss -tulnp | grep :<port>

  • Проверьте, запущена ли служба:

Bash:
systemctl status <service>

  • Проверьте, есть ли конфликты портов:

Bash:
ss -tulnp | grep :<port>

  • Проверьте, какие процессы используют порт:

Bash:
lsof -i :<port>

Безопасность и рекомендации​


Проверка открытых портов на предмет уязвимостей​


Открытые порты, особенно те, которые не используются, могут быть потенциальной угрозой. Рекомендуется:

  1. Проверять, какие порты открыты на сервере.
  2. Убедиться, что только необходимые службы слушают порты.
  3. Использовать фаерволы для ограничения доступа к портам.
  4. Регулярно обновлять службы и проверять их конфигурации.

Использование фаерволов для управления портами​


Использование iptables или ufw позволяет ограничить доступ к портам:

Bash:
ufw allow 22/tcp
ufw deny 22/tcp

Заключение​


Понимание открытых портов и процессов, которые их слушают, — важный аспект администрирования Linux-серверов. Инструменты ss, systemd и lsof предоставляют мощные возможности для диагностики и управления сетевыми соединениями. Правильное использование этих инструментов позволяет повысить безопасность и эффективность работы сервера.

Следует регулярно проверять открытые порты и управлять ими, особенно в средах с высоким уровнем безопасности.

Источники​


 
Назад
Верх Низ