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 — Удаленный сервер.
Получение информации о 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).
Боримся с флудом с утилитой 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 соединение. Для лабораторной будет использоваться следующая топология сети:
Введем команду на открытие порта на машине 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 февраля.
Источник