Поиск по сайту:

Как использовать Netcat для установления и тестирования соединений TCP и UDP


Введение

Linux известен наличием большого количества готовых полезных утилит командной строки, доступных в большинстве дистрибутивов. Часто системные администраторы могут выполнять большую часть своей работы с помощью встроенных инструментов без необходимости установки дополнительного программного обеспечения.

В этом руководстве мы обсудим, как использовать утилиту netcat. Эта универсальная команда может помочь вам в мониторинге, тестировании и отправке данных по сетевым соединениям.

Netcat должен быть доступен практически в любом современном дистрибутиве Linux. Ubuntu поставляется с вариантом netcat для BSD, и именно его мы будем использовать в этом руководстве. Другие версии могут работать по-другому или предоставлять другие возможности.

Общий синтаксис

По умолчанию netcat инициирует TCP-соединение с удаленным хостом.

Самый простой синтаксис:

  1. netcat [options] host port

Это попытается инициировать TCP-соединение с определенным хостом на указанном номере порта. Эта функция аналогична старой команде Linux telnet. Имейте в виду, что ваше соединение полностью незашифровано.

Если вы хотите отправить UDP-пакет вместо установления TCP-соединения, вы можете использовать параметр -u:

  1. netcat -u host port

Вы можете указать диапазон портов, поставив тире между первым и последним:

  1. netcat host startport-endport

Обычно используется с некоторыми дополнительными флагами.

В большинстве систем мы можем использовать как netcat, так и nc взаимозаменяемо. Это псевдонимы одной и той же команды.

Как использовать Netcat для сканирования портов

Одним из наиболее распространенных применений netcat является сканер портов.

Хотя netcat, вероятно, не самый сложный инструмент для этой работы (в большинстве случаев nmap является лучшим выбором), он может выполнять простое сканирование портов, чтобы легко идентифицировать открытые порты.

Мы делаем это, указав диапазон портов для сканирования, как мы сделали выше, вместе с параметром -z для выполнения сканирования вместо попытки инициировать соединение.

Например, мы можем просканировать все порты до 1000, выполнив эту команду:

  1. netcat -z -v domain.com 1-1000

Наряду с параметром -z мы также указали параметр -v, чтобы указать netcat предоставить более подробную информацию.

Вывод будет выглядеть следующим образом:

Output
nc: connect to domain.com port 1 (tcp) failed: Connection refused nc: connect to domain.com port 2 (tcp) failed: Connection refused nc: connect to domain.com port 3 (tcp) failed: Connection refused nc: connect to domain.com port 4 (tcp) failed: Connection refused nc: connect to domain.com port 5 (tcp) failed: Connection refused nc: connect to domain.com port 6 (tcp) failed: Connection refused nc: connect to domain.com port 7 (tcp) failed: Connection refused . . . Connection to domain.com 22 port [tcp/ssh] succeeded! . . .

Как видите, это предоставляет много информации и сообщает вам для каждого порта, было ли сканирование успешным или нет.

Если вы на самом деле используете доменное имя, вам придется использовать эту форму.

Однако ваше сканирование будет проходить намного быстрее, если вы знаете IP-адрес, который вам нужен. Затем вы можете использовать флаг -n, чтобы указать, что вам не нужно разрешать IP-адрес с помощью DNS:

  1. netcat -z -n -v 198.51.100.0 1-1000

Возвращаемые сообщения фактически отправляются в стандартную ошибку (дополнительную информацию см. в нашей статье о перенаправлении ввода-вывода). Мы можем отправлять стандартные сообщения об ошибках на стандартный вывод, что позволит нам легче фильтровать результаты.

Мы перенаправим стандартную ошибку на стандартный вывод, используя синтаксис bash 2>&1. Затем мы отфильтруем результаты с помощью grep:

  1. netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded
Output
Connection to 198.51.100.0 22 port [tcp/*] succeeded!

Здесь мы видим, что единственный открытый порт в диапазоне 1–1000 на удаленном компьютере — это порт 22, традиционный порт SSH.

Как общаться через Netcat

Netcat не ограничивается отправкой пакетов TCP и UDP. Он также может прослушивать порт для соединений и пакетов. Это дает нам возможность соединить два экземпляра netcat в отношениях клиент-сервер.

Какой компьютер является сервером, а какой клиентом, это важное различие только во время первоначальной настройки. После того, как соединение установлено, связь в обоих направлениях абсолютно одинакова.

На одной машине вы можете указать netcat прослушивать определенный порт для соединений. Мы можем сделать это, указав параметр -l и выбрав порт:

  1. netcat -l 4444

Это укажет netcat прослушивать TCP-соединения на порту 4444. Как обычный пользователь (без полномочий root) вы не сможете открывать порты ниже 1000 в качестве меры безопасности.

На втором сервере мы можем подключиться к первой машине по выбранному нами номеру порта. Мы делаем это так же, как мы устанавливали соединения ранее:

  1. netcat domain.com 4444

Это будет выглядеть так, как будто ничего не произошло. Однако теперь вы можете отправлять сообщения на любой стороне соединения, и они будут видны на любом конце.

Введите сообщение и нажмите ENTER. Он появится как на локальном, так и на удаленном экране. Это работает и в обратном направлении.

Когда вы закончите передачу сообщений, вы можете нажать CTRL-D, чтобы закрыть TCP-соединение.

Как отправлять файлы через Netcat

Опираясь на предыдущий пример, мы можем выполнять более полезные задачи.

Поскольку мы устанавливаем обычное TCP-соединение, мы можем передавать практически любую информацию по этому соединению. Он не ограничивается сообщениями чата, которые вводит пользователь. Мы можем использовать эти знания, чтобы превратить netcat в программу для передачи файлов.

Еще раз, нам нужно выбрать один конец соединения для прослушивания соединений. Однако вместо того, чтобы выводить информацию на экран, как мы сделали в последнем примере, мы поместим всю информацию прямо в файл:

  1. netcat -l 4444 > received_file

> в этой команде перенаправляет весь вывод netcat в файл с указанным именем.

На втором компьютере создайте простой текстовый файл, набрав:

  1. echo "Hello, this is a file" > original_file

Теперь мы можем использовать этот файл в качестве входных данных для соединения netcat, которое мы установим с прослушивающим компьютером. Файл будет передан так же, как если бы мы набрали его интерактивно:

  1. netcat domain.com 4444 < original_file

На компьютере, ожидавшем подключения, мы видим, что теперь у нас есть новый файл с именем received_file с содержимым файла, который мы набрали на другом компьютере:

  1. cat received_file
Output
Hello, this is a file

Как видите, с помощью конвейера мы можем легко воспользоваться этим соединением для передачи всех видов вещей.

Например, мы можем передать содержимое всего каталога, создав на лету безымянный tar-архив, передав его в удаленную систему и распаковав в удаленный каталог.

На принимающей стороне мы можем ожидать, что придет файл, который нужно будет разархивировать и извлечь, набрав:

  1. netcat -l 4444 | tar xzvf -

Дефис в конце (-) означает, что tar будет работать со стандартным вводом, который передается от netcat по сети при установлении соединения.

На стороне содержимого каталога, которое мы хотим передать, мы можем запаковать его в архив и затем отправить на удаленный компьютер через netcat:

  1. tar -czf - * | netcat domain.com 4444

На этот раз тире в команде tar означает архивирование содержимого текущего каталога (как указано подстановочным знаком *) и запись результата в стандартный вывод.

Затем это записывается непосредственно в TCP-соединение, которое затем принимается на другом конце и распаковывается в текущий каталог удаленного компьютера.

Это всего лишь один пример передачи более сложных данных с одного компьютера на другой. Другая распространенная идея — использовать команду dd для создания образа диска на одной стороне и передачи его на удаленный компьютер. Однако мы не будем освещать это здесь.

Как использовать Netcat в качестве простого веб-сервера

Мы настроили netcat для прослушивания подключений для связи и передачи файлов. Мы можем использовать ту же концепцию, чтобы использовать netcat в качестве очень простого веб-сервера. Это может быть полезно для тестирования создаваемых вами страниц.

Во-первых, давайте создадим простой HTML-файл на одном сервере:

  1. nano index.html

Вот простой HTML-код, который вы можете использовать в своем файле:

<html>
        <head>
                <title>Test Page</title>
        </head>
        <body>
                <h1>Level 1 header</h1>
                <h2>Subheading</h2>
                <p>Normal text here</p>
        </body>
</html>

Сохраните и закройте файл.

Без привилегий root вы не можете обслуживать этот файл через веб-порт по умолчанию, порт 80. Мы можем выбрать порт 8888 как обычный пользователь.

Если вы просто хотите обработать эту страницу один раз, чтобы проверить, как она отображается, вы можете запустить следующую команду:

  1. printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888

Теперь в вашем браузере вы можете получить доступ к содержимому, посетив:

http://server_IP:8888

Это будет обслуживать страницу, а затем соединение netcat будет закрыто. Если вы попытаетесь обновить страницу, она исчезнет:

Мы можем сделать так, чтобы netcat обслуживал страницу бесконечно, заключив последнюю команду в бесконечный цикл, например так:

  1. while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done

Это позволит ему продолжать получать соединения после закрытия первого соединения.

Мы можем остановить цикл, набрав CTRL-C на сервере.

Это позволяет вам увидеть, как страница отображается в браузере, но не предоставляет гораздо больше функциональных возможностей. Вы никогда не должны использовать это для обслуживания реальных веб-сайтов. Нет безопасности, а простые вещи вроде ссылок даже не работают корректно.

Заключение

Теперь у вас должно быть довольно хорошее представление о том, для чего можно использовать netcat. Это универсальный инструмент, который может быть полезен для диагностики проблем и проверки правильности работы функций базового уровня с соединениями TCP/UDP.

Используя netcat, вы можете очень легко общаться между разными компьютерами для быстрого взаимодействия. Netcat пытается сделать сетевые взаимодействия между компьютерами прозрачными, упрощая формирование соединений.