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

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

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

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

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

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

Выполняем установку:

# apt-get install socat -y

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

# apt-get remove socat

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

# apt-get remove --auto-remove socat

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

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

  • Следующая команда должна использоваться с осторожностью, поскольку она удаляет все файлы конфигурации и данные:
    # apt-get purge socat
  • или вы также можете использовать следующую команду:
    # apt-get purge --auto-remove socat

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

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

Выполняем установку:

# yum install socat -y

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

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

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

$ brew search socat

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

$ brew install socat

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

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

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

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

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

$ ip=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}') && echo "My IP is: $ip"

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

$ xhost + ${ip}

Запускаем:

$ docker run --rm -it -e DISPLAY=${ip}:0 -v /tmp/.X11-unix:/tmp/.X11-unix --name firefox jess/firefox

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

Запуск GUI-приложения в Docker

Утилита xhost в Unix/Linux

Настройка X11 forwarding используя ssh в Unix/Linux

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

Еще примеры…

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

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

# socat TCP-LISTEN:80,fork TCP:192.168.13.225:80 &

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

# netstat -natpl | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      75881/socat

И процесс:

# ps -aux | grep socat | grep -Ev "grep"
root      75881  0.0  0.1  51836  2488 pts/1    S    20:51   0:00 socat TCP-LISTEN:80,fork TCP:192.168.13.225:80

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

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

$ (sleep 5; echo Your_password; sleep 5; echo date; sleep 1) |socat - EXEC:'ssh -o StrictHostKeyChecking=no Your_remote_username@Your_remote_server',pty,setsid,ctty

Где:

  • Your_password — пароль от пользователя «your_remote_username».
  • Your_remote_username — Удаленный пользователь.
  • Your_remote_server — Удаленный сервер.

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

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

# echo "show info" | socat unix-connect:/var/tmp/haproxy stdio

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

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

# socat -d -d -lmlocal2 \
TCP4-LISTEN:80,bind=myaddr1,su=nobody,fork,range=10.0.0.0/8,reuseaddr \
TCP4:192.168.13.225:80,bind=myaddr2

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

Вот пример:

# socat -v STDIN STDOUT
test
> 2018/01/04 21:36:11.357493  length=5 from=0 to=4
test
test
It's working......
< 2018/01/04 21:36:31.501174  length=19 from=0 to=18
It's working......
It's working......

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

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

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

#socat tcp-l:7777,reuseaddr,fork system:'echo hello; sleep 5; echo goodbye',nofork

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

# telnet localhost 7777

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
goodbye

Connection closed by foreign host.

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

# socat tcp:localhost:7777 -
hello
goodbye

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

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

# socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash

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

# socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash &

Проверяем:

# socat - TCP:localhost:1234

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

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

# socat TCP-LISTEN:1234,reuseaddr,fork EXEC:/bin/bash

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

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

# socat TCP-LISTEN:1234,reuseaddr -

На клиенте (1-м):

# echo "client A" | socat - TCP:localhost:1234

На клиенте (2-м):

# echo "client B" | socat - TCP:localhost:1234

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

client A

client B

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

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

# socat tcp-l:1236,reuseaddr,fork file:my_file.txt

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

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

# socat tcp:localhost:1236 file:copied_my_file.txt,create

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

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

# socat TCP:your_hostname_machine:port_machine filename

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

# socat TCP-LISTEN:80,reuseaddr,fork,crlf SYSTEM:"echo HTTP/1.0 200; echo Content-Type\: text/plain; echo Connection\: close; echo" &
# socat tcp:localhost:80 file:copied_my_file.txt,create

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

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

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

# rm -f myfifo; mkfifo myfifo

Потом, выполняем:

# cat myfifo | /bin/sh -i 2>&1 | socat -v tcp-listen:1234,fork,reuseaddr - > myfifo

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

# socat - tcp:localhost:1234

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

Например:

# socat TCP:time.nist.gov:13 -

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

Например:

# socat -d -d READLINE,history=$HOME/.http_history \
TCP4:Your_domain_name:www,crnl

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

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

Пример:

# socat TCP4-LISTEN:www TCP4:www.your_domain_name:www

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

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

Выполняем:

# socat -u /tmp/readdata,seek-end=0,ignoreeof -

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

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

Выполняем:

# socat -u TCP4-LISTEN:3334,reuseaddr,fork \
OPEN:/tmp/in.log,creat,append

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

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

Команда:

# socat READLINE,noecho='[Pp]assword:' EXEC:'ftp your_ftp_server',pty,setsid,ctty

Идем дальше…

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

Выполним:

# echo |socat -u - file:/tmp/My_file_name_here,create,largefile,seek=500000000000

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

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

Выполняем команду:

# socat - tcp:www.your_domain_here:80,readbytes=1000

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

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

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

# dd if=/dev/sda1 | socat - openssl:your_sink_host:9999

Где:

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

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

# socat openssl-listen:9999 | dd of=/dev/sda66

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

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

# pg_dump -C dbname | bzip2 | socat - openssl:sink:8443

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

# socat openssl-listen:8443 > dbname.sql

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

Выполянем:

# for PORT in {1001..65535}; do echo "READ YOUR CONSTITUTION, NOT OUR EMAIL." | socat - UDP4-DATAGRAM:Your_domain_here:$PORT; sleep .1; done

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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