Открытые порты в Linux: ss, netstat, lsof, nmap
- 15 сентября 2026 г.
- 09:00
- Автор: Adrien Roche
- Обновлено 3 октября 2026 г.
- Сети

Проверка открытых портов с помощью 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 nownetstat всё ещё работает, но это наследие
Миллионы руководств до сих пор советуют 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/tcpfuser самый компактный: он печатает 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. Всё остальное требует объяснения. Затем идите по чек-листу:
- Определите каждый слушатель по имени процесса и PID; отключите любую службу, которую не заказывали.
- Поставьте под сомнение каждую привязку к
0.0.0.0или[::]: базы данных и админ-панели должны сидеть на127.0.0.1, если они действительно не обслуживают сеть. - Узнавайте распространённые порты с первого взгляда: 22 SSH, 80/443 веб, 3306 MySQL, 5432 PostgreSQL, 6379 Redis. Порт 3389 отвечает за удалённый рабочий стол: в Linux это значит, что запущен xrdp, а правила его открытия и защиты разобраны в нашем руководстве по порту RDP 3389.
- Отсканируйте публичный IP со своей машины через
nmap -p-и сравните результат со спискомss; каждое расхождение означает либо работающий брандмауэр, либо привязку к loopback. - Завершите брандмауэром с политикой default-deny, который разрешает только сознательно открытые порты.
Весь набор инструментов, по одной строке на каждый:
| Команда | Что показывает | Когда использовать |
|---|---|---|
sudo ss -tulpn | Прослушиваемые сокеты TCP/UDP с владеющим процессом | Повседневный первый взгляд на любой машине |
netstat -tulpn | То же самое через устаревшие net-tools | Старые системы, где нет ss |
sudo lsof -i :PORT | Процессы и соединения на одном порту | Связать порт с процессом и его файлами |
sudo fuser -v PORT/tcp | PID, привязанные к порту | Быстрый поиск 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), который работает нормально, но шумит сильнее.Как проверить, открыт ли конкретный порт на удалённом сервере?
nc -zv example.com 443 пытается установить TCP-соединение и сообщает об успехе или ошибке, не передавая данные. Если netcat нет, справится и чистый Bash: timeout 3 bash -c '</dev/tcp/example.com/443' && echo open. Оба способа доказывают лишь то, что кто-то принял соединение, и ничего не говорят о том, какая служба ответила и здорова ли она. Для UDP надёжного быстрого теста нет, потому что молчащий порт может быть открыт или зафильтрован; там применяйте nmap -sU.Почему ss показывает порт как прослушиваемый, но подключиться извне не удаётся?
127.0.0.1:PORT или [::1]:PORT означает, что служба принимает только локальные соединения, и это намеренно и обычно для баз данных. Если привязка к 0.0.0.0, значит пакеты где-то на пути фильтруются: локальным брандмауэром вроде ufw, firewalld или чистого nftables, либо фильтрацией на границе сети провайдера. Внешний скан nmap, показывающий порт как filtered, подтверждает брандмауэр; closed значит, что трафик доходит, но на этом интерфейсе никто не слушает.Какие порты должны быть открыты на новом сервере Linux?
sshd на порту 22. DNS-заглушка на 127.0.0.53:53 (systemd-resolved) является нормой и извне недоступна. Облачные образы иногда добавляют агента или демона мониторинга: определите каждый слушатель через ss -tulpn и отключите всё, что не заказывали. Каждая служба, установленная позже, должна по умолчанию слушать loopback, если ей действительно не нужно обслуживать сеть, а брандмауэр должен разрешать только публичное.Adrien Roche, Редактор по инфраструктуре и хостингу
Системный инженер с более чем 10-летним опытом эксплуатации парков Windows Server и Linux. Адриен ведёт документацию по инфраструктуре rdp.monster и пишет наши руководства по RDP, VPS-хостингу, администрированию серверов, сетям и инструментам приватности.




