Socat linux ��������� �������

socat примеры использования утилиты

Запускать socat можно напрямую из консоли оставляя выполнение в фоне или же использовать скрипты автозапуска. Фактически происходит проброс сокета с хоста.

Для разового использования запуск в фоне вполне подходит.

Прежде всего пакет нужно установить

Для примера рассмотрим Desktop систему с веб-сервером apache2. Создана единственная страница, при обращении к localhost возникает сообщение «hi there»

[ ok ] Stopping apache2 (via systemctl): apache2.service.

Теперь нужно запустить socat

Перенаправление с 80 порта на 80 порт сервера 123.123.123.123

socat TCP-LISTEN:80,fork TCP:123.123.123.123:80 &

root 21904 0.0 0.2 8284 3912 ? S 13:30 0:00 sudo socat TCP-LISTEN:80,fork TCP:123.123.123.123:80

Вновь обращаемся к localhost

Сейчас видно стандартную заглушку веб-сервера Nginx, который используется на сервере 123.123.123.123

Socat используется для перенаправления трафика прозрачно для серверов на которых запускается. На Desktop системе в примере все другое ПО будет обращаться к порту 80 и работать в веб-сервером не имея представления о том, что он запущен на удаленном сервере.

Горизонтальное масштабирование — процесс распределения нагрузки на несколько машин путем выбора подходящего архитектурного решения. Для масштабирования часто используется socat.

Например, через него настраивается работа MySQL на машинах с приложением и веб-сервером.

Запускается socat через runit или supervisor. Это позволяет вновь стартовать процесс если он завершился — например, по причине перезагрузки.

Источник

linux-notes.org

Установка socat в Unix/Linux

socat — инструмент командной строки, который позволяет переадресовывать сокеты c хостовой машины, на клиентскую. Данная утилита устанавливает два потока двунаправленного байта и передает данные между ними.

Утилита socat используется для:

  • TCP порт forwarder-а.
  • Тестирование безопасности.
  • Shell интерфейс для UNIX-сокетов.
  • Реле IP6.
  • Для перенаправления TCP-ориентированных программ на последовательную линию.
  • Логически подключать последовательные линии на разных компьютерах.
  • Устанавливает относительно безопасную среду (su и chroot) для запуска bash скриптов клиента или сервера с сетевыми подключениями.

Установка socat в Debian/Ubuntu

Для удаления socat используется следующая команда:

Следующая команда используется для удаления пакета socat вместе со своими зависимостями:

Это позволит удалить socat и все его зависимые пакеты, которые больше не нужны в системе.

Полностью удалить socat со всеми конфигурационными файлами можно одним из следующих способов:

  • Следующая команда должна использоваться с осторожностью, поскольку она удаляет все файлы конфигурации и данные:
  • или вы также можете использовать следующую команду:

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

Установка socat в Redhat/Fedora/CentOS

Можно переходить к использованию.

Установка socat в MacOS X

Для начала, у становим homebrew, я описывал процесс в статье — Установка homebrew на Mac OS X и после чего, выполняем поиск пакета:

Ну, теперь можно и поставить ПО следующим образом:

Можно переходить к использованию.

Использование socat в Unix/Linux

Я запускаю socat следующим образом:

Получаем ИП-шку локальной машины:

Разрешить локальной машине «разговаривать» с XQuartz:

Все это было нужно для запуска графических утилит внутри docker контейнера:

Т.е socat — пробрасывает сокет с хоста на клиенсткую машину.

Перенаправление TCP портов

Чтобы вуполнить перенаправление 80-го порта на 192.168.13.225, используем:

И так, все TCP4 соединения которые будет находится на 80-му порту, будут перенаправлены на 192.168.13.225. Проверим что вышло:

Подключение к удаленному SSH серверу

Вы можете подключиться к удаленному ssh серверу (например — Your_remote_server) с использованием pty для связи между socat и ssh, что делает его ssh управляющим tty (ctty); и делает его pty владельцем новой группы процессов (setsid), поэтому ssh принимает пароль из утилиты socat:

  • Your_password — пароль от пользователя «your_remote_username».
  • Your_remote_username — Удаленный пользователь.
  • Your_remote_server — Удаленный сервер.
Читайте также:  Windows imaging free download

Получение информации о Haproxy

Давайте получим информацию о запущенном процессе HAProxy ( pid, SLA и тд и тп):

Перенаправление TCP портов (каждая сторона привязана к другому локальному IP-адресу) (bind)

В этом примере обрабатывается почти произвольное количество параллельных/последовательных подключений путем fork’ing-а нового процесса после каждого приема соединений. Он обеспечивает небольшую безопасность, не дожидаясь пользователя после разветвления; он разрешает только соединения из частной сети (10.0.0.0/8); из-за reuseaddr, он обеспечивает немедленный перезапуск после завершения мастер-процесса, даже если некоторые дочерние сокеты не полностью закрыты. С помощью -lmlocal2, socat регистрируется в stderr, пока не будет успешно достигнуто принятие цикла. Дальнейшее ведение (лог) направляется в syslog с объектом local2:

Копируем данные между STDIN и STDOUT

Т.е socat копирует все что вы написали (STDIN) и выводит на вывод (STDOUT).

Слушаем TCP сокет, запускаем shell, шлем месагу, «засыпаем» на некоторое время и дисконектимся

На сервере, выполняем:

Т.к это один сервер (у меня), чтобы проверить что вышло, я запускаю телнет на клиенсткой машине:

Так же, можно тоже самое сделать с socat утилитой, например:

Запускаем удаленные команды через socat

На сервере, запускаем:

Чтобы запустить данную команду на заднем плане (в бэкграунде), юзаем:

Т.е данная команда, симулирует команду (netcat).

Разрешить несколько подключений c клиентов к удаленным оболочкам shell:

Использование де-мультиплексных входных данных от нескольких TCP/IP клиентов к одному выходному потоку (STDOUT)

Запускаем команду на сервере:

После выполнения команды на клиенте, вы на стороне сервера должны получить следующий вывод:

Создание своего файл сервера (файловая шара) с использованием socat

На сервере, выполняем:

Этим, я разшарил файл на серверной стороне.

На стороне клиента, выполняем:

Это позволит скачать и сохранить файл.

Можно слать файлы прям с сервера на клиент:

Или, можно выполнить что-то типа:

Подключение к процессу (здесь удаленный shell) через socat

Обычно socat отключается, когда один из подключенных адресов или клиентов закрывает соединение. Это имеет недостаток, что при следующем подключении вы будете подключены к новому запущенному процессу при использовании «system:» или «exec :». Но есть обходной путь — использовать пайп.

На стороне сервера, создаем pipe:

На стороне клиента, выполняем:

Получить время с указанного сервера

Выполнение команд на web-сервере с использованием socat

Вы можете редактировать текущую строку в стиле bash (READLINE) и использовать файл истории .http_history; socat выводит сообщения о прогрессе (-d -d). Порт указан по имени службы (www), и используются правильные символы завершения сети (crnl) вместо NL.

Простой TCP порт форвардер

Устанавливает простую переадресацию TCP портов. С TCP4-LISTEN он прослушивает локальный «www» порт до тех пор, пока не произойдет соединение, а затем подключится к удаленному хосту (TCP4) и начнет передачу данных. Он не будет принимать второе соединение.

Однонаправленная передача данных с socat

Это пример однонаправленной передачи данных (-u). Socat передает данные из файла /tmp/readdata (неявный адрес GOPEN), начиная с его конца (seek-end = 0 позволяет socat начинать чтение c конца файла, использовать seek = 0) в режиме «tail -f» (ignoreeof). «Файл» также может быть прослушивающим сокером домена UNIX (тогда не используйте опцию поиска).

Простой сборщик сообщений с socat

Реализует простой сборщик сообщений на основе сети. Для каждого клиента, подключенного к порту 3334, создается новый дочерний процесс (опция fork). Все данные, отправленные клиентами, добавляются к файлу /tmp/in.log. Если файл не существует, socat создает его. Опция reuseaddr позволяет немедленно перезапустить серверный процесс.

Подключение к FTP с socat

Создание больших файлов с socat

Данная команда, создает разреженный файл (My_file_name_here) размером 500ГБ (для этого служит seek опция); Так же, требуется тип файловой системы, который поддерживает это действие (ext2, ext3, reiserfs, jfs; not minix, vfat). Операция записи (1 байта) может занять много времени (reiserfs: несколько минут, ext2: «нет»), и полученный файл займет указанное место на диске, но только с его inod-ами (reiserfs: 2MB; ext2: 16KB).

Читайте также:  Avr gcc mac os

Боримся с флудом с утилитой socat

Данная команда подключается к серверу (на 80-й порт) и предотвращает появлению flood-а.

Зеркальная файловая система

На сервере выполняем:

  • your_sink_host — хост для синка.

На клиенте, выполняем:

Создание pg_dump-а и отправка его на сервер без записи на диск с socat

На сервере выполняем:

На клиенте, выполняем:

Отправка UDP пакетов на указанные порты

А на этом, у меня все. Статья «Установка socat в Unix/Linux» завершена.

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Источник

Сокеты в ОС Linux

В данной статье будет рассмотрено понятие сокета в операционной системе Linux: основные структуры данных, как они работают и можно ли управлять состоянием сокета с помощью приложения. В качестве практики будут рассмотрены инструменты netcat и socat.

Что такое сокет?

Сокет — это абстракция сетевого взаимодействия в операционной системе Linux. Каждому сокету соответствует пара IP-адрес + номер порта. Это стандартное определение, к которому привыкли все, спасибо вики. Хотя нет, вот здесь лучше описано. Поскольку сокет является только лишь абстракцией, то связка IP-адрес + номер порта — это уже имплементация в ОС. Верное название этой имплементации — «Интернет сокет». Абстракция используется для того, чтобы операционная система могла работать с любым типом канала передачи данных. Именно поэтому в ОС Linux Интернет сокет — это дескриптор, с которым система работает как с файлом. Типов сокетов, конечно же, намного больше. В ядре ОС Linux сокеты представлены тремя основными структурами:

struct socket — представление сокета BSD, того вида сокета, который стал основой для современных «Интернет сокетов»;

struct sock — собственная оболочка, которая в Linux называется «INET socket»;

struct sk_buff — «хранилище» данных, которые передает или получает сокет;

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

socket — создание сокета;

bind — действие используется на стороне сервера. В стандартных терминах — это открытие порта на прослушивание, используя указанный интерфейс;

listen — используется для перевода сокета в прослушивающее состояние. Применяется к серверному сокету;

connect — используется для инициализации соединения;

accept — используется сервером, создает новое соединение для клиента;

send/recv — используется для работы с отправкой/приемом данных;

close — разрыв соединения, уничтожение сокета.

Если о структурах, которые описаны выше, заботится ядро операционной системы, то в случае команд по управлению соединением ответственность берет на себя приложение, которое хочет пересылать данные по сети. Попробуем использовать знания о сокетах для работы с приложениями netcat и socat.

netcat

Оригинальная утилита появилась 25 лет назад, больше не поддерживается. На cегодняшний день существуют порты, которые поддерживаются различными дистрибутивами: Debian, Ubuntu, FreeBSD, MacOS. В операционной системе утилиту можно вызвать с помощью команды nc, nc.traditional или ncat в зависимости от ОС. Утилита позволяет «из коробки» работать с сокетами, которые используют в качестве транспорта TCP и UDP протоколы. Примеры сценариев использования, которые, по мнению автора, наиболее интересны:

перенаправление входящих/исходящих запросов;

трансляция данных на экран в шестнадцатеричном формате.

Опробуем операции в действии. Задача будет состоять в том, что необходимо отправить TCP данные через netcat в UDP соединение. Для лабораторной будет использоваться следующая топология сети:

Читайте также:  Ноутбук с установленной windows или без

Введем команду на открытие порта на машине Destination: nc -ulvvp 7878

Настроим машину Repeater. Так как передача из одного интерфейса этой машины будет происходить по протоколу TCP, а на другой интерфейс будет осуществляться передача по протоколу UDP, то для таких действий необходимо сделать соединитель, который сможет накапливать данные и пересылать их между открытыми портами. На такую роль отлично подходит FIFO файл. Поэтому команда для запуска будет выглядеть так: sudo mkfifo /tmp/repeater #создать FIFO файл
sudo nc -l -p 4545 > /tmp/repeater | nc -u 10.0.3.5 7878 IP адрес 10.0.3.5 — адрес машины Destination. Символы «|» и «> nc 10.0.2.4 4545

В итоге получаем возможность читать данные от машины Source:

В машине Destination:

Пример с трансляцией данных в шестнадцатеричном формате можно провести так же, но заменить команду на Destination или добавить еще один пайп на Repeater:

nc -l -p 4545 -o file

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

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

socat

Инструмент, который до сих пор поддерживается и имеет весьма обширный функционал по склейке каналов для взаимодействия. Разработчиками инструмент именуется как netcat++. Ниже приведем небольшой список того что можно перенаправить через socat:

STDIO -> TCP Socket;

FILE -> TCP Socket;

TCP Socket -> Custom Application;

UDP Socket -> Custom Application;

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

Помимо редиректов socat также можно использовать как универсальный сервер для расшаривания ресурсов, через него можно как через chroot ограничивать привилегии и доступ к директориям системы.

Чтобы комфортно пользоваться этим инструментом, нужно запомнить шаблон командной строки, который ожидает socat:

socat additionalOptions addr1 addr2

additionalOptions — опции, которые могут добавлять возможности логирования информации, управления направлением передачи данных;

addr1 — источник данных или приемник (влияет использование флага U или u), это может быть сокет, файл, пайп или виртуальный терминал;

addr2 — источник данных или приемник (влияет использование флага U или u), это может быть сокет, файл, пайп или виртуальный терминал;

Попробуем провести трансляцию данных из сокета в сокет. Будем использовать для этого 1 машину. Перед началом эксперимента стоит отметить, что особенностью socat является то, что для его корректной работы нужно обязательно писать 2 адреса. Причем адрес не обязательно должен быть адресом, это может быть и приложение, и стандартный вывод на экран.

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

socat TCP-LISTEN:4545, STDOUT

Для коннекта можно использовать netcat:

nc localhost 4545

При таком использовании, socat дает возможность пересылать сообщения в обе стороны, но если добавить флаг «-u», то общение будет только от клиента к серверу. Все серверные сообшения пересылаться не будут:

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

socat TCP-LISTEN:4545,reuseaddr,keepalive,fork STDOUT

Дополнительные параметры распространяются на те действия, которые socat может выполнять по отношению к адресу. Полный список опций можно найти здесь в разделе «SOCKET option group».

Таким образом socat дает практически полный контроль над состоянием сокетов и расшариваемых ресурсов.

Статья написана в преддверии старта курса Network engineer. Basic. Всех, кто желает подробнее узнать о курсе и карьерных перспективах, приглашаем записаться на день открытых дверей, который пройдет уже 4 февраля.

Источник

Оцените статью