Обложка канала

ServerAdmin.ru

12437 @srv_admin

Авторская информация о системном администрировании.

ServerAdmin.ru

3 года назад
Открыть в
​​В копилку полезных админских утилит Unix с примерами — socat. В общем случае это утилита для организации двунаправленных потоков передачи данных. При этом поддерживается большое количество типов потоков: файлы, пайпы, сокеты (unix, сетевые), различные устройства, в том числе консольного ввода. Это делает утилиту socat применимой в очень широком диапазоне ситуаций. Самый простой пример использования socat аналогично telnet. Передаём данные с консоли ( - ) на какой-то сервис (smtp.yandex.ru:25). Например, почтовый сервер: # socat - TCP4:smtp.yandex.ru:25 Попробуем пообщаться: helo serveradmin.ru mail from:<[email protected]> Получаем ошибку: 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