
Установка 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
Настройка 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» завершена.