Назад | Перейти на главную страницу

Запретить закрытие перенаправления локального порта SSH

Я запускаю различные службы на виртуальной машине Ubuntu, работающей в Azure, и хотел бы получить доступ к некоторым службам удаленно, даже если порты не открыты для всех. Для этого я создал сценарий, Перенаправление локального порта с использованием SSH.

Обычно это работает, инициируя соединение с удаленным хостом, выполните sleep 10 , и установить соединение на переадресованном порту до завершения команды сна. Это хорошо работает при использовании службы, поддерживающей соединение, например, удаленных общих ресурсов SMB.

Но у меня проблема с доступом к веб-сервисам, так как соединение закрывается через некоторое время - через 10-90 секунд после установления соединения.

Чтобы восстановить соединение, когда оно закрывается, я взломал этот небольшой скрипт на основе этого SO поток.

while true; do { \
    while true; do \
      echo echo ping; sleep 10; \
    done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config  \
             -o ExitOnForwardFailure=yes  sleep 10; echo "$(date) I died"; 
    sleep 1;
done

К сожалению, это "исправление" несколько нестабильно, и соединение довольно часто разрывается, поэтому браузер зависает при каждом пятом запросе. Это работает, но далеко не идеально, поэтому мне нужен лучший подход. Может быть, может быть какой-то скрипт, выполняющий длинный опрос или что-то подобное? Кто-нибудь, кто решил эту проблему?

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

Например. чтобы запустить обратный туннель (и оставить его включенным):

server_behind_fw # autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C

а потом:

your_public_seerver # ssh -p 1234 localhost

отправит вам ssh на server_behind_fw.

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

Полная командная строка

# This forwards all requests to my local 39000 port to port 8080 on the server
LOCAL_PORT=39000
REMOTE_PORT=8080
SERVER=myapp.cloudapp.net
autossh -M20000 -N -L $LOCAL_PORT:$SERVER:$REMOTE_PORT myuser@$SERVER

Это пока что оказалось стабильным по сравнению со сценарием хоккея, который я сколотил выше.

Использование файла конфигурации

Если вы хотите сохранить конфигурацию в файле для каждого сервера, это выглядело бы так

$ HOME / .ssh / config_myapp.cloudapp.net

Host myapp.cloudapp.net
User myuser
LocalForward 127.0.0.1:39000 localhost:8080
ServerAliveInterval 5

Командная строка с использованием файла конфигурации

autossh -M 12345 -N -F $HOME/.ssh/config_myapp.cloudapp.net 192.168.10.2

Вместо того, чтобы возиться со сном и пингом, скажите ssh отправлять пакеты keepalive. Вам нужен вариант ServerAliveInterval. Это говорит ssh отправлять некоторые данные каждые несколько секунд, чтобы сервер (а также любые брандмауэры nat по пути) знал, что соединение все еще открыто, и ваш сеанс не истечет. Это все равно должно быть связано со сценарием, который автоматически переподключится, если соединение не удастся по другим причинам.

Вот пример его настройки: http://embraceubuntu.com/2006/02/03/keeping-ssh-sessions-alive/

Используя -N флаг командной строки для ssh будет поддерживать соединение без необходимости выполнять какую-либо команду, при этом вам не понадобится команда сна.

Дополнительно следует установить ClientAliveInterval и ServerAliveInterval как объяснено в этот ответ.