Команда Netcat (nc) — это утилита командной строки, предназначенная для чтения и записи данных, переданных между двумя компьютерами в сети. Связь осуществляется с использованием протоколов TCP или UDP, используется как IPv4, так и IPv6, с помощью команды можно отправлять пакеты, сканировать и прослушивать произвольные порты. Команда отличается в зависимости от операционной системы (netcat, nc, ncat и другие).
Netcat будет полезен сетевым и системным администраторам благодаря широким возможностям устранения неполадок подключения и удобным скриптам.
Рассказываем, как использовать команду nc (в версии netcat-openbsd) и приводим примеры её применения.
Предварительные условия
Nc корректно работает при наличии следующих условий:
- Две машины в одной сети; у нас — две виртуальные машины с Ubuntu 18.04.
- Доступ к терминалу на обоих устройствах.
- IP-адрес каждого устройства.
- Доступ к браузеру или команде curl.
Синтаксис команды nc
Основной синтаксис команды nc:
nc <options> <host> <port>
В Ubuntu применяют два варианта команды — nc и netcat; в CentOS, Debian и RHEL используйте ncat.
Команда включает следующие элементы:
- <options> — дополнительные параметры,
- <host> — IP-адрес или символическое имя хоста,
- <port> — номер порта или имя службы.
Команда запускает TCP-соединение на указанном хосте и порту даже без дополнительных параметров.
Режимы работы
Netcat имеет два режима работы:
- Подключение. В этом режиме Netcat работает как клиент, для работы утилиты требуются <host> и <port>.
- Прослушивание. В режиме прослушивания Netcat работает как сервер. Если <host> не задан, Netcat прослушивает все доступные адреса для указанного порта.
Опции команды nc
В таблице ниже приведены некоторые параметры команды nc:
-4 | Использовать только IPv4; опцию можно не указывать, так как IPv4 применяется по умолчанию. |
-6 | Только IPv6. |
-U--unixsock | Использовать доменные сокеты Unix. |
-u--udp | Использовать UDP-соединение. |
-g <hop1, hop2,...> | В режиме подключения: установить переходы для свободной маршрутизации источника в IPv4. hop1, hop2 и т. д. — это IP-адреса или имена хостов. |
-p <port>--source-port <port> | В режиме подключения: назначить исходный порт Netcat как <port>. |
-s <host>--source <host> | В режиме подключения: привязать хост Netcat к <host>. |
-l--listen | Переход в режим прослушивания. |
-k--keep-open | В режиме прослушивания: держать соединение открытым для нескольких одновременных подключений. |
-v--verbose | Выводит информацию о подключении, используйте несколько раз для увеличения детализации. |
-z | Сообщает о состоянии соединения без его установки. |
Это далеко не все доступные опции; полный список находится на странице руководства к утилите. Для вызова мануала используйте команду man:
man netcat
Примеры использования команды nc
В примерах мы используем две виртуальные машины с уникальными IP-адресами. Первая имеет IP 10.0.2.4, и вторая — IP 10.0.2.5. Обозначим их как ВМ1 и ВМ2.
Клиент-серверное соединение
Создадим простое клиент-серверное соединение между двумя устройствами, одно из которых действует как сервер (слушает), а другое действует как клиент (подключается).
- На ВМ1 выполните nc-команду в режиме прослушивания и укажите порт:
nc -lv 1234

Опция -l активирует режим прослушивания, делая сервером ВМ1. А -v инициирует вывод состояния.
- На ВМ2 выполните nc-команду с IP-адресом и портом сервера:
nc -v 10.0.2.4 1234

Благодаря -v мы видим, что соединение успешно установлено. Серверное устройство подтверждает соединение и выводит IP-адрес клиента.

- Отправьте сообщение с любого устройства, и то же самое сообщение появится на другом устройстве. Клиент и сервер ведут себя одинаково после установления соединения.
Чтобы завершить соединение, нажмите CTRL+C на любом компьютере.
Выбирайте для своих веб-проектов надёжного провайдера. Например, аренда VPS от AdminVPS — это:
- бесплатное администрирование,
- NVMe-диски,
- быстрая техподдержка,
- защита от DDoS-атак,
- доступная цена.
Пинг-тест определённого порта на веб-сайте
Утилиту Netcat можно использовать как альтернативу команде ping для проверки доступности определённого порта на сайте. Например:
nc -zv adminvps.ru 443
- -v показывает сообщение о результате проверки;
- -z гарантирует, что подключение не будет сохраняться — будет проведена только проверка.
Недостатком является отсутствие конкретной информации, поэтому для пингования лучше выбирать другие методы.
Сканирование портов
Команда nc для сканирования открытых портов.
- Для прослушивания порта 1234 введите на устройстве-сервере:
nc -lkv 1234

-k означает, что соединение останется открытым после разрыва.
- Выполните на устройстве-клиенте, чтобы проверить, открыт ли порт 1234:
nc -zv 10.0.2.4 1234

Если порт открыт, отобразится сообщение об успешном подключении.
- Вместо номера одного порта можно указать диапазон:
nc -zv 10.0.2.4 1230-1235
Вывод покажет данные по каждому порту:

- При сканировании диапазона отфильтруйте результаты, чтобы увидеть открытые порты:
nc -zv 10.0.2.4 1230-1235 2>&1 | grep 'succeeded'

Передача файла
Утилита Netcat позволяет передавать файлы через установленные соединения.
- На ВМ1 мы создали пустой тестовый файл:
touch file.txt
Затем активировали режим прослушки и указали, что отправляем созданный файл:
nc -lv 1234 < file.txt

- На ВМ2 подключились к серверу и указали, что получаем файл:
nc -zv 10.0.2.4 1234 > file.txt
С помощью команды ls подтвердили, что передача файла завершена.

Передача каталога
Чтобы передать несколько файлов или каталогов, используйте команду tar и передайте её Netcat.
- Перейдите в каталог, который нужно отправить, с помощью команды cd (в примере папка files, содержащая 5 файлов):
cd files
- На принимающем устройстве создайте целевой каталог и войдите в него:
mkdir files_destination && cd files_destination
Создайте соединение, прослушивающее порт 1234, и передайте команду tar:
nc -lv 1234 | tar xfv -

Теперь прослушивающее соединение ожидает файл, который извлечёт tar.
- Отправьте каталог на отдающей машине:
tar -cf - . | nc -v 10.0.2.5 1234

- Файлы приняты и передача завершается:

Создание веб-сервера с помощью nc
- Запустите прослушку порта 1234 на сервере:
nc -lv 10.0.2.4 1234

Если не указать адрес, веб-сервер будет запущен на локальном хосте.
- На ВМ2 (клиент) подключитесь по адресу и порту в браузере. Либо введите в терминале:
curl 10.0.2.4:1234
- На веб-сервере отобразится запрос, отправленный curl или браузером с информацией о нём (типом, хостом и пользовательским агентом):

Чтобы отправить ответ клиенту, вставьте следующий код:
HTTP/1.1 200 Everything OK
Server: netcat
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<title>
Netcat
</title>
</head>
<body>
<h1>A webpage served with nc</h1>
</body>
</html>

- Обновление информации на экране клиента произойдёт немедленно. При подключении через терминал:

При доступе через браузер:

Веб-сервер успешно запущен. Выключите его с помощью сочетания клавиш CTRL+C.
Читайте в блоге:
- Как сменить пользователя в Linux: подробная инструкция
- Что такое зависимости в Linux: популярные пакетные менеджеры
- Что такое иноды (inode) в Linux: простое и подробное руководство