Проверить открытые проверку портов можно тремя способами: локально — командой netstat -ano в Windows или ss -tlnp в Linux, извне — утилитами nc и telnet с другого хоста, а также онлайн-сканером портов. Локальная проверка показывает, какие службы слушают порты, внешняя — какие из них реально видны из интернета. Для полной картины нужны обе.
В этом руководстве разберём каждый способ по шагам: встроенные команды Windows и Linux, проверку конкретного порта у сайта или сервера, типичные причины, по которым порт открыт локально, но недоступен снаружи (NAT, файрвол хоста, блокировки провайдера), а также таблицу частых портов с пояснением, что означает их видимость из интернета.
Что такое открытый порт: LISTEN и доступность извне
Порт — это число от 0 до 65535, по которому операционная система направляет входящее соединение конкретной программе. Когда служба — веб-сервер, СУБД, SSH-демон — запускается, она привязывается к порту и переходит в состояние LISTEN: начинает слушать входящие подключения. Как это устроено на уровне протоколов и чем отличаются TCP-порты от UDP, мы разбирали в статье о разнице между TCP и UDP.
Ключевое различие, из-за которого возникает большинство путаницы: «порт в состоянии LISTEN» и «порт открыт извне» — это два разных утверждения. Первое означает, что на машине есть процесс, готовый принимать соединения. Второе — что до этого процесса реально может достучаться внешний клиент: трафик не режет файрвол, NAT проброшен, провайдер ничего не блокирует. Порт может слушаться локально и быть полностью невидимым из интернета. Поэтому корректная проверка всегда состоит из двух частей: изнутри и снаружи.
Как проверить порты на Windows
netstat -ano: классический способ
Откройте командную строку (cmd) от имени администратора и выполните:
netstat -ano | findstr LISTENВывод содержит протокол, локальный адрес с портом, состояние и PID процесса. Чтобы узнать, какая программа стоит за конкретным PID, выполните tasklist | findstr 4712, подставив свой номер. Обратите внимание на локальный адрес: 0.0.0.0:3306 означает, что служба слушает все сетевые интерфейсы, а 127.0.0.1:3306 — только локальную петлю, и снаружи такой порт недоступен в принципе.
Get-NetTCPConnection: способ для PowerShell
В современных версиях Windows у netstat есть более удобная альтернатива — командлет PowerShell, который возвращает объекты, а не текст, и легко фильтруется:
Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Format-Table LocalAddress, LocalPort, OwningProcessИмя процесса, занявшего конкретный порт, получают одной строкой: Get-Process -Id (Get-NetTCPConnection -LocalPort 443 -State Listen).OwningProcess. Такой подход удобен в скриптах: результат можно передать по конвейеру дальше, выгрузить в CSV или сравнить с эталонным списком разрешённых портов.
Как проверить порты на Linux
ss -tlnp: основной инструмент
sudo ss -tlnpФлаги расшифровываются так: -t — TCP, -l — только слушающие сокеты, -n — числовые порты вместо имён служб, -p — показать процесс. Утилита ss из пакета iproute2 давно заменила устаревший netstat и работает заметно быстрее на системах с тысячами соединений. Для UDP-сокетов используйте ss -ulnp.
lsof -i: взгляд со стороны процессов
sudo lsof -i -P -n | grep LISTENlsof показывает открытые сокеты в разрезе процессов и особенно удобен, когда нужно быстро ответить на вопрос «кто занял порт»: команда sudo lsof -i :8080 сразу выведет процесс, который держит порт 8080, с его PID, пользователем и полным именем.
Как проверить порт снаружи
Все команды выше отвечают только на вопрос «что слушается на этой машине». Главный же вопрос — виден ли порт из интернета — требует проверки с другого хоста.
nc и telnet с другого хоста
nc -vz example.com 443
telnet example.com 22Флаг -z у netcat означает «только проверить соединение, данные не передавать», -v — подробный вывод. Возможны три исхода. «Succeeded» или установленное telnet-соединение — порт открыт и за ним есть служба. «Connection refused» — хост доступен, но на порту никто не слушает либо файрвол явно отвечает отказом (REJECT). Таймаут — пакеты молча отбрасываются правилом DROP или хост недостижим.
Онлайн-проверка открытых портов
Если второго хоста под рукой нет, используйте онлайн-проверку открытых портов: сканер подключается к вашему IP геолокацию или домену из интернета и показывает состояние частых портов — ровно так, как вас видит внешний мир, включая потенциального атакующего. Доступность самого хоста перед сканированием удобно проверить через пинг онлайн: если хост не отвечает вовсе, разбираться с отдельными портами рано.
Почему порт открыт локально, но не виден извне
Это самая частая ситуация в практике: ss показывает LISTEN, а внешний сканер — «closed» или «filtered». Между процессом и интернетом стоит несколько барьеров, и любой из них может резать трафик:
- Привязка к 127.0.0.1. Служба слушает только локальную петлю. Это видно прямо в выводе ss или netstat — и снаружи такой порт не откроется никогда, пока вы не поменяете адрес привязки на 0.0.0.0 или конкретный внешний интерфейс.
- Файрвол хоста. Брандмауэр Windows, iptables, nftables, ufw или firewalld по умолчанию блокируют входящие соединения на нестандартные порты. Проверьте правила:
sudo ufw statusилиsudo iptables -L -n. - NAT на роутере. Домашний или офисный роутер не пробрасывает входящие соединения на машину в локальной сети, пока вы явно не настроите port forwarding.
- Security groups облака. В AWS, Yandex Cloud и других облаках весь входящий трафик по умолчанию запрещён — порт нужно открыть в настройках группы безопасности, файрвол внутри виртуальной машины тут ни при чём.
- Блокировки провайдера. Многие интернет-провайдеры режут порт 25 (борьба со спамом), а также 445 и 139 (защита от эксплуатации SMB). Такой порт не откроется, как бы правильно ни был настроен сервер.
Диагностируйте по цепочке: сначала подтвердите LISTEN локально, затем проверьте порт с соседней машины в той же сети, затем извне. Звено, на котором соединение пропадает, и есть место блокировки.
Как проверить конкретный порт у сайта или сервера
Типовой сценарий — убедиться, что у сайта открыт 443, а у почтового сервера 25. С любого хоста с netcat это одна команда:
nc -vz mail.example.com 25Для веба быстрее сделать запрос напрямую: curl -I https://example.com — если пришёл ответ с заголовками, порт 443 открыт и TLS работает. Почтовые порты — отдельная история: 25, 465 и 587 предназначены для разных задач и по-разному блокируются провайдерами, подробный разбор — в статье о портах 25, 465 и 587.
Сравнение способов проверки
| Способ | Что показывает | Когда использовать |
|---|---|---|
netstat -ano (Windows) | Слушающие порты и PID процессов | Локальная диагностика Windows без PowerShell |
Get-NetTCPConnection | Те же данные в виде объектов PowerShell | Скрипты, автоматизация, выгрузки |
ss -tlnp (Linux) | Слушающие сокеты, процессы, адреса привязки | Локальная диагностика любого Linux-сервера |
lsof -i :порт | Какой процесс занял конкретный порт | Конфликт портов, поиск «кто держит 8080» |
nc -vz / telnet | Доступность порта с другого хоста | Проверка извне, когда есть вторая машина |
| Онлайн-сканер портов | Видимость портов из интернета | Нет второго хоста; взгляд глазами атакующего |
Частые порты: что означает их видимость
| Порт | Служба | Видимость из интернета |
|---|---|---|
| 22 | SSH | Норма для серверов; желательно ограничить доступ по IP или сменить порт |
| 80 / 443 | HTTP / SSL/TLS проверку | Норма для любого веб-сервера |
| 25 | SMTP | Оправдано только для почтового сервера |
| 3306 | MySQL / MariaDB | Не должен быть виден: доступ только с приложения или через туннель |
| 6379 | Redis | Не должен быть виден: Redis без пароля извне — классический вектор взлома |
Что именно закрывать, чем опасен каждый лишний открытый порт и как минимизировать поверхность атаки — в отдельной статье об открытых портах и безопасности.
Источники
- man ss(8) — официальная документация утилиты ss
- Get-NetTCPConnection — Microsoft Learn, модуль NetTCPIP
- man nc(1) — документация netcat
FAQ: проверка открытых портов
Чем LISTEN отличается от «порт открыт»?
LISTEN — состояние сокета на самой машине: процесс готов принимать соединения. «Порт открыт» в бытовом смысле означает, что до этого процесса можно достучаться извне. Между ними стоят файрвол, NAT и провайдер, поэтому порт в LISTEN нередко остаётся невидимым из интернета — и это нормально для внутренних служб.
Как узнать, какая программа заняла порт?
В Linux — sudo lsof -i :8080 или sudo ss -tlnp | grep 8080: обе команды покажут PID и имя процесса. В Windows — netstat -ano | findstr :8080, затем tasklist | findstr PID. После этого конфликт решается остановкой лишней службы или сменой порта в её конфигурации.
Безопасно ли проверять порты онлайн-сканером?
Да, если сканируете собственный сервер или сайт: онлайн-проверка выполняет те же TCP-подключения, что и обычный клиент, ничего не эксплуатируя. Более того, периодическое сканирование своих хостов — базовая гигиена: вы увидите случайно открытый порт раньше, чем его найдут боты, которые сканируют весь интернет непрерывно.
Почему nc показывает таймаут, а не connection refused?
«Connection refused» приходит, когда хост активно отвечает RST-пакетом: порт закрыт, но трафик доходит. Таймаут означает, что пакеты молча отбрасываются — обычно правилом DROP на файрволе или потому, что хост недостижим. Для диагностики это важный сигнал: refused указывает на службу, таймаут — на сетевой фильтр по пути.
Нужно ли закрывать все открытые порты?
Нет — закрывать нужно всё, что не используется публично. Веб-серверу нужны 80 и 443, серверу с удалённым доступом — 22. А вот базы данных, Redis, панели управления и служебные порты должны быть доступны только из внутренней сети или через VPN. Принцип простой: снаружи видно только то, что обязано быть видно.