TGViewer
ServerAdmin.ru ServerAdmin.ru @srv_admin · 32.6K subscribers
Post #2904 9K
​​В копилку полезных админских утилит Unix с примерами — socat. В общем случае это утилита для организации двунаправленных потоков передачи данных. При этом поддерживается большое количество типов потоков: файлы, пайпы, сокеты (unix, сетевые), различные устройства, в том числе консольного ввода. Это делает утилиту socat применимой в очень широком диапазоне ситуаций.

Самый простой пример использования socat аналогично telnet. Передаём данные с консоли ( - ) на какой-то сервис (smtp.yandex.ru:25). Например, почтовый сервер:
# socat - TCP4:smtp.yandex.ru:25
Попробуем пообщаться:
helo serveradmin.ru
mail from:<root@serveradmin.ru>
Получаем ошибку:
503 5.5.4 Error: send AUTH command first.
Всё четко. Без аутентификации отправка невозможна. Примерно таким образом сервисы или вы лично можете убедиться в том, что ваш почтовый сервер не станет общедоступным релеем для рассылки спама.

А вот пример использования socat для перенаправления локальных запросов к порту 8080 на удалённый веб сервер:
# socat TCP4-LISTEN:8080 TCP4:10.20.1.25:80
Теперь можно тут же локально обратиться на удалённый веб сервер:
# curl localhost:8080 -L -H "Host: serveradmin.ru"

Для того, чтобы после единичного подключения поток не прерывался, надо добавить немного опций:
# socat TCP4-LISTEN:8080,fork,reuseaddr TCP4:10.20.1.25:80

Так как поддерживаются различные типы потоков, то по аналогии можно в качестве приёмника или источника данных указать unix сокет. Например, вот так:
# socat TCP-LISTEN:3307,reuseaddr,fork UNIX-CONNECT:/run/mysqld/mysqld.sock
Это может пригодится, если вы, к примеру, запустили mysql сервер с доступом к нему только через unix сокет, но при этом хотите разово, а может и не разово, подключиться к нему по сети. Но при этом не можете изменить конфигурацию сервера и перезапустить его. Теперь можно проверить соединение через тот же socat или telnet:
# telnet 172.23.92.42 3307

Причём эту идею можно развить дальше. Берём какой-то тестовый веб сервер, с которого мы хотим подключаться к удалённому mysql серверу, но при этом точно так же, как будто он локальный. Для этого, как показано выше, на сервере с mysql открываем доступ к сокету по сети, а на удалённом сервере создаём локальный unix socket:
# socat UNIX-LISTEN:/run/mysqld/mysqld.sock,fork,reuseaddr,unlink-early,user=mysql,group=mysql,mode=777 \
TCP:172.23.92.42:3307
Получили сокет mysql от удалённого сервера, как будто он локальный. С теми же правами доступа и владельцем.

Таким образом можно создавать очень замысловатые связки. Конечно, в проде такое использовать не имеет смысла. А нужно в основном в момент отладки, или в тестовых окружениях.

Это всего лишь несколько прикладных примеров с socat. Умеет он гораздо больше. Например, отправлять широковещательные сетевые запросы. Возможно, разовью ещё эту тему в отдельных заметках.

#linux #terminal
  • 👍 90
  • 👎 1
More from @srv_admin
  1. Sep 24, 2026Траблшутинг - мастхэв компетенция для инженера В Rebrain траблшутинги проводят уже несколь…
  2. Sep 23, 2026Очередная подборка статей авторов, которые согласились в ней участвовать. Кто не понимает,…
  3. Sep 23, 2026Контейнеры в одном инструменте, виртуалки — в другом, частное облако — вообще отдельная ис…
  4. Sep 23, 2026Расскажу тем, кто не знает, и напомню тем, кто забыл, как я. Не надо в Proxmox в LXC конте…
  5. Sep 22, 2026Недавно случайно заметил любопытную информацию на тему Proxmox VE и новой функциональности…
  6. Sep 22, 2026✔️ Сети для всех — сообщество для тех, кто развивается в сетевом и системном администриров…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →