Как создать сокетный форвардер в качестве сервера?

Вопрос или проблема

Я ищу инструмент, который запускает сокет-сервер и перенаправляет входящие запросы на этот сокет-порт на другой внутренний порт.

Я нашел, что socat может перенаправлять сокет-порты в общем:

socat tcp-l:8080,fork,reuseaddr tcp:127.0.0.1:12345

Это успешно перенаправляет “официальный” порт 8080 на внутренний сокет-порт 12345.

НО: моя проблема в том, что клиенты должны иметь возможность подключаться к порту 8080 даже если внутренний порт 12345 в данный момент недоступен.

Проблема с socat заключается в том, что он, похоже, не создает настоящий сокет-сервер, а просто перенаправляет порт и просто ставит порт в состояние “СЛУШАНИЯ”.

Я ищу инструмент, который говорит клиенту: “Вы успешно подключились, пожалуйста, отправьте мне ваши данные.” И если мой локальный порт 12345 недоступен, клиенты должны получать ошибку при попытке отправить данные.

Таким образом, если мое локальное приложение отключено, клиенты все равно должны иметь возможность установить соединение с этим официальным портом.

Возможно ли это без необходимости писать собственный инструмент?

Вы можете начать с:

socat tcp-l:8080,fork,reuseaddr \
SYSTEM:'nc -z 127.0.0.1 22 >/dev/null && exec nc 127.0.0.1 22 || echo "Ошибка!"'

Таким образом, вместо tcp:127.0.0.1:12345 вы запускаете фрагмент скрипта, который более-менее:

Проверяет, отвечает ли 127.0.0.1 12345
  если да, подключается туда и передает дескрипторы (exec)
  если нет, выводит "Сервис@12345 не работает"
    Опционально: не выходить, а войти в цикл while
      Пытаться подключиться к порту 12345, а затем в конечном итоге подключиться

Для опциональной части просто замените ‘echo “Ошибка!”‘ выше на

{ echo "Какое-то сообщение; Больше команд; }

Я могу помочь, если вам нужна помощь в адаптации этого, просто обновите свой вопрос с информацией, где вы застряли.

ncat поможет вам достичь того, куда вы хотите попасть. Он слушает на порту и принимает пакеты. Посмотрите, например:

 ncat -l localhost 8080

Ответ или решение

Создание сокетного форвардера на сервере: Полное руководство

В эру высоких технологий и постоянного увеличения объемов данных, поддержание стабильных соединений и управление сетевым трафиком становится приоритетом для системных администраторов и сетевых инженеров. Многие задачи, связанные с перенаправлением трафика, могут быть решены с помощью инструментов, таких как socat или ncat. Однако, как вы уже выяснили, эти инструменты могут не всегда удовлетворять специфическим требованиям. В данной статье мы рассмотрим, как создать сокетный форвардер, который позволит клиентам устанавливать соединение с одним портом, даже если внутренний порт недоступен.

Постановка задачи

Вы хотите создать сокетный сервер, который будет слушать на порту 8080 и перенаправлять входящие запросы на внутренний сокетный порт 12345. При этом, если внутренний порт недоступен, клиенты должны получать уведомление об ошибке, а не просто оставаться в ожидании соединения.

Решение с использованием socat

Использование socat имеет свои ограничения, так как он, в первую очередь, предназначен для простого перенаправления трафика. Однако вы можете улучшить его функциональность с помощью оболочки или скрипта. Пример:

socat tcp-l:8080,fork,reuseaddr \
SYSTEM:'nc -z 127.0.0.1 12345 && exec nc 127.0.0.1 12345 || echo "Сервис на порт 12345 недоступен"'

В этом примере:

  • tcp-l:8080 — сервер слушает на порту 8080.
  • fork — создает новый процесс для каждого входящего соединения.
  • reuseaddr — позволяет повторно использовать адрес.
  • SYSTEM — позволяет запускать команду оболочки.

Скрипт проверяет доступность порта 12345. Если он доступен, socat перенаправляет соединение; если нет, выводится сообщение об ошибке.

Дополнительные улучшения

Чтобы клиентский интерфейс был более интерактивным и информативным, вы можете использовать бесконечный цикл. Это позволяет вашему серверу периодически проверять доступность внутреннего порта и немедленно обрабатывать новое соединение, когда порт становится доступным.

socat tcp-l:8080,fork,reuseaddr \
SYSTEM:'while true; do nc -z 127.0.0.1 12345 && exec nc 127.0.0.1 12345 || echo "Сервис на порт 12345 недоступен"; sleep 5; done'

В этом варианте, если порт недоступен, socat будет каждые 5 секунд проверять его доступность. Как только порт станет доступен, соединение будет установлено.

Использование ncat

Альтернативным и, возможно, более простым инструментом для решения данной задачи является ncat. Этот инструмент позволяет настойчиво слушать на порту и обрабатывать подключения таким образом, чтобы вы могли более гибко управлять поведением сервера.

ncat -l 8080 --sh-exec 'bash -c "while true; do nc -z 127.0.0.1 12345 && exec nc 127.0.0.1 12345 || echo \"Сервис на порт 12345 недоступен\"; sleep 5; done"'

Заключение

В этой статье мы рассмотрели несколько способов создания сокетного форвардера, который будет удовлетворять вашим требованиям. Вы можете использовать socat с дополнительными оболочками или обратиться к ncat для более интуитивного управления. Выбор инструмента зависит от ваших предпочтений и архитектуры системы.

Теперь вы способны самостоятельно создать сокетный сервер, который отвечает на запросы клиентов даже в условиях недоступности внутреннего порта. Надеюсь, это руководство будет полезно для профессионалов в области ИТ, стремящихся усовершенствовать управление сетевыми соединениями.

Оцените материал
Добавить комментарий

Капча загружается...