Что такое netcat и чем он удобен
Netcat — небольшая утилита, которую часто называют «швейцарским ножом» сетевой диагностики. Она умеет открывать TCP- и UDP-соединения и передавать по ним всё, что вы введёте или перенаправите из файла. Для проверки порта её используют вместо telnet: команда короче, вывод понятнее, а выход не приходится искать по горячим клавишам.
Существует несколько реализаций: OpenBSD-вариант, используемый в большинстве современных дистрибутивов Linux и в macOS, традиционный netcat и ncat из пакета nmap. Основные ключи для проверки у них совпадают, но различия есть в записи прослушивания и в текстах сообщений. Если сомневаетесь, посмотрите справку командой nc -h или man nc: в ней указан именно ваш вариант.
В Windows nc по умолчанию нет. Можно установить ncat вместе с пакетом nmap, но проще воспользоваться Test-NetConnection, о которой рассказано на соседней странице.
Проверка порта: ключи и ответы
Основная команда: nc -zv example.com 443. Ключ -z означает «только проверить, не отправляя данных», ключ -v включает подробный вывод. Без -v команда молчит, и о результате говорит только код завершения.
| Ключ | Что делает |
|---|---|
| -z | Режим сканирования: соединиться и закрыть без передачи данных |
| -v | Подробный вывод; -vv ещё подробнее |
| -w N | Таймаут в секундах |
| -u | Использовать UDP вместо TCP |
| -l | Слушать входящее соединение |
| -n | Не разрешать имена, работать только с адресами |
| -4, -6 | Принудительно IPv4 или IPv6 |
| -p порт | Указать исходный порт; в некоторых версиях нужен и для -l |
Пример вывода при успехе (пример): Connection to example.com 443 port [tcp/https] succeeded! В других версиях фраза звучит чуть иначе, например open. При отказе увидите connect to ... failed: Connection refused, что значит: узел ответил, но на порту никто не слушает. Если ответа нет вовсе, а команда ждёт и завершается по таймауту, пакеты, скорее всего, фильтруются. Поэтому в скриптах всегда задавайте -w, например -w 3.
Диапазон портов проверяется записью через дефис: nc -zv 192.168.1.20 20-25. В выводе увидите строку по каждому порту, а лишние отказы можно отфильтровать через grep succeeded в Linux и macOS. Для большого числа портов лучше использовать сканер, а не netcat.
Слушаем порт: проверка связи между двумя своими устройствами
Второе применение — проверить, доходят ли пакеты между вашими устройствами, независимо от каких-либо служб. Порядок такой.
- На принимающей машине откройте порт: nc -l 9000. В традиционной версии запись может быть nc -l -p 9000.
- На второй машине подключитесь: nc адрес-первой-машины 9000.
- Наберите любой текст на одной стороне и нажмите Enter: он должен появиться на другой.
- Если не появился, проверьте локальный межсетевой экран на принимающей стороне и убедитесь, что оба устройства находятся в одной подсети.
- Завершите сеанс сочетанием Ctrl и C.
Так легко отличить проблему сети от проблемы приложения. Если текст проходит, канал и порт работают, а сбой в конкретной программе. Если не проходит, ищите преграду на пути: правила брандмауэра, изоляцию клиентов в Wi-Fi, неверный интерфейс.
Так же можно передать файл внутри домашней сети: на приёме nc -l 9000 > result.bin, на отправке nc адрес 9000 < file.bin. Передача идёт без шифрования и проверки, поэтому годится лишь для доверенной локальной сети и небольших файлов. Для остального лучше scp.
Отличия macOS, Linux и Windows
В macOS утилита nc входит в систему, использует BSD-синтаксис, и все перечисленные ключи работают. В Linux в пакете может быть netcat-openbsd или netcat-traditional; в Debian и Ubuntu команду nc обычно предоставляет вариант OpenBSD, но это зависит от выбранного пакета. Отличие важно при прослушивании: в OpenBSD-версии достаточно nc -l 9000, в традиционной нужен ключ -p.
В Windows ключей нет вообще, пока не установлен ncat. Он ведёт себя почти так же, но с добавлением собственных опций, например --ssl. Синтаксис ncat -zv с некоторыми сборками работает иначе, чем в nc, так что проверяйте справку. Штатная альтернатива — Test-NetConnection в PowerShell.
Ограничения проверки UDP
С UDP есть принципиальная сложность: протокол не устанавливает соединение, поэтому «успех» в проверке -zu означает лишь то, что не пришло сообщение об ошибке ICMP. Служба может молчать, и порт будет показан как открытый, хотя ответа нет. Надёжно проверить UDP можно, только отправив запрос, который понимает конкретная служба, например DNS-запрос на порт 53. Поэтому к результату nc -zu относитесь как к подсказке, а не как к доказательству.
Соблюдайте границы: проверять порты можно на своих устройствах и сервисах. Сканирование чужих сетей и серверов без разрешения может нарушать правила провайдера и закон. Даже простая проверка одного порта чужого узла должна оставаться редким и оправданным действием.
Порядок действий при неудаче
Если nc сообщает об отказе или таймауте, идите от простого к сложному. Проверьте написание адреса и порта. Убедитесь, что служба действительно запущена на целевой машине: на Linux это делает ss -tulpn, на Windows netstat -ano. Проверьте, на каком интерфейсе она слушает: если только на 127.0.0.1, снаружи порт недоступен. Затем брандмауэр на самом узле, потом правила роутера, наконец — блокировка на стороне провайдера.
Полезно выполнить проверку локально, с того же узла: nc -zv 127.0.0.1 порт. Если так работает, а с другого устройства нет, проблема в сети или в межсетевом экране, а не в службе. Если и локально порт закрыт, служба не запущена или слушает другой порт.