6

Использование VPS для переадресации портов за NAT:

for((;;)) { ssh -R 2222:127.0.0.1:22 vi@vi-server.org; sleep 10; }

Когда связь как-то нарушена и она восстанавливается.

Warning: remote port forwarding failed for listen port 2222
Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686

Я печатаю:

vi@vi-server:~$ killall sshd
Connection to vi-server.org closed by remote host.
Connection to vi-server.org closed.
Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686
vi@vi-server:~$ 

Сейчас все хорошо.

Как проще сделать это автоматически?

3 ответа3

8

Я думаю, что вы приняли неправильную сторону: в вашем случае, sshd (на стороне сервера) , вероятно, не дает сбоев и не имеет устаревших сессий, поэтому его уничтожение не должно помочь вам, кроме побочного эффекта грубой остановки любого подключенного соединения ssh клиента. ,

Это клиент ssh , который не завершает соединение при сбое построения механизма перенаправления портов. И это поведение не ошибка.

Вам нужно взглянуть на параметр ExitOnForwardFailure в руководстве ssh.

Ваш сценарий будет:

  for((;;)) { ssh -R 2222:127.0.0.1:22 vi@vi-server.org -o ExitOnForwardFailure=yes; sleep 10; }

Кроме того, вы можете захотеть ужесточить ServerAliveInterval и ServerAliveCountMax чтобы клиент обнаруживал более быстрые отключения . (И вы должны убедиться , что TCPKeepAlive on который является значением по умолчанию). Обратите внимание, что autossh не поможет вам больше, если вы установите эти параметры.

2

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

Я все еще хочу поделиться своим собственным маленьким скриптом bash, делающим то же самое, и его тривиально настроить.

#!/bin/bash

while true
do
  START=$(date +%s)
  ssh -NR rport:host:lport -o ServerAliveInterval=10 -o ExitOnForwardFailure=yes user@host
  END=$(date +%s)
  DIFF=$(( $END - $START ))
  if (( $DIFF < 3 ))
  then
    sleep 60
  fi
done

Если переадресация повторяется неудачно, достаточно повторить попытку один раз в минуту, если после разрыва соединения какое-то время будет разорвано, попытка будет повторена немедленно.

Я использую его на archlinux с systemd (написал небольшой .service-файл), и он работает как шарм.

1

Похоже, AutoSSH - правильная вещь для этого.

Autossh - это программа, которая запускает копию SSH и контролирует ее, перезапуская по мере необходимости, если она умирает или прекращает пропуск трафика. Оригинальная идея и механизм были вдохновлены RSTunnel (Reliable SSH Tunnel).

В версии 1.2 метод изменился: autossh начал использовать SSH для создания цикла пересылок SSH (один с локального компьютера на удаленный и один с удаленного на локальный), а затем отправлять тестовые данные, которые он ожидает получить обратно , (Идея была благодаря Терренсу Мартину.)

В версии 1.3 был добавлен новый метод (спасибо Рону Йорстону): для удаленной службы эха можно указать порт, который будет передавать тестовые данные. Это позволяет избежать перегрузки и ухудшения ситуации, когда все номера портов на удаленном компьютере не конфликтуют. Метод зацикливания пересылок остается доступным для ситуаций, когда использование эхо-службы может быть невозможно.

Характеристики

  • autossh - это программа, которая запускает копию ssh и отслеживает ее, при необходимости перезапуская, если она умирает или прекращает пропуск трафика. Идея взята из rstunnel (Reliable SSH Tunnel), но реализована на C.
  • По мнению автора, это не так сложно, как rstunnel, чтобы добраться до работы.
  • Мониторинг соединения с использованием петли переадресации портов или удаленного эхо-сервиса.
  • Отменяет частоту попыток подключения при возникновении быстрых сбоев, например, при отказе подключения.
  • Скомпилировано и протестировано на OpenBSD, Linux, Solaris, Mac OS X, Cygwin и AIX; должен работать на других BSD.
  • Freeware.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .