Быстрая проверка — nc -zv host port: «succeeded» значит порт открыт, «refused» значит машина ответила, но никто не слушает, а полное молчание почти всегда значит, что фаервол роняет пакет. Это три разных отказа с тремя разными способами лечения. Дальше — дерево решений, чтобы их различать, а не ещё один список из пяти утилит, которые делают одно и то же рукопожатие.
1. Порт правда открыт?
$ clai проверь, открыт ли порт 8099 на 127.0.0.1→ nc -zv 127.0.0.1 8099Connection to 127.0.0.1 8099 port [tcp/*] succeeded!
-z только проверяет соединение, ничего не отправляя, -v печатает результат. Это самый короткий ответ на вопрос.
2. Порт закрыт — и это тоже конкретный ответ
$ clai проверь порт 8098→ nc -zv 127.0.0.1 8098nc: connect to 127.0.0.1 port 8098 (tcp) failed: Connection refused
«Connection refused» означает, что машина доступна и ответила отказом — то есть на этом порту никто не слушает. Это хорошая новость: сеть в порядке, проблема в сервисе.
3. Как отличить отказ от тишины
$ clai проверь порты 8098 и 8099 и покажи причину→ nmap --reason -p 8099,8098 127.0.0.1PORT STATE SERVICE REASON8098/tcp closed unknown conn-refused8099/tcp open unknown syn-ack
Колонка REASON и есть диагноз. syn-ack — открыт. conn-refused — никто не слушает. no-response — пакет утонул, почти всегда фаервол. Только здесь три причины видны по отдельности.
4. Взгляд с другой стороны: кто слушает
$ clai покажи, какой процесс слушает порт 8099→ ss -tlnp | grep 8099LISTEN 0 5 0.0.0.0:8099 0.0.0.0:* users:(("python3",pid=2411411,fd=3))
0.0.0.0:8099 означает «на всех интерфейсах». Если бы там было 127.0.0.1:8099, сервис отвечал бы только локально, и снаружи вы получили бы отказ при полностью исправном сервисе. Это третья причина, и видна она только отсюда.
5. Нет ни nc, ни nmap
$ clai проверь порт без установки дополнительных утилит→ timeout 2 bash -c 'echo > /dev/tcp/127.0.0.1/8099' && echo "open" || echo "closed"open
bash умеет открывать TCP-соединения через псевдоустройство /dev/tcp. Работает на голом контейнере, где нет ни nc, ни nmap. timeout обязателен, иначе на фильтруемом порту вы будете ждать таймаута ядра.
6. Проверить сразу несколько портов на удалённом хосте
$ clai проверь порты 22, 80 и 443 на example.com→ nmap -Pn -p 22,80,443 example.com
-Pn пропускает пинг-проверку. Многие хосты не отвечают на ICMP, и без этого флага nmap решит, что машина недоступна, и вообще не станет сканировать порты.
Грабли
- «Connection refused» и «таймаут» — разные диагнозы. Отказ означает, что пакет дошёл до машины. Тишина означает фаервол или потерю пакетов. Не лечите одно средствами другого.
- Сканирование чужих хостов может быть незаконным. Направляйте nmap на свою инфраструктуру, а не на чужую.
- UDP так не проверить. Для UDP нет рукопожатия, и
nc -zuпочти всегда покажет «succeeded». Нуженnmap -sUи терпение.
Похожие вопросы
Порт открыт, но приложение не отвечает. Значит, слушает не тот процесс или он не успевает ответить. Посмотрите вывод ss -tlnp и логи сервиса.
Как проверить порт из-под Windows? Test-NetConnection -Port 443 example.com в PowerShell.
Почему telnet больше не советуют? Он делает то же самое, но чаще всего не установлен, а nc и /dev/tcp доступны почти везде.
Читайте также
- Убить процесс, который держит порт 8080
- Сетевая диагностика по-человечески: соединения, порты, DNS
- Процесс, который не хочет умирать
Не запоминайте флаги nc и nmap — опишите проблему, а команду напишет CliAI. Установка одной строкой.