autossh не убивает ssh при ссылке вниз

10

Я запустил свой автошоу со временем опроса 30 с:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

И это работает нормально:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Но если я физически отсоединяю сетевой кабель, то есть туннель больше не может работать, autossh не убивает демон ssh. Почему? Я понимаю, что autossh не может ничего сделать, если ссылка не работает, но, по моему мнению, он должен попытаться сделать следующее:

  1. Проверьте дочерний процесс ssh ( check on child ...)
  2. Проверьте дальний конец !!! (пингоподобная операция через туннель)
  3. Поймите, что туннель не работает
  4. Остановить процесс ssh
  5. Попробуйте снова создать туннель
  6. Поймите, что это не работает, и установите (экспоненциально увеличивающийся?) Таймер, чтобы проверить снова скоро

Вот почему я запускаю autossh: если что-то происходит с туннелем (будь то программная или аппаратная проблема), он должен попытаться перезапустить его. Вместо этого он просто ждет, когда процесс ssh умрет. Разве он не должен пытаться перезапустить его, даже если нет надежды на восстановление соединения?

Что за проверка делает autossh? Просто убедитесь, что ssh запущен и работает? Разве это не делает какую-либо проверку дальнего конца?

редактировать

По запросу я добавляю соответствующую часть конфигурации ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes
dangonfast
источник
как насчет попытки сократить время ожидания?
Николайдис Фотис,
Некоторое время мы использовали autossh, но он был слишком ненадежным для нестабильных соединений, особенно в сочетании с переадресацией портов. Сейчас мы используем OpenVPN и очень довольны этим.
Нильс Тёдтманн
@NikolaidisFotis: тайм-аут в порядке. Это ... тайм-аут. Но он не работает правильно (imho) всякий раз, когда истекает время ожидания, а именно: проверка дальнего конца !
dangonfast
@ NilsToedtmann: спасибо, я попробую. Это легко реализовать? Есть ли у вас ссылка на хороший Howto?
dangonfast
OpenVPN довольно прост, мы просто «apt-get install» установили его и начали с конфигураций по умолчанию для сервера или клиента, используя dev tunоба параметра и настройки remoteв конфигурации клиента. Единственный раздражающий бит - это управление сертификатами. Мы используем CA «easy-rsa», который поставляется с OpenVPN. Как только у вас есть сертификаты, все остальное легко.
Нильс Тёдтманн

Ответы:

11

Но если я физически отсоединяю сетевой кабель, то есть туннель больше не может работать, autossh не убивает демон ssh. Почему?

autossh запускается на вашем клиентском компьютере, поэтому он не может напрямую уничтожить процесс ssh-демона на сервере. Однако вы можете указать ненулевое значение для ClientAliveIntervalin /etc/ssh/sshd_configна сервере (см. man sshd_config) И перезапустить службу sshd на сервере, чтобы применить изменение конфигурации. Затем в случае отключения сети процесс ssh-демона будет убит через ClientAliveInterval * ClientAliveCountMaxнесколько секунд (но не autossh).

Теперь, если вы хотели спросить "Почему autossh не убивает процесс ssh-клиента?" Вы указали -M 0. Со страницы руководства autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit,

Вместо того, чтобы использовать autossh для мониторинга соединения, вы ждете выхода ssh через тайм-аут ServerAliveCountInterval * ServerAliveCountMaxсекунд. Вы запросили 60 проверок работоспособности сервера до выхода из ssh, с 60-секундным интервалом, отделяющим последовательные проверки, поэтому вы будете ждать час, прежде чем выйдет ваш ssh-клиент.

Вы также можете рассмотреть возможность использования ExitOnForwardFailureопции на стороне клиента (см. man ssh_config), Так что ssh завершит работу, если не сможет установить туннель, и затем autossh может попытаться снова запустить ssh.

Джеймс У
источник
Спасибо, это имеет смысл. Я действительно имел в виду «клиентский процесс», а не серверный процесс.
dangonfast
И после перечитывания man-страницы autossh теперь я помню, почему я установил -M 0: использовать порт мониторинга нелегко, и это косвенно обескураживает: во многих отношениях это может быть лучшим решением, чем порт мониторинга
dangonfast