socat в Linux системах

socat — утилита в Linux системах, позволяющая устанавливать TCP соединения между машинами. При этом локальная машина может видеть соединение как локальное фактически обращаясь по сети к другому серверу.

socat часто используется при настройке кластеров и горизонтальном масштабировании.

 

socat примеры использования утилиты

Запускать socat можно напрямую из консоли оставляя выполнение в фоне или же использовать скрипты автозапуска. Фактически происходит проброс сокета с хоста.

Для разового использования запуск в фоне вполне подходит.

 

Прежде всего пакет нужно установить

apt install socat

 

Для примера рассмотрим Desktop систему с веб-сервером apache2. Создана единственная страница, при обращении к localhost возникает сообщение «hi there»

socat примеры

 

Останавливаем веб-сервер

/etc/init.d/apache2 stop

[ 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 &

 

ps aux | grep socat

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

linux socat

 

Сейчас видно стандартную заглушку веб-сервера Nginx, который используется на сервере 123.123.123.123

 

Socat используется для перенаправления трафика прозрачно для серверов на которых запускается. На Desktop системе в примере все другое ПО будет обращаться к порту 80 и работать в веб-сервером не имея представления о том, что он запущен на удаленном сервере.

 

Горизонтальное масштабирование — процесс распределения нагрузки на несколько машин путем выбора подходящего архитектурного решения. Для масштабирования часто используется socat.

Например, через него настраивается работа MySQL на машинах с приложением и веб-сервером.

 

Запускается socat через runit или supervisor. Это позволяет вновь стартовать процесс если он завершился — например, по причине перезагрузки.

 

Читайте про масштабирование приложений.