Вопрос или проблема
Я ищу инструмент, который запускает сокет-сервер и перенаправляет входящие запросы на этот сокет-порт на другой внутренний порт.
Я нашел, что 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
для более интуитивного управления. Выбор инструмента зависит от ваших предпочтений и архитектуры системы.
Теперь вы способны самостоятельно создать сокетный сервер, который отвечает на запросы клиентов даже в условиях недоступности внутреннего порта. Надеюсь, это руководство будет полезно для профессионалов в области ИТ, стремящихся усовершенствовать управление сетевыми соединениями.