Я использую SSH-туннель с работы, чтобы обойти различные идиотские брандмауэры (это нормально для моего босса :)). Проблема в том, что через некоторое время соединение ssh обычно зависает, и туннель нарушается.
Если бы я мог хотя бы контролировать туннель автоматически, я мог бы перезапустить туннель, когда он зависает, но я даже не придумал, как это сделать.
Бонусные баллы для того, кто скажет мне, как предотвратить зависание моего ssh-соединения, конечно же!
watch
команду типа:watch -n1 60 echo "wiiiii"
. Туннель не умрет, если сеть не сломана или вы не используете ее.Ответы:
Похоже, вам нужен Autossh . Это будет контролировать ssh-туннель и перезапускать его при необходимости. Мы использовали его в течение нескольких лет, и это, кажется, работает хорошо.
Подробнее о параметре -M здесь
источник
autossh
в ответе?autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 username@myoutsidebox.com
Вы можете заметить, что я настроил это, используя -nNT, который не создает удаленный терминал, чтобы я мог поместить autossh в фоновый режим, и опцию -i для SSH, чтобы использовать файл .pem. Если вы собираетесь постоянно держать соединение открытым, я определенно рекомендую пройти дополнительную настройку.-M
параметр: bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162Все брандмауэры с сохранением состояния забывают о соединении после того, как некоторое время не видели пакета для этого соединения (чтобы таблицы состояний не заполнялись соединениями, где оба конца погибли, не закрывая соединение). Большинство реализаций TCP отправят пакет keepalive через долгое время, не услышав об этом с другой стороны (обычно 2 часа). Однако, если существует межсетевой экран с отслеживанием состояния, который забывает о соединении до того, как пакеты поддержки активности могут быть отправлены, долгоживущее, но простое соединение прекратит работу.
Если дело обстоит так, решение состоит в том, чтобы препятствовать тому, чтобы соединение стало бездействующим. OpenSSH имеет опцию ServerAliveInterval, которую можно использовать для предотвращения слишком долгого простоя соединения (в качестве бонуса он обнаружит, когда партнер умер раньше, даже если соединение простаивает).
источник
На вашем компьютере Mac или Linux сконфигурируйте ваш ssh, поддерживайте работу сервера ssh каждые 3 минуты. Откройте терминал и отправьте свой невидимый .ssh в свой дом:
затем создайте файл конфигурации в 1 строку с:
Вы также должны добавить:
по умолчанию установлено значение 3, поэтому ServerAliveInterval 180 прекратит отправку через 9 минут (3 из 3-минутного интервала, указанного в ServerAliveInterval).
источник
ServerAliveInterval 180
дает нам 6 минут? интуиция заставляет меня попробовать это:180/60 == 3
. Итак, работает лиServerAliveInterval
кратно 30 секунд?Я использовал следующий скрипт Bash, чтобы продолжать порождать новые ssh-туннели, когда предыдущий умирает. Использование скрипта удобно, когда вы не хотите или не можете установить дополнительные пакеты или использовать компилятор.
Обратите внимание, что для этого требуется ключевой файл для автоматического установления соединения, но это также относится и к autossh.
источник
Systemd идеально подходит для этого.
Создайте служебный файл,
/etc/systemd/system/sshtunnel.service
содержащий:(Измените команду ssh для соответствия)
sshtunnel
поэтому убедитесь, что пользователь существует первымsystemctl enable sshtunnel
чтобы установить его во время загрузкиsystemctl start sshtunnel
начать немедленноОбновление от января 2018 года : некоторые дистрибутивы (например, Fedora 27) могут использовать политику SELinux для предотвращения использования SSH при инициализации systemd, и в этом случае необходимо будет создать собственную политику для предоставления необходимых исключений.
источник
systemd
системы. Если использовать его,Restart=on-failure
то ручное уничтожение SSH-клиента не приведет к перезапуску systemd в качестве SSH-клиента с успешным завершением.ExecStart
например, для построенияssh
списка аргументов, выполните базовые проверки и т. Д., А затем вызовите его из скрипта следующим образомexec /bin/ssh -N ...
. Вот моя команда:exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
гдеTUNNEL_INLET="127.0.0.1:3307"
иTUNNEL_OUTLET="127.0.0.1:3306"
Мне кажется, что вы все неправильно истолковали ServerAliveCountMax. Насколько я понимаю, это количество сообщений сервера, которые могут остаться без ответа без разрыва соединения. Таким образом, в случаях, которые мы обсуждаем здесь, установка высокого значения просто гарантирует, что зависшее соединение не будет обнаружено и прервано!
Простая установка ServerAliveInterval должна быть достаточной для решения проблемы с брандмауэром, забывшим о соединении, а оставление ServerAliveCountMax на низком уровне позволит исходному концу заметить сбой и завершится, если соединение все равно не удастся.
Вы хотите, чтобы: 1) чтобы соединение оставалось открытым постоянно при нормальных обстоятельствах, 2) для обнаружения сбоя соединения и выхода исходящей стороны при сбое, и 3) для повторного запуска команды ssh каждый раз, когда оно exits (то, как вы это делаете, очень зависит от платформы, сценарий «while true», предложенный Jawa, является одним из способов, на OS XI фактически настраивает элемент launchd).
источник
Всегда используйте
ServerAliveInterval
опцию SSH в случае, если проблемы с туннелем генерируются сеансами NAT с истекшим сроком действия.Всегда используйте метод возрождения в случае, если подключение полностью отключается, у вас есть по крайней мере три варианта:
while true do ssh ...; sleep 5; done
) не удаляет команду sleep,ssh
может быстро завершиться сбоем, и вы возродите слишком много процессов/etc/inittab
Чтобы получить доступ к коробке, поставляемой и установленной в другой стране, за NAT, без переадресации портов на коробку, вы можете настроить его для создания туннеля ssh обратно к вам:Скрипт upstart в Ubuntu, где
/etc/inittab
он недоступен:или всегда используйте оба метода.
источник
Я решил эту проблему с этим:
редактировать
И добавить
Согласно справочной странице для ssh_config:
источник
ExitOnForwardFailure yes
является хорошим дополнением к другим предложениям. Если он подключается, но не может установить переадресацию порта, он так же бесполезен для вас, как если бы он вообще не подключался.источник
Мне нужно было поддерживать SSH-туннель в долгосрочной перспективе. Мое решение запускалось с сервера Linux, и это всего лишь небольшая программа на C, которая запускает ssh с использованием аутентификации на основе ключей.
Я не уверен насчет повешения, но у меня туннели умирают из-за тайм-аутов.
Я хотел бы предоставить код для респауна, но я не могу найти его прямо сейчас.
источник
в то время как есть такие инструменты, как autossh, которые помогают перезапустить сессию ssh ... что я считаю действительно полезным, это запустить команду 'screen'. Это позволяет вам возобновить сеансы SSH даже после отключения. Особенно полезно, если ваше соединение не так надежно, как должно быть.
... не забудьте отметить, что это «правильный» ответ, если он поможет вам k! ;-)
источник
Немного взломать, но мне нравится использовать экран, чтобы сохранить это. В настоящее время у меня есть дистанционный форвард, который работает уже несколько недель.
Пример, начиная локально:
Когда удаленная пересылка применена, и у вас есть оболочка на удаленном компьютере:
Теперь у вас есть непрерывный пульт дистанционного пересылки. Хитрость заключается в том, чтобы запустить экран на обоих концах
источник
Недавно у меня возникла эта проблема, потому что эти решения требуют повторного ввода пароля каждый раз, если вы используете пароль для входа в систему, я использовал sshpass в цикле вместе с текстовым приглашением, чтобы избежать ввода пароля в командный файл.
Я подумал, что поделюсь своим решением по этой теме на случай, если у кого-то возникнет та же проблема:
источник
У меня были похожие проблемы с моим предыдущим провайдером. Для меня это было то же самое с любым TCP-соединением, посещением веб-сайтов или отправкой почты.
Решением было настроить VPN-соединение по UDP (я использовал OpenVPN). Эта связь была более терпимой к тому, что вызвало разъединения. Затем вы можете запустить любой сервис через это соединение.
Все еще могут быть проблемы с соединением, но, так как туннель будет более терпимым, любой сеанс ssh будет ощущать кратковременную задержку, а не отключение.
Для этого вам потребуется онлайн-сервис VPN, который вы можете настроить на своем собственном сервере.
источник
Поскольку
autossh
это не отвечает нашим потребностям (оно существует с ошибкой, если он не может подключиться к серверу с первой попытки), мы написали приложение для чистого bash: https://github.com/aktos-io/link- с серверомПо умолчанию он создает обратный туннель для порта sshd (22) NODE на сервере. Если вам нужно выполнить какие-либо другие действия (например, переадресация дополнительных портов, отправка писем по соединению и т. Д.), Вы можете разместить свои скрипты
on-connect
иon-disconnect
папки.источник