RDP Monster

Открытые порты в Linux: ss, netstat, lsof, nmap

Открытые порты в Linux: ss, netstat, lsof, nmap

Проверка открытых портов с помощью ss, современного стандарта

Каждый открытый порт в Linux существует потому, что какой-то процесс попросил ядро слушать его. Сегодня эти сокеты показывает утилита ss (socket statistics) из набора iproute2, установленного в любом современном дистрибутиве. Одна команда покрывает большинство ситуаций:

sudo ss -tulpn

Каждый флаг делает одну вещь:

  • -t: включить сокеты TCP
  • -u: включить сокеты UDP
  • -l: показать только прослушиваемые сокеты (уберите его, чтобы видеть также установленные соединения)
  • -p: показать процесс, владеющий каждым сокетом; именно ради этого нужен sudo, иначе вы увидите только свои процессы
  • -n: числовой вывод (печатать :22 вместо :ssh и пропускать обратные DNS-запросы, что также ускоряет команду)

Типичная строка вывода выглядит так:

Netid State  Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
tcp   LISTEN 0      128          0.0.0.0:22         0.0.0.0:*    users:(("sshd",pid=712,fd=3))

Столбец Local Address является главным для безопасности. 0.0.0.0:22 значит, что сокет принимает соединения на всех интерфейсах IPv4, [::]:22 означает то же для IPv6, а 127.0.0.1:5432 означает, что служба отвечает только на loopback и совсем недоступна из сети.

Несколько вариантов, которые стоит запомнить:

ss -tlnp                      # TCP listeners only
ss -ulnp                      # UDP listeners only
sudo ss -tlnp 'sport = :22'   # who is listening on port 22
ss -tn state established      # active TCP connections right now

netstat всё ещё работает, но это наследие

Миллионы руководств до сих пор советуют netstat -tulpn, и флаги один в один совпадают с командой ss выше, так что мышечная память работает в обе стороны. Разница внутри: netstat входит в пакет net-tools, переведённый в режим сопровождения, и читает файлы /proc, тогда как ss спрашивает ядро напрямую через netlink, что заметно быстрее на машинах с тысячами сокетов.

Большинство актуальных дистрибутивов больше не поставляет net-tools по умолчанию. Если пакет всё же нужен:

sudo netstat -tulpn

# if the command is missing:
sudo apt install net-tools    # Debian / Ubuntu
sudo dnf install net-tools    # RHEL / Fedora

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

lsof: порты с точки зрения процессов

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

sudo lsof -i -P -n                  # every process with a network socket
sudo lsof -iTCP -sTCP:LISTEN -P -n  # TCP listeners only
sudo lsof -i :443                   # everything touching port 443

-P и -n отключают разрешение имён портов и хостов: та же идея, что и -n в ss -tulpn. Третья форма самая ходовая: укажите порт и получите имя команды, PID, пользователя и файловый дескриптор в одной читаемой таблице. В отличие от ss, lsof также показывает установленные соединения каждого процесса рядом с его слушателями, и это помогает понять, кто сейчас общается со службой, а не только что она существует.

nmap: слушать не значит быть доступным

Всё вышесказанное отвечает на один вопрос: что слушает на этой машине. Для безопасности важнее другой вопрос: до чего реально можно дотянуться снаружи. Списки редко совпадают, потому что локальные брандмауэры, фильтрация на стороне провайдера и привязка только к loopback создают разрывы между ними. Поэтому же сканирование себя с самого себя мало что доказывает: nmap localhost идёт через интерфейс loopback, полностью обходит внешние правила брандмауэра и бодро сообщает о службах, до которых атакующий никогда не доберётся.

Запускайте скан с другой машины, указав публичный IP сервера:

nmap 203.0.113.10                            # top 1000 TCP ports
nmap -p- 203.0.113.10                        # all 65535 TCP ports
sudo nmap -sU --top-ports 100 203.0.113.10   # common UDP ports (slow)

nmap сообщает три состояния, которые стоит понимать: open (служба ответила), closed (пакет дошёл, но там никто не слушает) и filtered (пакет был тихо отброшен, почти всегда брандмауэром). Порт, который ss показывает как LISTEN, а удалённый nmap показывает как filtered, и есть точная картина работающего брандмауэра. Одно правило действует без исключений: сканируйте только те узлы, которыми владеете или на тест которых у вас есть явное разрешение.

Найти точно тот процесс, который держит порт

Представьте, что кто-то занял порт 8080 и ваше приложение не может привязаться. К PID ведут три дороги:

sudo ss -tlnp 'sport = :8080'
sudo lsof -i :8080
sudo fuser -v 8080/tcp

fuser самый компактный: он печатает PID, а -v добавляет пользователя и имя команды. Он даже может сразу убить виновника через fuser -k 8080/tcp, но это посылает сигнал без корректного завершения службы, так что держите это на крайний случай. Когда PID известен, ps -fp PID покажет полную командную строку, а systemctl status PID покажет, какой юнит systemd его запустил.

Когда инструментов нет вообще (например, в урезанном образе контейнера), всегда остаётся собственная таблица ядра: cat /proc/net/tcp. Порты там в шестнадцатичном виде (0016 означает 22), а состояние 0A означает LISTEN. Именно эти сырые данные разбирают и форматируют остальные утилиты.

Всё, что привязывает сокет, появляется в этих списках одинаково, будь то база данных или прокси-стек: входящее соединение V2Ray, например, представляет собой просто ещё один слушатель на том порту, который вы настроили, как объяснено в нашем руководстве по протоколу V2Ray.

Закрыть открытый порт: kill или брандмауэр

Порт открыт потому, что на нём слушает процесс, и у вас есть два разных рычага: убрать слушателя или заблокировать доступность. Они не взаимозаменяемы, и на чём-то важном обычно стоит дернуть оба.

Чистое решение состоит в том, чтобы остановить и отключить службу, владеющую сокетом. Убить PID кажется быстрее, но редко даёт результат: systemd автоматически перезапускает подконтрольные службы, и порт снова занят ещё до того, как вы повторите ss. Оставьте kill для процессов, запущенных вручную. Чтобы увидеть, что запущено, и выключить лишнее, смотрите наше руководство по списку служб через systemctl, которое разбирает этот сценарий от начала до конца.

sudo systemctl stop cups
sudo systemctl disable cups

За второй рычаг отвечает брандмауэр. В Ubuntu разрешите SSH до включения ufw, иначе вы закроете себе доступ к машине:

sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw enable

В системах семейства RHEL зона firewalld по умолчанию уже отбрасывает незапрошенный трафик; удалите всё, что открывали раньше, через firewall-cmd --permanent --remove-port=8080/tcp и затем firewall-cmd --reload. А вот что решением не является: перенос службы на нестандартный порт. Это скроет вас от самых ленивых сканеров и разгрузит логи, но nmap -p- найдёт новый порт за минуты. Неизвестность не равна безопасности: закройте порт или зафильтруйте его.

Пятиминутный аудит портов нового сервера

При первом входе на только что выданный сервер соберите инвентарь командой sudo ss -tulpn. Чистая минимальная установка должна показать очень мало: sshd на 22 и, в дистрибутивах с systemd-resolved, DNS-заглушку на 127.0.0.53:53. Всё остальное требует объяснения. Затем идите по чек-листу:

  1. Определите каждый слушатель по имени процесса и PID; отключите любую службу, которую не заказывали.
  2. Поставьте под сомнение каждую привязку к 0.0.0.0 или [::]: базы данных и админ-панели должны сидеть на 127.0.0.1, если они действительно не обслуживают сеть.
  3. Узнавайте распространённые порты с первого взгляда: 22 SSH, 80/443 веб, 3306 MySQL, 5432 PostgreSQL, 6379 Redis. Порт 3389 отвечает за удалённый рабочий стол: в Linux это значит, что запущен xrdp, а правила его открытия и защиты разобраны в нашем руководстве по порту RDP 3389.
  4. Отсканируйте публичный IP со своей машины через nmap -p- и сравните результат со списком ss; каждое расхождение означает либо работающий брандмауэр, либо привязку к loopback.
  5. Завершите брандмауэром с политикой default-deny, который разрешает только сознательно открытые порты.

Весь набор инструментов, по одной строке на каждый:

КомандаЧто показываетКогда использовать
sudo ss -tulpnПрослушиваемые сокеты TCP/UDP с владеющим процессомПовседневный первый взгляд на любой машине
netstat -tulpnТо же самое через устаревшие net-toolsСтарые системы, где нет ss
sudo lsof -i :PORTПроцессы и соединения на одном портуСвязать порт с процессом и его файлами
sudo fuser -v PORT/tcpPID, привязанные к портуБыстрый поиск PID, скрипты
nmap SERVER_IP (удалённо)Порты, реально доступные извнеПроверка брандмауэра и реальной экспозиции
cat /proc/net/tcpСырая таблица сокетов ядра (hex)Минимальные контейнеры без установленных утилит

Команды становятся рефлексами только на машине, где у вас настоящий root и где нельзя сломать ничего важного. Linux VPS от rdp.monster даёт именно такую песочницу: полный административный доступ, выделенные CPU и RAM, неограниченный трафик (fair-use), без KYC, а сервер оказывается онлайн примерно через 10 секунд после подтверждения платежа, что достаточно быстро, чтобы выполнить на нём свой первый ss -tulpn, пока кофе не остыл.

Часто задаваемые вопросы

Нужен ли root, чтобы проверить открытые порты в Linux?

Нет, если нужен только список портов; да, если нужно видеть владеющие ими процессы.
Любой пользователь может выполнить ss -tuln или прочитать /proc/net/tcp, так что список прослушиваемых портов никогда не скрыт. Ограничение касается флага -p: без root ss, lsof и fuser показывают только процессы вашего пользователя, а остальные сокеты идут с пустым столбцом процесса. В nmap скан SYN по умолчанию (-sS) требует root; непривилегированной альтернативой служит connect-скан (-sT), который работает нормально, но шумит сильнее.

Как проверить, открыт ли конкретный порт на удалённом сервере?

Используйте netcat: nc -zv host port даёт мгновенный ответ.
nc -zv example.com 443 пытается установить TCP-соединение и сообщает об успехе или ошибке, не передавая данные. Если netcat нет, справится и чистый Bash: timeout 3 bash -c '</dev/tcp/example.com/443' && echo open. Оба способа доказывают лишь то, что кто-то принял соединение, и ничего не говорят о том, какая служба ответила и здорова ли она. Для UDP надёжного быстрого теста нет, потому что молчащий порт может быть открыт или зафильтрован; там применяйте nmap -sU.

Почему ss показывает порт как прослушиваемый, но подключиться извне не удаётся?

Сокет привязан к loopback либо трафик режет брандмауэр.
Сначала проверьте столбец Local Address: 127.0.0.1:PORT или [::1]:PORT означает, что служба принимает только локальные соединения, и это намеренно и обычно для баз данных. Если привязка к 0.0.0.0, значит пакеты где-то на пути фильтруются: локальным брандмауэром вроде ufw, firewalld или чистого nftables, либо фильтрацией на границе сети провайдера. Внешний скан nmap, показывающий порт как filtered, подтверждает брандмауэр; closed значит, что трафик доходит, но на этом интерфейсе никто не слушает.

Какие порты должны быть открыты на новом сервере Linux?

Один: SSH. Всё остальное на чистой установке требует объяснения.
Минимальная установка Debian, Ubuntu или Rocky должна открывать сети только sshd на порту 22. DNS-заглушка на 127.0.0.53:53 (systemd-resolved) является нормой и извне недоступна. Облачные образы иногда добавляют агента или демона мониторинга: определите каждый слушатель через ss -tulpn и отключите всё, что не заказывали. Каждая служба, установленная позже, должна по умолчанию слушать loopback, если ей действительно не нужно обслуживать сеть, а брандмауэр должен разрешать только публичное.

Adrien Roche, Редактор по инфраструктуре и хостингу

Системный инженер с более чем 10-летним опытом эксплуатации парков Windows Server и Linux. Адриен ведёт документацию по инфраструктуре rdp.monster и пишет наши руководства по RDP, VPS-хостингу, администрированию серверов, сетям и инструментам приватности.

Регистрация в программе для реселлеров

Ваши данные

Если у вас есть вопросы, contact us by clicking here !
Имя и фамилия(Обязательно)
Укажите ваш email: у вас должен быть аккаунт на manager.rdp.monster !

Ваша компания

Укажите адрес вашего сайта, если он у вас есть
Кратко опишите, как вы будете продавать услуги своим клиентам. Например, общаться с людьми на форумах.

Мы используем файлы cookie!

Мы используем файлы cookie, чтобы улучшить ваш опыт просмотра, предлагать персонализированную рекламу или контент и анализировать наш трафик. Нажимая «Принять», вы соглашаетесь с использованием файлов cookie.