Введение
Linux известен наличием большого количества продуманных и полезных инструментов командной строки в большинстве дистрибутивов. Зачастую системные администраторы могут выполнять многие свои задачи с помощью встроенных инструментов без установки дополнительного программного обеспечения. В этом руководстве мы рассмотрим использование утилиты netcat. Эта универсальная команда поможет вам отслеживать, тестировать и отправлять данные по сетевым соединениям. Netcat должен быть доступен практически во всех современных дистрибутивах Linux. Ubuntu поставляется с версией netcat для BSD, и именно её мы будем использовать в этом руководстве. Другие версии могут работать иначе или предлагать другие возможности.
Общая инструкция
По умолчанию netcat устанавливает TCP-соединение с удаленным хостом.
Самая простая команда:
netcat [options] host portЭта команда пытается установить TCP-соединение с указанным хостом через указанный порт. Это похоже на старую команду Linux telnet. Имейте в виду, что ваше соединение не полностью зашифровано.
Если вы хотите отправить UDP-пакет вместо запуска TCP-соединения, вы можете использовать опцию -u:
netcat -u host portВы можете указать диапазон портов, поставив дефис между первым и последним:
netcat host startport-endportОбычно это используется с некоторыми дополнительными флагами.
В большинстве систем netcat и nc можно использовать как взаимозаменяемые. Это псевдонимы одной и той же команды.
Команда для использования Netcat для сканирования портов
Одно из самых распространённых применений Netcat — сканер портов. Хотя Netcat, вероятно, не самый продвинутый инструмент для этой задачи (в большинстве случаев лучше использовать nmap), он может выполнять простое сканирование портов для лёгкого определения открытых портов. Мы делаем это, указывая диапазон портов для сканирования, как и выше, и используя опцию -z, чтобы выполнить сканирование вместо попытки установить соединение.
Например, мы можем просканировать все порты до 1000, выполнив следующую команду:
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:
netcat -z -n -v 198.51.100.0 1-1000Возвращаемые сообщения фактически отправляются в стандартный поток ошибок (подробнее см. в статье о перенаправлении ввода-вывода). Мы можем отправлять стандартные сообщения об ошибках в стандартный поток вывода, что упрощает фильтрацию результатов.
Мы перенаправляем стандартный поток ошибок в стандартный вывод, используя синтаксис bash 2>&1 . Затем фильтруем результаты с помощью grep :
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeededOutput
Connection to 198.51.100.0 22 port [tcp/*] succeeded!Здесь мы видим, что единственный открытый порт в диапазоне от 1 до 1000 на удаленном компьютере — это порт 22, традиционный порт SSH.
Как общаться через NetCat
Netcat не ограничивается отправкой TCP- и UDP-пакетов. Он также может прослушивать порт на предмет подключений и пакетов. Это даёт нам возможность объединить два экземпляра Netcat в клиент-серверное взаимодействие.
Разница между сервером и клиентом имеет значение только при первоначальной настройке. После установки соединения взаимодействие в обоих направлениях абсолютно одинаково.
На компьютере вы можете указать netcat прослушивать соединения на определённом порту. Это можно сделать, указав параметр -l и выбрав порт:
netcat -l 4444Это указывает Netcat прослушивать TCP-соединения на порту 4444. Как обычный пользователь (не root), вы не можете открывать порты ниже 1000 в целях безопасности.
На втором сервере мы можем подключиться к первой машине по выбранному нами порту. Делаем это так же, как и раньше:
netcat domain.com 4444Будет казаться, что ничего не произошло. Однако теперь вы можете отправлять сообщения по обе стороны соединения, и они будут видны обеим сторонам.
Введите сообщение и нажмите ENTER. Оно появится как на локальном, так и на удалённом экранах. Это также работает в обратном порядке.
Завершив отправку сообщения, нажмите сочетание клавиш CTRL-D, чтобы закрыть TCP-соединение.
Как отправлять файлы через Netcat
Используя предыдущий пример, мы можем сделать больше полезных вещей. Поскольку мы создаём обычное TCP-соединение, мы можем передавать по нему практически любые данные. Это не ограничивается сообщениями чата, которые вводит пользователь. Мы можем использовать эти знания, чтобы превратить Netcat в программу для передачи файлов.
Нам снова нужно выбрать конечную точку подключения для прослушивания соединений. Однако вместо того, чтобы выводить информацию на экран, как в предыдущем примере, мы сохраним всю информацию непосредственно в файл:
netcat -l 4444 > received_file> Эта команда перенаправляет весь вывод netcat в указанное имя файла.
На втором компьютере создайте простой текстовый файл, введя:
echo "Hello, this is a file" > original_fileТеперь мы можем использовать этот файл в качестве входных данных для соединения Netcat, которое мы создаём с прослушивающим компьютером. Файл будет передаваться по мере его интерактивного ввода:
netcat domain.com 4444 < original_fileМы видим на компьютере, ожидавшем соединения, что теперь у нас есть новый файл с именем receive_file с содержимым файла, который мы ввели на другом компьютере:
cat received_fileOutput
Hello, this is a fileКак видите, связывая объекты, мы можем легко использовать это соединение для передачи самых разных данных. Например, мы можем передать содержимое целого каталога, создав безымянный tar-архив, перенеся его на удалённую систему и распаковав в удалённом каталоге.
В конце загрузки мы ожидаем файл, который необходимо распаковать и открыть, введя:
netcat -l 4444 | tar xzvf -Дефис (-) означает, что tar работает со стандартным вводом, который передается по сети при установлении соединения из netcat.
Вместе с содержимым каталога, который мы хотим передать, мы можем упаковать его в tarball, а затем отправить на удаленный компьютер через netcat:
tar -czf - * | netcat domain.com 4444На этот раз тире в команде tar означает, что нужно упаковать содержимое текущего каталога (на что указывает *) в tar и zip, а затем записать результат в стандартный поток вывода. Затем он записывается непосредственно через TCP-соединение, принимается на другой стороне и распаковывается в текущий каталог удалённого компьютера. Это лишь один пример более сложной передачи данных с одного компьютера на другой. Другая распространённая идея — использовать команду dd для создания образа диска с одной стороны и передачи его на удалённый компьютер. Однако мы не будем вдаваться в подробности.
Как использовать Netcat в качестве простого веб-сервера
Мы настроили Netcat для прослушивания подключений для связи и передачи файлов. Этот же принцип можно использовать и в качестве очень простого веб-сервера. Это может быть полезно для тестирования создаваемых вами страниц.
Для начала давайте создадим простой HTML-файл на сервере:
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 как обычный пользователь.
Если вы хотите обработать эту страницу один раз, чтобы проверить, как она отображается, вы можете выполнить следующую команду:
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888Теперь в вашем браузере вы можете получить доступ к контенту, перейдя по ссылке:
http://server_IP:8888
Это отобразит страницу, после чего соединение Netcat будет закрыто. Если вы попытаетесь перезагрузить страницу, соединение будет потеряно:
Мы можем заставить netcat отображать страницу бесконечно, поместив последнюю команду в бесконечный цикл, например так:
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 стремится сделать сетевое взаимодействие между компьютерами прозрачным, упрощая процесс установления соединений.










