Могу ли я сделать так, чтобы SSH завершался с ошибкой при сбое переадресации порта?

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

Если я выполняю удаленное перенаправление порта, например, -R 3690:localhost:3690, когда уже существует привязка на порту на удаленном хосте, я получаю это предупреждение:

Warning: remote port forwarding failed for listen port 3690

Есть ли способ заставить ssh завершаться с ошибкой (т.е. выходить с ненулевым кодом возврата), вместо того чтобы просто выводить предупреждение?

Выполните

ssh -o ExitOnForwardFailure=yes ...

или добавьте в

ExitOnForwardFailure yes

в файл ~/.ssh/config. Подробности смотрите в man ssh_config.

Я использую скрипт bash на целевом хосте, чтобы убедиться, что перенаправление открыто правильно. SSH-соединение выполнит этот скрипт и завершится, если возникнет проблема с перенаправлением порта, например:

скрипт на стороне клиента: (использует .ssh/config для настроек перенаправления порта)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

скрипт на стороне сервера (bin/sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Может быть, даже выполнить скрипт на стороне клиента в screen с параметром -dmS

Просто пытаюсь улучшить принятый ответ.

Действительно, ответ заключается в том, чтобы использовать опцию ExitOnForwardFailure:

ssh -o ExitOnForwardFailure=yes ...

Но будьте осторожны! При указании перенаправления порта как <port>:<ip>:<port> ssh попытается привязаться к IPv6 (::1) и IPv4 (127.0.0.1), если одно из них удастся, оно не выйдет.

В большинстве случаев вы захотите, чтобы ssh завершалось, если привязка на IPv4 не удалась. В этом случае укажите это явно, используя 0.0.0.0 или 127.0.0.1, например:

ssh -o ExitOnForwardFailure=yes -L 0.0.0.0:3690:localhost:3690 ...

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

Вопрос о том, как заставить SSH завершиться с ошибкой в случае сбоя перенаправления портов, является актуальной задачей в мире IT, особенно при сложных системах, где важна надежность соединений. Пример из вопроса, в котором рассматривается удаленное перенаправление порта с параметрами -R 3690:localhost:3690, демонстрирует распространенный сценарий, когда попытка связать порт оказывается неудачной из-за его предварительной занятости на удаленном хосте.

Теория

SSH (Secure Shell) — это протокол, обеспечивающий безопасное администрирование сетевых устройств и удалённых систем. Перенаправление портов (Port Forwarding) — одна из его ключевых функций, позволяющая перенаправлять трафик через защищенное SSH-соединение. Эта функция широко используется в случаях, когда доступ к определенному ресурсу ограничен из-за сетевых политик или особенностей маршрутизации.

Проблема заключается в том, что при неудачном прецеденте перенаправления порта SSH выдаёт только предупреждение, а не завершает соединение ошибкой. Настройка ExitOnForwardFailure=yes в SSH позволяет заставить процесс завершаться с ненулевым кодом возврата в случае сбоя перенаправления. Это критично в автоматизированных системах и сценариях, где успешное соединение напрямую влияет на выполнение последовательных операций.

Пример

Для достижения необходимой функциональности можно воспользоваться опцией ExitOnForwardFailure, которую следует включить как напрямую в командной строке SSH, так и через конфигурационный файл ~/.ssh/config.

1. Командная строка

Можно включить опцию при вызове SSH:

ssh -o ExitOnForwardFailure=yes -R 3690:localhost:3690 user@server

2. Конфигурационный файл SSH

Если эта настройка должна применяться ко всем подключениям, её можно добавить в файл конфигурации SSH. В конфигурации можно настроить следующую секцию:

Host *
    ExitOnForwardFailure yes

Применение

В итоге, настройка ExitOnForwardFailure в SSH обеспечивает завершение с ошибкой в случае отказа установить перенаправление порта. Хотя она решает проблему отказа, стоит учитывать несколько важных моментов:

  1. IPv4 и IPv6: При попытке привязки к порту, SSH по умолчанию может пытаться сделать это как для IPv4, так и для IPv6. Если хотя бы одна из попыток будет успешной, SSH все равно установит соединение. Для строгого контроля процесса можно указать явный IP-адрес, например, 127.0.0.1 или 0.0.0.0 для IPv4.

  2. Автоматизация и скрипты: При использовании автоматизации и скриптов, следует включить проверку кода возврата SSH для своевременного обнаружения ошибок и их последующей обработки. Это послужит более надежной структурой контроля ошибок, чем простое ожидание завершения соединения.

  3. Мониторинг и Логи: Для более детальной диагностики проблемы с SSH лучше настроить более подробное логирование сеансов, что позволяет быстро выявить и исправить проблему.

В завершение, использование ExitOnForwardFailure наряду с правильной настройкой сети и порта на системе предоставляет дополнительный уровень надежности и безопасности в управлении удаленными подключениями через SSH. Такой подход обеспечивает стабильность и предсказуемость системы, что особенно важно в корпоративных структурах и высоконагруженных сервисах.

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

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