Добавить в корзинуПозвонить
Найти в Дзене

socat - nc для сетей, который вы заслужили

netcat (nc) знают многие. Но когда задачи становятся сложнее - нужен SSL, нужен форк на несколько соединений, нужна привязка к конкретному интерфейсу - nc пасует. Здесь на сцену выходит socat. Это как прокаченный nc. Он умеет соединять что угодно с чем угодно: файл с сокетом, TCP с SSL, Unix-сокет с UDP, и даже выполнять команду при подключении. ➤ Вариант 1 (Проброс трафика с одного порта на другой): классический use case для обхода фаерволов.# Слушаем на 8080, пересылаем на внутренний сервер 3000 socat TCP-LISTEN:8080,fork TCP:localhost:3000 # fork — позволяет обрабатывать несколько соединений ➤ Вариант 2 (Туннель с SSL-терминацией): нужен HTTPS-сервер, а поднимать nginx ради одного эндпоинта — жирно.# Принимаем HTTPS на 443, внутри отдаём на HTTP 8080 socat OPENSSL-LISTEN:443,cert=server.pem,verify=0,fork TCP:localhost:8080 ➤ Вариант 3 (Работа с Unix-сокетами): контейнеры и демоны часто общаются через сокеты, отлаживать их неудобно.# Подключиться к сокету Docker и отправит

socat - nc для сетей, который вы заслужили

netcat (nc) знают многие. Но когда задачи становятся сложнее - нужен SSL, нужен форк на несколько соединений, нужна привязка к конкретному интерфейсу - nc пасует. Здесь на сцену выходит socat.

Это как прокаченный nc. Он умеет соединять что угодно с чем угодно: файл с сокетом, TCP с SSL, Unix-сокет с UDP, и даже выполнять команду при подключении.

➤ Вариант 1 (Проброс трафика с одного порта на другой): классический use case для обхода фаерволов.# Слушаем на 8080, пересылаем на внутренний сервер 3000

socat TCP-LISTEN:8080,fork TCP:localhost:3000

# fork — позволяет обрабатывать несколько соединений

➤ Вариант 2 (Туннель с SSL-терминацией): нужен HTTPS-сервер, а поднимать nginx ради одного эндпоинта — жирно.# Принимаем HTTPS на 443, внутри отдаём на HTTP 8080

socat OPENSSL-LISTEN:443,cert=server.pem,verify=0,fork TCP:localhost:8080

➤ Вариант 3 (Работа с Unix-сокетами): контейнеры и демоны часто общаются через сокеты, отлаживать их неудобно.# Подключиться к сокету Docker и отправить запрос

echo 'GET /info HTTP/1.0' | socat - UNIX-CONNECT:/var/run/docker.sock

# Проксировать Unix-сокет в TCP для внешнего доступа

socat TCP-LISTEN:9999,fork UNIX-CONNECT:/var/run/docker.sock

➤ Вариант 4 (Перенаправление ввода-вывода в сеть): передать вывод команды или файл по сети без ssh.# На стороне получателя: слушаем, сохраняем в файл

socat TCP-LISTEN:1234,fork OPEN:backup.tar.gz,create,append

# На стороне отправителя: читаем файл, шлём

socat OPEN:backup.tar.gz TCP:192.168.1.100:1234

➤ Вариант 5 (Отладка и перехват трафика): посмотреть, что реально передаётся между клиентом и сервером.# Эхо-сервер для отладки (возвращает то же, что получил)

socat -v TCP-LISTEN:1234,fork STDOUT

# -v выводит весь трафик в stderr

# Можно записывать в файл: 2>traffic.log

➤ Вариант 6 (Выполнение команд по сети): организовать примитивное удалённое управление.# На сервере: при подключении выполняем скрипт

socat TCP-LISTEN:1234,fork EXEC:/bin/script.sh

# На клиенте: подключаемся, получаем результат

socat - TCP:server:1234

Главный минус socat - синтаксис. Он страшный. Но если освоить базовые паттерны (`TCP-LISTEN`, OPENSSL, `EXEC`), он закрывает сценарии, для которых иначе пришлось бы писать отдельный сервис.

P.S. Самый недооценённый режим: socat -T 60 - таймаут для безответных соединений. Спасает от подвисших сессий.

👉🏻 Я в Telegram - https://dzen.ru/id/686102a27e39653c3429f77f

👉🏻 Я в VK - vk.com/helcode

👉🏻 Я на Boosty - boosty.to/helcode (тут посты более подробные)